【发布时间】:2013-04-21 06:26:23
【问题描述】:
我正在 FASM 中编写一个简单的子程序来将 32 位无符号整数打印到 STDOUT。这是我想出的:
format elf
public uprint
section ".text" executable
uprint:
push ebx
push ecx
push edx
push esi
mov ebx, 10
mov ecx, buf + 11
xor esi, esi
do:
dec ecx
xor edx, edx
div ebx
add dl, 0x30
mov [ecx], dl
inc esi
test eax, 0
jnz do
mov eax, 4
mov ebx, 1
mov edx, esi
int 0x80
pop esi
pop edx
pop ecx
pop ebx
ret
section ".data" writeable
buf rb 11
然后我又写了一个程序来测试上面的子程序是否正常工作:
format elf
extrn uprint
public _start
section ".text" executable
_start:
mov eax, 1337
call uprint
mov eax, 4
mov ebx, 1
mov ecx, newline
mov edx, 1
int 0x80
mov eax, 1
xor ebx, ebx
int 0x80
section ".data"
newline db 0x0A
我将这两个程序编译成它们对应的目标文件,并将它们链接起来以创建可执行文件。
在执行程序时,它只显示7 而不是1337。事实证明,无论数字本身如何,都只显示数字的最后一位。
这很奇怪,因为我的uprint 子程序是正确的。事实上,如果我将这两个程序组合成一个程序,那么它会正确显示1337。
我做错了什么?
【问题讨论】:
-
你能在调试器中运行它,看看uprint开头的eax是什么内容吗?
-
@Mellowcandle - 我不知道如何调试 FASM 程序。是否可以将 GDB 与 FASM 一起使用?
-
AFAIK 使用 GDB 是不可能的
标签: linux assembly ld system-calls fasm