-3

我知道每条指令都有操作码。
我可以找到 mov 的操作码,子指令。
但是变量的操作码和它的类型是什么。
我们使用汇编指令来定义变量和常量?
它们如何在 x86 操作码中表示?

nasm 汇编器 x86:

segment .bss 
largest resb 2  ; reserves two bytes for largest
segment .data number1 DW 12345 ; defines a constant number1

我在网上尝试了这个https://defuse.ca/online-x86-assembler.htm#disassembly汇编到操作码转换器。但是当我使用 nasm 代码定义变量时,它显示错误!

4

2 回答 2

4

变量没有操作码。机器代码中甚至没有变量。

有CPU和内存。内存包含一些值(字节)。

CPU有cs:ip指令指针,指向内存地址,下一条要执行的指令在哪里,所以它会从该地址读取字节,并将它们解释为操作码,并将其作为指令执行。

无论您在内存中存储的数据还是机器代码都无关紧要,两者都是字节值。

使部分内存“数据”或“变量”的原因是运行代码创建的逻辑解释,它确实将内存的某些部分用作“数据/变量”而将内存的其他部分用作“代码”(或最终两者同时进行,就像在这个 DOS 51B长 COM 代码中,在屏幕上绘制希腊标志,其中XLAT指令使用代码操作码也作为蓝/白条配置的源数据)。

无论您是否在源代码中编写:

x:
    add     al,al

或者

x:
    db 0x00, 0xC0

没关系,生成的机器代码是相同的(在这两种情况下,add al,al当 CPU 指向要作为指令执行的内存时,CPU 都会执行,并且在两种情况下都mov ax,[x]将设置ax0xC000,当用作“变量”时。

您可能需要检查汇编程序中的列表文件(-l <listing_file_name>命令行选项nasm),以了解自己无法分辨哪些字节是代码,哪些是数据。

于 2017-11-20T13:26:37.880 回答
2

segment像, resb, or这样的汇编指令dw不是指令并且不对应于操作码。这就是为什么它们是指令而不是指令的原因。粗略地说,有两种指令:

  • 一种指令配置汇编器。例如,该segment指令将汇编器配置为继续您提供的部分中的汇编。
  • 另一种指令发出数据。例如,该dw指令将给定的数据发送到目标文件中。这可用于将任意数据放入内存以供您的程序使用。
于 2017-11-20T13:08:44.633 回答