x86 ASM Linux - 使用 .bss 部分

Posted

技术标签:

【中文标题】x86 ASM Linux - 使用 .bss 部分【英文标题】:x86 ASM Linux - Using the .bss Section 【发布时间】:2011-12-30 00:32:27 【问题描述】:

我希望这些问题相当简单:(NASM 编译器,Linux,x86 Intel 语法)

第 1 部分:

我试图弄清楚如何使用汇编程序的 .bss 部分来找到一种将值(例如来自操作 (+ - * /) 的值)存储到已声明变量的方法。例如:

section .bss

variable:  resb 50                                       ;Imaginary buffer

section .text

add 10,1                                                 ;Operation
;move the result into variable

所以,我知道可以通过内核中断来读取用户输入(但这涉及字符串,但是有没有办法将此值复制到 variable 变量中,以便它以后可以使用吗?这比在堆栈上进出两个东西要容易得多。

第 2 部分:

有没有办法删除 .bss 部分中变量的值?换句话说,如果我想在 .bss 变量中存储一个新值,如果变量中已经存在的字符/值没有与新值混合,我怎么能做到这一点?

谢谢

【问题讨论】:

【参考方案1】:
section .bss

variable: resb 4

...variable 符号现在指的是 .bss 部分中 4 个字节的存储地址(即足以存储 32 位值)。

section .text
...
mov eax, 123
mov [variable], eax

... 将eax 寄存器设置为123,然后将eax 的值存储在符号variable 寻址的位置。

mov eax, [variable]

... 将当前存储在variable 寻址的位置中的值读入eax 寄存器。

mov eax, 456
mov [variable], eax

... 存储一个新值,覆盖之前的值。

【讨论】:

解释得很好,一如既往! mov dword [variable], 123 也值得一提。通常你可以只使用寄存器而不是任何静态存储,但如果你确实需要将一个常量存储到内存中,你可以直接这样做,而不是通过寄存器弹跳。

以上是关于x86 ASM Linux - 使用 .bss 部分的主要内容,如果未能解决你的问题,请参考以下文章

在x86程序集中写入.bss部分

在 c++ 中使用 x86 DIV 的这个 asm 块有啥用?

GCC 生成的 ASM 简化了 x86 ASM?如何映射?

将ffmpeg中的x86 asm和inline-asm编译成WebAssembly的问题

GCC 链接器脚本 - 将 .bss 部分拆分为多个 RAM 区域

x86 ASM - cpuid 是不是设置标志?