我知道那里有很多关于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
会有什么不对,但显然有些事情是对的!
答案 0 :(得分:1)
问题在于:
push dword sum
push dword fmtTest
call printf
printf
与scanf
不同,它按参数(在格式之后)按值获取,而在代码中sum
是内存位置的地址 。只是做:
push [sum]
push fmtTest
call printf
(顺便说一下,xor eax,eax
之前的mov eax,[int1]
是没用的,因为你马上重写了寄存器的内容)