Nasm - 将值从 4 字节寄存器移动到 1 字节地址 space
Nasm - move value from a 4 byte register into an 1 byte address space
当我将存储在 eax、ebx、ecx 等中的 4 字节值移动到分配的 space 少于 4 个字节的地址 space 时,nasm 的行为如何?当我将存储在 var
中的 1 字节值移动到 4 字节寄存器时,nasm 分别如何表现?
喜欢:
.bss
var resb 1
.text
mov eax, 2000000000
mov [var], eax
xor ebx, ebx
mov ebx, [var]
[var]
和 ebx
会有什么值?为什么?当用 %d
调用 printf
时,结果是 2000000000
。但这怎么可能呢? var
只能保存1个字节。怎么可能从中接收到一个需要更大字节数的数字呢?
与 MASM 不同,NASM 不跟踪变量的大小。 (它实际上没有变量,它只有标签。)
因此 mov
指令 from/to 一个 4 字节寄存器将简单地覆盖(或读取)从标签 var
开始的四个字节中的任何内容。
NASM 不会阻止您编写错误代码;汇编语言没有变量或类型;您可以使用对您的内存布局有意义的指令。
做窄店:mov [var], al
要进行窄负载(到完整寄存器):movzx ebx, byte [var]
当我将存储在 eax、ebx、ecx 等中的 4 字节值移动到分配的 space 少于 4 个字节的地址 space 时,nasm 的行为如何?当我将存储在 var
中的 1 字节值移动到 4 字节寄存器时,nasm 分别如何表现?
喜欢:
.bss
var resb 1
.text
mov eax, 2000000000
mov [var], eax
xor ebx, ebx
mov ebx, [var]
[var]
和 ebx
会有什么值?为什么?当用 %d
调用 printf
时,结果是 2000000000
。但这怎么可能呢? var
只能保存1个字节。怎么可能从中接收到一个需要更大字节数的数字呢?
与 MASM 不同,NASM 不跟踪变量的大小。 (它实际上没有变量,它只有标签。)
因此 mov
指令 from/to 一个 4 字节寄存器将简单地覆盖(或读取)从标签 var
开始的四个字节中的任何内容。
NASM 不会阻止您编写错误代码;汇编语言没有变量或类型;您可以使用对您的内存布局有意义的指令。
做窄店:mov [var], al
要进行窄负载(到完整寄存器):movzx ebx, byte [var]