gpt4 book ai didi

c - 从 C 语言转换为汇编语言时,以 null 结尾的字符串在哪里?

转载 作者:IT王子 更新时间:2023-10-29 00:32:54 25 4
gpt4 key购买 nike

我做了两个程序输出两个字符串,一个用汇编,一个用C。这是汇编程序:

.section .data
string1:
.ascii "Hola\0"
string2:
.ascii "Adios\0"

.section .text
.globl _start
_start:

pushl $string1
call puts
addl $4, %esp

pushl $string2
call puts
addl $4, %esp

movl $1, %eax
movl $0, %ebx
int $0x80

我用

构建程序
as test.s -o test.o
ld -dynamic-linker /lib/ld-linux.so.2 -o test test.o -lc

输出符合预期

Hola
Adios

这是 C 程序:

#include <stdio.h>
int main(void)
{
puts("Hola");
puts("Adios");
return 0;
}

我得到了预期的输出,但是当使用 gcc -S(操作系统是 Debian 32 位)将此 C 程序转换为汇编时,输出的汇编源代码不包括两个字符串中的空字符,如您在此处所见:

    .file   "testc.c"
.section .rodata
.LC0:
.string "Hola"
.LC1:
.string "Adios"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
leal 4(%esp), %ecx
.cfi_def_cfa 1, 0
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
.cfi_escape 0x10,0x5,0x2,0x75,0
movl %esp, %ebp
pushl %ecx
.cfi_escape 0xf,0x3,0x75,0x7c,0x6
subl $4, %esp
subl $12, %esp
pushl $.LC0
call puts
addl $16, %esp
subl $12, %esp
pushl $.LC1
call puts
addl $16, %esp
movl $0, %eax
movl -4(%ebp), %ecx
.cfi_def_cfa 1, 0
leave
.cfi_restore 5
leal -4(%ecx), %esp
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.9.2-10) 4.9.2"
.section .note.GNU-stack,"",@progbits

我的两个问题是:

1) 为什么 gcc 生成的汇编代码没有在两个字符串的末尾附加空字符?我以为 C 会自动执行此操作。

2) 如果我跳过我手工制作的汇编代码中的空字符,我会得到这个输出:

HolaAdios
Adios

我明白为什么我在第一行得到“HolaAdios”部分,但如果不是空终止,为什么程序在“Adios”部分之后成功结束?

最佳答案

  1. .string 总是附加一个空终止符,如 here 所示.
  2. 好吧,你可以自己检查一下。 puts 只是继续,直到它看到一个空字节。 \x00 很常见,附近必须有一个才能正常工作(可能是由于 .rodata 的部分对齐)。

关于c - 从 C 语言转换为汇编语言时,以 null 结尾的字符串在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38849250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com