理解8086汇编程序调试器

时间:2017-04-08 20:29:44

标签: debugging assembly x86-16

我正在学习汇编程序,我需要一些帮助来理解调试器中的代码,特别是标记的部分。

mov     ax, a
mov     bx, 4

我知道上面的说明是如何工作的,但在调试器中我有“2EA10301”和“BB0400”。

他们的意思是什么? 第一条指令将变量a从数据段移到ax寄存器,但在调试器中我有cs:[0103]

这些括号和这些数字是什么意思?

enter image description here

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

2EA10301BB0400数字是突出显示的两条指令的opcodes

2ECode Segment (CS) prefix,并指示CPU使用CS段而非默认DS段访问内存。
A1MOV AX, moffs16的操作码,0301little endian中的直接0103h,即要读取的地址。
因此2EA10301mov ax, cs:[103h] 方括号是表示memory access through one the addressing mode的首选方法,但有些汇编程序支持不带括号的混淆语法。
由于这种语法在不同的汇编程序中不明确且不太标准化,因此不鼓励使用。

在组装过程中,汇编器会为发出的每个字节保持一个位置计数器递增(每个“段”/段都有自己的计数器,即计数器在每个“段”的开头重置)。
这为每个变量赋予一个偏移量,用于访问它并制作指令,变量名称适用于人类,CPU只能读取地址,数字。

此偏移量将在文件加载后在内存中进行寻址 汇编器,链接器和加载器协作there are various tricks at play,以确保最终指令在内存中正确形成,并将偏移量转换为正确的地址。
在你的例子中,他们的努力最终达到值103h,即记忆中a的地址 同样,在您的示例中,由于COM文件的特殊结构,如果文件是COM(顺便说一下,不将变量放在执行流程中),则偏移量仍为103h。
但总的来说,它可能是另一个数字。

BB MOV r16, imm16,注册日为BX。基本形式为B8,低3位表示要使用的寄存器,BX由值3表示(二进制为011b),实际为0B8h + 3 = 0BBh。 在操作码之后,再次,WORD立即0400以小端编码4。

您现在可以意识到汇编源并不总是完全提供信息,因为汇编程序实现了某种形式的语法糖。
指令mov ax, a,在语法上与mov bx, 4相同,在技术上是移动立即值,常量并在汇编时知道,由{的地址给出{1}}转换为a ,而是被解释为移动ax内容,一个存在于内存中的值,只能用内存读取访问a ,因为已知ax是变量。

这种现象在x86中受到限制,为CISC,并且在RISC世界中更为普遍,缺乏常用指令会被pseudo-instructions补偿。

答案 1 :(得分:2)

嗯,首先,汇编程序是x86程序集。汇编程序将指令转换为机器代码。

当您反汇编程序时,它可能会使用十六进制值(如90是NOP指令或B8将某些东西移动到AX)。

方括号复制寄存器指向的内存地址。 侧面的十六进制称为地址。

答案 2 :(得分:0)

一切都很简单。命令mov ax,cx:[0103]表示将000Ah的值加载到寄存器ax中。该值取自0103h的代码段。在图片中稍高一点,您可以看到此值。 cx:0101 0B900A00。因此,在地址0101h处是值0Bh,在0102h处是值90h,在0103h处是值0Ah,在0104h处是值00h。事实证明,AL寄存器从地址0103h加载的值等于0Ah。事实证明,AH寄存器从地址0104h加载等于00h的值,结果ax = 000Ah。如果不是斧头命令cx:[0103],而是斧头命令cx:[0101],那么ax = 900Bh,或者斧头命令cx:[0102],然后ax = 0A90h。