【问题标题】:NASM mov from register to memoryNASM 从寄存器移动到内存
【发布时间】:2015-01-24 00:51:58
【问题描述】:

我知道有很多关于 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 相加时,这不是我得到的,也许这只是我。

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

--编辑--

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

【问题讨论】:

  • 这是您需要使用调试器的地方。 sum1 和 sum2 的值是否设置不正确?由于某种原因,添加是否正常工作?还是答案正确但显示不正确? (我认为问题在于push dword sum 正在推送变量的地址而不是其值。)
  • 打印 int1 和 int2 显示正确的值。我让程序立即打印 eax 中的值,但现在我想使用变量。如果我在添加后打印 eax 它显示正确的值,那么问题肯定是转移到 var
  • 不,问题出在push dword sum。试试push dword [sum]
  • 是的,好吧,我很傻。我花了很长时间弄乱东西,我只需要两个小方括号!

标签: windows gcc assembly nasm


【解决方案1】:

问题来了:

    push dword sum
    push dword fmtTest
    call printf

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

    push [sum]
    push fmtTest
    call printf

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

【讨论】:

  • 是的,我正在尽一切努力(方括号除外)让它工作,但很高兴知道!
猜你喜欢
  • 1970-01-01
  • 2021-06-05
  • 2017-01-13
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多