NASM 从寄存器移动到内存

NASM mov from register to memory

我知道有很多参考资料都在谈论 NASM 和 mov 但要么我遗漏了一些基本的东西,要么人们需要编写更好的帮助指南!

SECTION .data
    fmtStart:       db "Enter two numbers in format '# #'", 10, 0
    fmtTest:        db "sum: %d", 10, 0
    input:          db "%d %d", 0
SECTION .bss                ; BSS, uninitialized variables
    int1:       resd 1
    int2:       resd 1
    sum:        resd 1
SECTION .text               ; Code section.
    global main             ; the standard gcc entry point
    main:                   ; the program label for the entry point
    push ebp            ; set up stack frame
    mov ebp,esp

    ;; Get the data
    push dword fmtStart
    call printf
    add esp, 4

    push dword int2
    push dword int1
    push dword input
    call scanf
    add esp, 12

        ;; Do calculations
        ;; Add
            xor eax, eax
            mov eax, [int1]
            add eax, [int2]
            mov [sum], eax
        push dword sum
        push dword fmtTest
        call printf
        add esp, 24

    mov esp, ebp    ; take down stack frame
    pop ebp         ; same as "leave" op

    mov eax,0       ; normal, no error, return value
    ret                 ; return

我得到:

以“# #”格式输入两个数字

2 3

总数:4247592

当我用我的计算器将 2 和 3 相加时,这不是我得到的结果,但也许这只是我。

我对代码的理解如下:数据部分声明了初始化为stuff的变量,在本例中是我的格式化字符串; bss 部分用于未初始化的变量,在本例中是我的输入变量和总和变量;文本部分是代码所在的地方;我将 main 声明为 gcc 的入口点;我提示用户输入两个数字;我用异或将 eax 清零;将 int1 的值移动到 eax;将int2的值加到eax中;将 eax 中的内容移动为 sum 的值;将其与格式化字符串一起压入堆栈;调用 printf 来显示内容;结束程序。

--编辑--

需要说明的是,要么 add 不起作用,要么 mov 不起作用。似乎 add 应该可以工作,所以我假设它是 mov。我不明白 mov [var], register 有什么问题,但显然有些地方不对!

这是问题所在:

    push dword sum
    push dword fmtTest
    call printf

printf,与 scanf 不同,按值获取其参数(在格式之后),而在您的代码中 sum 地址 的内存位置。只是做:

    push [sum]
    push fmtTest
    call printf

(顺便说一句,mov eax,[int1] 之前的 xor eax,eax 没用,因为你是在立即重写寄存器的内容)