汇编变量和常量的x86操作码是什么?

时间:2017-11-20 13:01:45

标签: variables assembly x86 intel opcodes

我知道每条指令都有操作码。
我可以找到mov,sub指令的操作码 但变量及其类型的操作码是什么 我们使用汇编程序指令来定义变量和常量?
它们如何在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代码定义变量时,它显示错误!

2 个答案:

答案 0 :(得分:3)

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

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

CPU有cs:ip指令指针,指向存储器地址,下一条指令在哪里执行,因此它将从该地址读取字节,解释它们为操作码,并将其作为指令执行。

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

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

您是否在信息来源中写道:

x:
    add     al,al

x:
    db 0x00, 0xC0

无关紧要,生成的机器代码是相同的(在两种情况下,当指向要作为指令执行的内存时,CPU将执行add al,almov ax,[x]将设置ax在两种情况下都用0xC000作为“变量”。

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

答案 1 :(得分:1)

public function get_results($search_term) { //var_dump($search_term);die; $this->db->select('*'); $this->db->from('Competitor_Products'); $this->db->where('CProduct_Article_Number', $search_term); return $this->db->get()->result(); } segmentresb等汇编程序指令不是指令,与操作码不对应。这就是为什么他们是指令而不是指令的原因。粗略地说,有两种指令:

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