NASM 从寄存器移动到内存
NASM mov from register to memory
我知道有很多参考资料都在谈论 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 部分用于未初始化的变量,在本例中是我的输入变量和总和变量;文本部分是代码所在的地方;我将 main 声明为 gcc 的入口点;我提示用户输入两个数字;我用异或将 eax 清零;将 int1 的值移动到 eax;将int2的值加到eax中;将 eax 中的内容移动为 sum 的值;将其与格式化字符串一起压入堆栈;调用 printf 来显示内容;结束程序。
--编辑--
需要说明的是,要么 add 不起作用,要么 mov 不起作用。似乎 add 应该可以工作,所以我假设它是 mov。我不明白 mov [var], register
有什么问题,但显然有些地方不对!
这是问题所在:
push dword sum
push dword fmtTest
call printf
printf
,与 scanf
不同,按值获取其参数(在格式之后),而在您的代码中 sum
是 地址 的内存位置。只是做:
push [sum]
push fmtTest
call printf
(顺便说一句,mov eax,[int1]
之前的 xor eax,eax
没用,因为你是在立即重写寄存器的内容)
我知道有很多参考资料都在谈论 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 部分用于未初始化的变量,在本例中是我的输入变量和总和变量;文本部分是代码所在的地方;我将 main 声明为 gcc 的入口点;我提示用户输入两个数字;我用异或将 eax 清零;将 int1 的值移动到 eax;将int2的值加到eax中;将 eax 中的内容移动为 sum 的值;将其与格式化字符串一起压入堆栈;调用 printf 来显示内容;结束程序。
--编辑--
需要说明的是,要么 add 不起作用,要么 mov 不起作用。似乎 add 应该可以工作,所以我假设它是 mov。我不明白 mov [var], register
有什么问题,但显然有些地方不对!
这是问题所在:
push dword sum
push dword fmtTest
call printf
printf
,与 scanf
不同,按值获取其参数(在格式之后),而在您的代码中 sum
是 地址 的内存位置。只是做:
push [sum]
push fmtTest
call printf
(顺便说一句,mov eax,[int1]
之前的 xor eax,eax
没用,因为你是在立即重写寄存器的内容)