[英]Assembly x86 - variable assignment
假设我有一个名为Block_Size且没有初始化的变量。
将
Block_Size db ?
mov DS:Block_Size, 1
等于
Block_Size db 1
不, Block_Size db ?
必须进入BSS或数据部分,而不要与您的代码混在一起。
如果你写
my_function:
Block_Size db ?
mov DS:Block_Size, 1
...
ret
您的代码将崩溃。 ?
不是真正的未初始化,而是实际上为零。 因此,然后CPU对从my_function
开始的指令进行解码(例如,在其他一些代码call my_function
),它将实际上将0
解码为代码。 (IIRC,操作码0为add
,然后mov
指令的操作码将被解码为add
(ModR / M)的操作数字节。)
尝试组装它,然后使用反汇编器向您展示如何解码以及机器码的十六进制转储。
db
将字节组装到当前位置的输出文件中,就像add eax, 2
83 c0 02
组装到输出文件中。
您不能像在C中声明变量那样使用db
void foo() {
unsigned char Block_size = 1;
}
非优化的编译器会在堆栈上为Block_size
保留空间。 如果您好奇,请查看编译器的asm输出。 (但是,如果启用优化,它将更具可读性。您可以使用volatile
强制编译器实际存储到内存中,以便可以在优化的代码中看到部分asm。)
可能相关: 汇编-.data,.code和寄存器...?
如果你写
.data
Block_size db ?
.code
set_blocksize:
mov [Block_size], 1
ret
有点像这样的C:
unsigned char Block_size;
void set_blocksize(void) {
Block_size = 1;
}
如果您不需要内存中的任何内容,请不要使用db
或dd
。 将其保存在寄存器中。 或使用Block_size equ 1
定义一个常量,因此您可以执行诸如mov eax, Block_size + 4
类的事情mov eax, Block_size + 4
而不是mov eax, 5
。
变量是汇编实际上没有的高级概念。 在asm中,您要使用的数据可以在寄存器或内存中的某个位置。 通常不需要保留静态存储,尤其是对于小型程序。 使用注释来跟踪您放入哪个寄存器。
db字面意思是“定义字节”,因此它将字节放置在该位置,移动命令可以让您在寄存器中放置特定值,从而覆盖那里的所有内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.