小编sag*_*a.x的帖子

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

我制作了两个程序来输出两个字符串,一个在汇编中,另一个在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
Run Code Online (Sandbox Code Playgroud)

我用它构建程序

as test.s -o test.o
ld -dynamic-linker /lib/ld-linux.so.2 -o test test.o -lc
Run Code Online (Sandbox Code Playgroud)

输出正如预期的那样

Hola
Adios
Run Code Online (Sandbox Code Playgroud)

这是C程序:

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

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

    .file   "testc.c"
    .section    .rodata
.LC0:
    .string "Hola"
.LC1:
    .string "Adios"
    .text
    .globl  main
    .type   main, …
Run Code Online (Sandbox Code Playgroud)

c linux x86 gcc

7
推荐指数
1
解决办法
650
查看次数

关于Linux中程序的内存布局

我对 Linux 中程序的内存布局有一些疑问。我从各种来源(我正在阅读“从头开始编程”)知道每个部分都被加载到它自己的内存区域中。文本部分首先在虚拟地址 0x8048000 处加载,紧接着加载数据部分,接下来是 bss 部分,然后是堆和堆栈。

\n\n

为了试验布局,我用汇编语言编写了这个程序。首先它打印一些标签的地址并计算系统断点。然后就进入无限循环了。循环递增一个指针,然后尝试访问该地址处的内存,在某个时刻,分段错误将退出程序(我是故意这样做的)。

\n\n

这是程序:

\n\n
.section .data\n\nstart_data:\nstr_mem_access:\n.ascii "Accessing address: 0x%x\\n\\0"\nstr_data_start:\n.ascii "Data section start at: 0x%x\\n\\0"\nstr_data_end:\n.ascii "Data section ends at: 0x%x\\n\\0"\nstr_bss_start:\n.ascii "bss section starts at: 0x%x\\n\\0"\nstr_bss_end:\n.ascii "bss section ends at: 0x%x\\n\\0"\nstr_text_start:\n.ascii "text section starts at: 0x%x\\n\\0"\nstr_text_end:\n.ascii "text section ends at: 0x%x\\n\\0"\nstr_break:\n.ascii "break at: 0x%x\\n\\0"\nend_data:\n\n.section .bss\n\nstart_bss:\n.lcomm buffer, 500\n.lcomm buffer2, 250\nend_bss:\n\n.section .text\nstart_text:\n\n.globl _start\n_start:\n\n# print address of start_text label\npushl $start_text\npushl $str_text_start\ncall printf\naddl $8, %esp\n# print address of end_text label\npushl $end_text\npushl $str_text_end\ncall printf\naddl $8, %esp\n# print address of …
Run Code Online (Sandbox Code Playgroud)

linux x86 assembly memory-layout

5
推荐指数
1
解决办法
1362
查看次数

标签 统计

linux ×2

x86 ×2

assembly ×1

c ×1

gcc ×1

memory-layout ×1