【发布时间】: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]。 -
是的,好吧,我很傻。我花了很长时间弄乱东西,我只需要两个小方括号!