理解8086汇编程序调试器

Ane*_*wil 0 debugging assembly x86-16

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

mov     ax, a
mov     bx, 4
Run Code Online (Sandbox Code Playgroud)

我知道上面的指令是如何工作的,但在调试器中我有"2EA10301"和"BB0400".

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

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

在此输入图像描述

谢谢你的帮助.

Mar*_*oom 5

2EA10301BB0400数字的操作码的两个指令突显.

2E代码段(CS)前缀,并指示CPU使用CS段而不是默认段访问内存DS.
A1是操作码,MOV AX, moffs16并且0301小端的即时0103h,读取的地址.
所以2EA10301mov ax, cs:[103h].
方括号是通过一种寻址模式表示存储器访问的首选方式,但是一些汇编器支持不带括号的混淆语法.
由于这种语法在不同的汇编程序中不明确且不太标准化,因此不鼓励使用.

在组装期间,汇编器保持位置计数器针对发出的每个字节递增(每个"部分"/段具有其自己的计数器,即计数器在每个"部分"的开始处复位).
这为每个变量赋予一个偏移量,用于访问它并制作指令,变量名称用于人类,CPU只能读取地址,数字.

一旦加载文件,此偏移将在以后在内存中寻址.
汇编器,链接器和加载器配合,有各种技巧在起作用,以确保最终指令在存储器中正确形成,并且偏移被转换为正确的地址.
在你的例子中,他们的努力最终导致值103h,即a内存中的地址.
同样,在您的示例中,由于COM文件的特殊结构,如果文件是COM(顺便说一下,不将变量放在执行流程中),偏移量仍然是103h.
但总的来说,它可能是另一个数字.

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


您现在可以意识到汇编源并不总是完全提供信息,因为汇编程序实现了某种形式的语法糖.
的指令mov ax, a,相同mov bx, 4于它的语法和在技术上是移动即时值,常数,在汇编时已知的,由地址给出aax,相应地解释为移动内容a,一个值存在于存储器中并且可读取仅与内存访问,ax因为a已知是一个变量.

这种现象在x86中是有限的,即CISC,并且在RISC世界中更为普遍,其中缺少通常需要的指令用伪指令补偿.