【问题标题】:Why can't I print the value in register in NASM?为什么我不能在 NASM 中打印寄存器中的值?
【发布时间】: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。

标签: assembly nasm


【解决方案1】:

它打印的是 prmVal2 的地址而不是它的值。但是如果你修复它,它仍然不起作用,因为 prmVal2 包含 regValue 的地址,而不是它的值。

我同意 @Ped7g 的建议,即在您有能力识别此类问题之前避免使用宏,因为它们会使此类问题更加模糊。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多