【发布时间】:2021-10-28 18:37:11
【问题描述】:
概述
我正在用 x86 程序集 (NASM) 编写一个程序,它基本上从用户那里得到一个除数和除数,然后调用一个执行除数的过程,返回 EAX 中的值供我打印。我将 Paul Carter 的 asm_io.inc 库用于 C I/O 函数 (http://pacman128.github.io/pcasm/)。这是我在命令行中输入的内容以使程序运行:
nasm -f win32 source.asmgcc source.obj driver.c asm_io.obj.
问题
现在的问题是,当我将两个参数传递给过程(称为divide)时,我尝试通过间接访问参数(例如,[ebp + 8] 用于第一个参数),但是它会产生内存地址。我试过调试它,但无济于事。我做错了什么会产生错误的结果吗?我的代码:
%include "asm_io.inc"
segment .data
prompt1 db "Enter a dividend: ", 0
prompt2 db "Enter a divisor: ", 0
answer1 db " divided by ", 0
answer2 db " equals ", 0
segment .bss
dividend resd 1
divisor resd 1
segment .text
global _asm_main
_asm_main:
enter 0,0
pusha
mov eax, prompt1
call print_string
call read_int
mov [dividend], eax
mov eax, prompt2
call print_string
call read_int
mov [divisor], eax
mov eax, [dividend]
call print_int
mov eax, answer1
call print_string
mov eax, [divisor]
call print_int
mov eax, answer2
call print_string
push dword dividend
push dword divisor
call divide
add esp, 8
call print_int
popa
mov eax, 0
leave
ret
divide:
push ebp
mov ebp, esp
mov eax, [ebp + 8]
div dword [ebp + 4]
pop ebp
ret
【问题讨论】:
标签: assembly parameters x86 procedure