繁体   English   中英

堆栈参数正在使用 C 调用约定在汇编中消失

[英]Stack arguments are disappearing in assembly using C calling convention

我目前正在编写一些 x86 汇编代码,并使用asld将其与 glibc 链接。

    .section .data

str1:
    .asciz "\n"

str3:
    .asciz "Hello"

str4:
    .asciz "Goodbye"

str5:
    .asciz "Guten Tag!"

str6:
    .asciz "Guten Morgen!"


    .section .bss
    .section .text
    .globl _start

_start:
    call main
    movl %eax, %ebx
    movl $1, %eax
    int $0x80

# void writeLine(char*);

    .type writeLine, @function
writeLine:
    pushl %ebp
    movl %esp, %ebp
    movl $str1, %ecx
    pushl %ecx
    movl 8(%ebp), %ecx
    pushl %ecx
    call strcat
    movl %eax, %ecx
    pushl %ecx
    call puts
    popl %ebx
    .leaver1:
    movl %ebp, %esp
    popl %ebp
    ret

    .type main, @function
main:
    pushl %ebp
    movl %esp, %ebp
    movl $str3, %ecx
    pushl %ecx
    call writeLine
    popl %ebx
    movl $str4, %ecx
    pushl %ecx
    call writeLine
    popl %ebx
    movl $str5, %ecx
    pushl %ecx
    call writeLine
    popl %ebx
    movl $str6, %ecx
    pushl %ecx
    call writeLine
    popl %ebx
    .leaver3:
    movl %ebp, %esp
    popl %ebp
    ret

问题是,对于预期的输出:

 Hello Goodbye Guten Tag! Guten Morgen!

我得到:

 Hello Guten Tag!

通过一些更深入的调试,当我像这样执行printf时,这些参数似乎正在消失:

pushl 8(%ebp)   # Argument for writeLine
pushl $str7     # "Argument for writeLine: %s\n"
call printf     # printf();

它将“消失”的参数显示为无,例如:

# should be "Goodbye"
Argument for writeLine: 

同样,当我以%d格式打印参数时,我最终会得到一个常数,该数字仅str4我传递的字符串( str3str4等)而变化。

示例: 134525414

我还尝试将它与 gcc ( gcc -m32 -S main.c ) 生成的程序集进行比较,该程序集编译了一个应该做完全相同的事情,除了 gcc 生成的东西我找不到任何东西快速查看代码。

看起来,我的论点正在消失。

strcat(str3, str1)会连接str1到的端str3通过复制的字节str1到存储器中,起始的终止空字节str3 因此str3的终止空值被字符'\\n'覆盖,并且一个新的终止空值被写入接下来的字节。 但是你猜怎么着:紧跟在str3的终止空值之后的字节是str4的第一个字节。 所以你刚刚用空字节覆盖了str4的第一个字节。 因此,当您稍后打印它时,它的行为就像一个空字符串。

您可以在每个字符串之间添加一个额外的字节空间以避免这种情况。 但更广泛地说, writeLine函数修改它传递的字符串并不是真正明智的,因此更好的计划是重新设计它,这样它就不需要这样做了。 例如,您可以通过对puts一次调用来编写传递的字符串(它已经附加了一个换行符),如果您想要一个额外的换行符,请单独调用putc

暂无
暂无

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

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