使用 printf 在程序集 NASM 中打印一个数字
Printing a number in assembly NASM using printf
一段时间以来,我一直在努力让它打印 12345。任何人都可以提示我应该做什么吗?它将打印三行文本,然后在第四行打印 "age",我猜这是第 2 行堆栈中的残余。
bits 64
global main
extern printf
section .text
main:
; function setup
push rbp
mov rbp, rsp
sub rsp, 32
;
lea rdi, [rel message]
mov al, 0
call printf
;above code correctly prints message
;where the issue lies
push rbp
mov rbp, rsp
;sub rsp, 32
mov rax, 12345
;push rax
mov al,0
call printf
; function return
mov eax, 0
add rsp, 32
pop rbp
ret
section .data
message: db 'Lab 3 - Modified Hello program',0x0D,0x0a,'COSC2425 - Pentium assembly language',0x0D,0x0a,'Processed with NASM and GNU gcc',0x0D,0x0a
count dq 12345
显然你甚至不知道 printf
是如何工作的,这使得它很难从汇编中调用它。
要打印一个数字,printf
需要两个参数,一个格式字符串和要打印的数字。示例:printf("%d\n", 12345)
.
现在要将其转换为程序集,您显然需要声明该格式字符串,然后使用适当的约定传递两个参数。
由于您似乎正在使用 sysv abi,这意味着前两个参数分别进入 rdi
和 rsi
。您似乎已经知道必须将 al
归零以指示未使用 SSE 寄存器。因此,相关部分可能如下所示:
lea rdi, [rel fmt]
mov rsi, 12345 ; or mov rsi, [count]
mov al, 0
call printf
...
fmt: db "%d", 0x0a, 0
一段时间以来,我一直在努力让它打印 12345。任何人都可以提示我应该做什么吗?它将打印三行文本,然后在第四行打印 "age",我猜这是第 2 行堆栈中的残余。
bits 64
global main
extern printf
section .text
main:
; function setup
push rbp
mov rbp, rsp
sub rsp, 32
;
lea rdi, [rel message]
mov al, 0
call printf
;above code correctly prints message
;where the issue lies
push rbp
mov rbp, rsp
;sub rsp, 32
mov rax, 12345
;push rax
mov al,0
call printf
; function return
mov eax, 0
add rsp, 32
pop rbp
ret
section .data
message: db 'Lab 3 - Modified Hello program',0x0D,0x0a,'COSC2425 - Pentium assembly language',0x0D,0x0a,'Processed with NASM and GNU gcc',0x0D,0x0a
count dq 12345
显然你甚至不知道 printf
是如何工作的,这使得它很难从汇编中调用它。
要打印一个数字,printf
需要两个参数,一个格式字符串和要打印的数字。示例:printf("%d\n", 12345)
.
现在要将其转换为程序集,您显然需要声明该格式字符串,然后使用适当的约定传递两个参数。
由于您似乎正在使用 sysv abi,这意味着前两个参数分别进入 rdi
和 rsi
。您似乎已经知道必须将 al
归零以指示未使用 SSE 寄存器。因此,相关部分可能如下所示:
lea rdi, [rel fmt]
mov rsi, 12345 ; or mov rsi, [count]
mov al, 0
call printf
...
fmt: db "%d", 0x0a, 0