NASM从寄存器移动到内存

时间:2015-01-24 00:51:59

标签: windows gcc assembly nasm

我知道那里有很多关于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部分用于未初始化的变量,在本例中是我的输入变量和sum变量;文本部分是代码所在的部分;我声明main是gcc的入口点;我提示用户输入两个数字;我用xor将eax归零;将int1的值移动到eax;将int2的值添加到eax;将eax中的内容移动为和的价值;用格式化的字符串将其推入堆栈;调用printf来显示内容;结束该计划。

- 编辑 -

要清楚,要么添加不工作,要么移动不起作用。似乎添加应该正常工作,所以我假设它是mov。我不明白mov [var], register会有什么不对,但显然有些事情是对的!

1 个答案:

答案 0 :(得分:1)

问题在于:

    push dword sum
    push dword fmtTest
    call printf

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

    push [sum]
    push fmtTest
    call printf

(顺便说一下,xor eax,eax之前的mov eax,[int1]是没用的,因为你马上重写了寄存器的内容)