繁体   English   中英

链接的程序集子例程无法正常工作

[英]Linked assembly subroutine doesn't work as expected

我正在用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的前_start和你其实进入UPRINT ,而不是在_start如您所愿。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM