使用.bss节的x86 ASM Linux

16

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

第一部分:

我正在尝试弄清楚如何使用汇编程序的.bss部分来存储值,例如从操作(+ - * /)中获得的值,以便将其存储到已声明的变量中。例如:

section .bss

variable:  resb 50                                       ;Imaginary buffer

section .text

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

我知道可以使用内核中断来读取用户输入(但那涉及到字符串),但有没有一种方法将该值复制到变量变量中,以便稍后使用?这比必须在堆栈上推送和弹出两个值要容易得多。

第二部分:

是否有一种方法可以删除.bss部分中变量的值?换句话说,如果我想在.bss变量中存储新值,如何做到不会使变量中已有的字符/值与新值合并?

谢谢

1个回答

41
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

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


一如既往,讲解得非常清晰明了! - nmagerko
值得一提的是 mov dword [变量], 123。通常情况下,您可以直接使用寄存器而不需要进行任何静态存储,但如果您确实需要将常量存储到内存中,则可以直接执行,而无需通过寄存器进行跳转。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接