【问题标题】:what is the x86 opcode for assembly variables and constants?汇编变量和常量的 x86 操作码是什么?
【发布时间】:2017-11-20 13:01:45
【问题描述】:

我知道每条指令都有操作码。
我可以找到 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 代码定义变量时,它显示错误!

【问题讨论】:

  • 每个汇编程序(读取汇编语言的程序)都定义了自己的汇编语言,因此您必须查看特定的汇编程序对其语法的用途......通过阅读手册......或谷歌搜索。
  • DWresb 不是“真正的”汇编指令,它们没有相应的机器指令或“操作码”。它们是由汇编程序在内部处理的指令。我建议您对汇编程序及其工作方式进行更多研究。

标签: variables assembly x86 intel opcodes


【解决方案1】:

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

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

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

无论你在内存中存储的数据还是机器码都无所谓,都是字节值。

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

你是否写在你的源代码中:

x:
    add     al,al

x:
    db 0x00, 0xC0

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

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

【讨论】:

  • 谢谢!但是在高级编程语言中,我们声明了很多变量。当它转换成机器语言时,如果没有变量,它将如何跟踪所有数据?
  • 编译器确实生成了代码,它创建了一些内存的逻辑结构,作为常量/变量工作。在某些情况下,比如高级数据类型/类 (std::map),它可能包含很多代码。如果此类代码中存在一些错误,它会打破这种错觉,并且您会在运行时出现奇怪的行为,因此编译器必须非常擅长生成“正确”的代码(从高级语言定义的角度来看,例如 C++ 有抽象机的定义,语言正在修改它,编译器为特定平台实现这个抽象机)。
  • 通常这种特定类型变量的代码在内部作为输入“指针”或“引用”(技术上的内存地址),这标志着为此类变量的特定实例保留的第一个内存字节。 IE。 C++ 中的int i = 123; 可能会保留 4 个字节的内存来存储值 123(尽管编译器也可能决定将值仅保留在寄存器中,根本不保留内存),然后代码 ++i; 将在其中增加值记忆。在这种情况下,保留+指针可以由编译器以非常硬编码的方式发出,例如将“i”放在固定的本地堆栈位置。
【解决方案2】:

segmentresbdw 等汇编程序指令不是指令,也不对应于操作码。这就是为什么它们是指令而不是指令。粗略地说,有两种指令:

  • 一种指令配置汇编器。例如,segment 指令将汇编器配置为在您提供的部分中继续汇编。
  • 另一种指令发射数据。例如,dw 指令将给定的数据发送到目标文件中。这可用于将任意数据放入内存以供您的程序使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2022-11-24
    相关资源
    最近更新 更多