Nasm - 将值从 4 字节寄存器移动到 1 字节地址空间

Men*_*ork 1 x86 assembly memory-management nasm cpu-registers

当我将存储在 eax、ebx、ecx 等中的 4 字节值移动到分配的空间少于 4 字节的地址空间时,nasm 的行为如何?当我将存储的 1 字节值移动var到 4 字节寄存器时,nasm 分别如何表现?

喜欢:

.bss
var resb 1
.text
mov eax, 2000000000
mov [var], eax

xor ebx, ebx
mov ebx, [var]
Run Code Online (Sandbox Code Playgroud)

将什么样的价值观[var],并ebx有?为什么?当我打电话printf%d2000000000的结果。但这怎么可能?var只能保存1个字节。怎么可能从它接收到需要大量字节的数字?

prl*_*prl 6

与 MASM 不同,NASM 不跟踪变量的大小。(它实际上没有变量,它只有标签。)

因此,mov从/到 4 字节寄存器的指令将简单地覆盖(或读取)从 label 开始的四个字节中的任何内容var

NASM 不会阻止您编写错误代码;汇编语言没有变量或类型;使用对您的内存布局有意义的指令取决于您。

做一个狭窄的商店: mov [var], al

做一个窄加载(到一个完整的寄存器): movzx ebx, byte [var]

  • 大小由指令决定,var 此时只是一个标签 (3认同)