首页 文章

NASM从寄存器移动到内存

提问于
浏览
0

我知道那里有很多关于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中的内容移动为sum的值;用格式化的字符串将其推入堆栈;调用printf来显示内容;结束该计划 .

  • 编辑 -

要清楚,要么添加isn 't working or mov isn' t工作 . 似乎添加应该工作所以我'm assuming it'的mov . 我不明白 mov [var], register 会有什么不对,但显然有些不对劲!

1 回答

  • 1

    这是问题所在:

    push dword sum
        push dword fmtTest
        call printf
    

    printf ,与 scanf 不同,它通过值获取其参数(格式之后),而在您的代码中 sum 是内存位置的地址 . 做就是了:

    push [sum]
        push fmtTest
        call printf
    

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

相关问题