繁体   English   中英

组件x86-变量分配

[英]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;
}

如果您不需要内存中的任何内容,请不要使用dbdd 将其保存在寄存器中。 或使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM