链接的装配子程序无法按预期工作

时间:2013-04-21 06:26:23

标签: linux assembly ld system-calls fasm

我正在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

我做错了什么?

2 个答案:

答案 0 :(得分:0)

我得到的明显印象是,您的LINK操作正在uprint之前构建_start,而您实际上正在进入UPRINT,而不是_start正如您所期望的那样

答案 1 :(得分:0)

我发现了我的错误。我正在使用test eax, 0,它总是设置零标志。因此,只处理第一个数字。 Intead我需要使用test eax, eaxcmp eax, 0