我知道那里有很多关于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 回答
这是问题所在:
printf
,与scanf
不同,它通过值获取其参数(格式之后),而在您的代码中sum
是内存位置的地址 . 做就是了:(顺便说一下,
xor eax,eax
之前的xor eax,eax
是没用的,因为你马上重写了寄存器的内容)