assembly - 在汇编中获取 _bss_start 时遇到问题

标签 assembly x86

我想使用 CONSTANT __bss_start 打印 bss start 的地址。我制作了一个简单的程序,它将打印 bss 部分的地址。下面是代码

 section .bss
 section .data
 x db "value is =%ld"
 section .text
;extern alt_u32* __bss_start;

global main
extern  __bss_start;
extern printf
main:
mov bx,__bss_start
push bx
push x
call printf
add esp,8
ret

当我运行 gcc -m32 -o bss_start.o 以获得最终可执行文件时,出现以下错误

    bss_start.asm:(.text+0x2): relocation truncated to fit: R_386_16 against symbol `__bss_start' defined in *ABS* section in bss  

这里可能有什么问题?

最佳答案

这里的问题是 __bss_start将是进程地址空间中的 32 位地址,并且您试图将其放入 16 位寄存器中。您已经快完成了(事实上,您的堆栈清理 add esp,8 完全正确!),但您需要进行三项修改:

  1. mov bx, __bss_start需要是mov ebx, __bss_start (32 位宽)。
  2. push bx需要是push ebx ,同样是 32 位宽。
  3. 我修改了x db value is =%ldx db value is=%x这样我就可以根据 objdump -t 检查输出.

这为我提供了 objdump 的匹配值。

另外,为了额外的好处,我通过添加以下内容让 C 运行时库自行清理:

xor eax, eax
push eax
call exit

带有 extern exit 。但你不需要这个,但是,我会 xor eax,eax设置返回码。

关于assembly - 在汇编中获取 _bss_start 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17545009/

相关文章:

assembly - 以下汇编代码行的含义是什么?

assembly - 查找 32 位整数中的最大值

assembly - MIPS 寄存器 $0 可以用于存储和检索值吗?

c++ - 帮助理解生成的部分汇编代码

linux - 在 Linux 上使用 x86 汇编和 at&t 打印计数器 0 --> 4

c - 索引数组时循环变量类型会影响效率吗?

delphi - 乘法整数溢出 - 编译器错误?

multithreading - 退出临界区

assembly - 我可以使用二进制在汇编中编写整数常量吗?

c - 使用缓冲区溢出执行shell代码