【发布时间】:2018-11-01 13:52:58
【问题描述】:
我试图在 NASM 中的各种寄存器中打印值,但在调用执行 printf 调用的宏之前,首先将寄存器的值传递给内存变量。它没有打印寄存器中的实际值,但我无法确定原因。
extern printf
%macro OUTPUTREGISTERS 2
section .data
prmVal1 dq %1, 10, 0
prmVal2 dq %2, 10, 0
section .text
mov rax, 2
mov rdi, reg
mov rsi, prmVal1
mov rdx, prmVal2
call printf
%endmacro
section .data
reg db "%s %d" ,10, 0
regValue dq 0
regValue2 dq 0
section .text
global main
main:
push rbp
mov rbp, rsp
mov rax, 844
mov rdi, 9393
mov [regValue], rdi
OUTPUTREGISTERS 'RDI', regValue
mov rsp,rbp
pop rbp
mov rax, 60
xor rdi, rdi
syscall
我希望它打印 RDI 9393,但它打印的是:RDI 6293699
【问题讨论】:
-
好像你才刚开始学习汇编(从你自己调试的技能来看),所以我希望你给你一个建议......首先避免使用宏,没有什么好的新 asm 程序员的宏使用,但通常会发生很多不好的事情,并且它们使调试变得更加困难(您编写该宏的方式,它不会按预期工作,总体而言,通过多次注入污染最终机器代码非常难看那个废话)。第二个建议是使用调试器检查寄存器中的值。调试输出要复杂得多,即使你知道 asm。