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 部分的主要内容,如果未能解决你的问题,请参考以下文章
在 c++ 中使用 x86 DIV 的这个 asm 块有啥用?
将ffmpeg中的x86 asm和inline-asm编译成WebAssembly的问题