Inv*_*ion 28 x86 assembly nasm memory-address yasm
假设我声明了以下内容:
section .bss
buffer resb 1
Run Code Online (Sandbox Code Playgroud)
这些说明如下:
mov al, 5 ; mov-immediate
mov [buffer], al ; store
mov bl, [buffer] ; load
mov cl, buffer ; mov-immediate?
Run Code Online (Sandbox Code Playgroud)
我是否理解bl将包含值5,并且cl将包含变量的内存地址section .text
?
我对两者之间的差异感到困惑
buffer
vsmov cl, buffer
更新:阅读回复后,我认为以下摘要是准确的:
假设声明mov cl, [buffer]
存在于mov edi, array
.我的理解是:
edi
将第0个数组索引的内存地址放入mov byte [edi], 3
.add edi, 3
将VALUE 3放入数组的第0个索引中edi
,mov al, [array]
现在包含数组第3个索引的内存地址al
将DATA置于第零个索引中mov al, [array+3]
.al
将DATA放在第三个索引处mov [al], [array]
.al
无论出于何种原因,都无效.mov array, 3
是无效的,因为你不能说"嘿,我不喜欢array
存储的偏移,所以我称之为3"mov byte [array], 3
将值3放入数组的第0个索引中.如果其中任何一个是假的,请提及.
Job*_*Job 21
方括号基本上像解引用运算符一样工作(例如,*
在C中).
所以,像
mov REG, x
Run Code Online (Sandbox Code Playgroud)
将值x
移入REG
,而
mov REG, [x]
Run Code Online (Sandbox Code Playgroud)
移动x
指向的内存位置的值REG
.请注意,如果x
是标签,则其值是该标签的地址.
至于你的问题:
我是否理解bl将包含值5,并且cl将包含变量缓冲区的内存地址?
是的,你是对的.但要注意,因为CL
只有8位宽,所以它只包含地址的最低有效字节buffer
.
byr*_*sos 15
实际上,你的想法是正确的.也就是说,bl将包含5和cl缓冲区的内存地址(实际上标签缓冲区本身就是一个内存地址).
现在,让我解释一下您提到的操作之间的差异:
将立即数移入寄存器可以使用.mov reg,imm
可能令人困惑的是标签例如缓冲区本身是包含地址的立即值.
你真的不能动寄存器到直接,因为眼前的值是常量,像2
或FF1Ah
.什么,你可以做的是移动寄存器其中常数点to.You能做到这一点喜欢的地方mov [const], reg
.
您也可以使用间接寻址,例如mov reg2,[reg1]
将reg1指向有效位置,并将reg1指向的值传递给reg2.
因此,mov cl, buffer
将缓冲区的地址移动到cl(可能会或可能不会给出正确的地址,因为cl只有一个字节长),而 mov cl, [buffer]
将得到实际值.
F5B1
,然后[A]是指在地址F5B1 RAM.F5B1
.你明白了。但是,有一些细节需要牢记:
cl
8位,cx
16位,ecx
32位,rcx
64位)。因此,cl
可能不等于变量的地址buffer
。它只有地址的最低8位。buffer
的值bl
可能不同于5。中断的中断例程在无法保存寄存器值时实际上可能会影响任何寄存器。