Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 理解8086汇编程序调试器_Debugging_Assembly_X86 16 - Fatal编程技术网

Debugging 理解8086汇编程序调试器

Debugging 理解8086汇编程序调试器,debugging,assembly,x86-16,Debugging,Assembly,X86 16,我正在学习汇编程序,我需要一些帮助来理解调试器中的代码,尤其是标记部分 mov ax, a mov bx, 4 我知道上面的指令是如何工作的,但在调试器中我有“2EA0301”和“BB0400” 它们是什么意思? 第一条指令将变量a从数据段移动到ax寄存器,但在调试器中我有cs:[0103] 这些括号和数字是什么意思 谢谢您的帮助。首先,汇编器是x86汇编。汇编程序是将指令转换成机器代码的工具 当您反汇编程序时,它可能会使用十六进制值(比如90是NOP指令或B8将某些内容移动

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

mov     ax, a
mov     bx, 4
我知道上面的指令是如何工作的,但在调试器中我有“2EA0301”和“BB0400”

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

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


谢谢您的帮助。

首先,汇编器是x86汇编。汇编程序是将指令转换成机器代码的工具

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

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

突出显示的两条指令的编号分别为
2EA0301
BB0400

2E
是并指示CPU使用
CS
段而不是默认的
DS
段访问内存。
A1
是MOV AX的操作码,moffs16和
0301
是立即数0103h in,是要读取的地址。
因此
2EA0301
mov-ax,cs:[103h]

方括号是表示a的首选方式,但一些汇编程序支持没有方括号的混乱语法。
由于这种语法模棱两可,不同的汇编程序之间的标准化程度较低,因此不鼓励使用这种语法

在组装过程中,汇编程序为每个发出的字节保持一个递增的位置计数器(每个“节”/段都有自己的计数器,即计数器在每个“节”的开头重置)。
这为每个变量提供了一个偏移量,用于访问它和编写指令,变量名称是供人使用的,CPU只能从地址、数字中读取

加载文件后,此偏移量将在内存中显示为0和地址。
汇编器、链接器和加载程序协同工作,以确保最终指令在内存中正确形成,并且偏移量被转换为正确的地址。
在您的示例中,他们的努力最终达到值103h,即内存中
a
的地址。
同样,在您的示例中,如果文件是COM(顺便说一下,不要在执行流中放入变量),由于COM文件的特殊结构,偏移量仍然是103h。
但总的来说,这可能是另一个数字

BB
movr16,imm16
和寄存器
BX
。基本形式是
B8
,较低的3位表示要使用的寄存器,
BX
由3(二进制011b)的值表示,实际上是0B8h+3=0BBh。
在操作码之后,同样是单词immediate
0400
,它以小尾端编码4


现在,您可以意识到,汇编源代码并不总是提供充分的信息,因为汇编程序实现了某种形式的语法糖。
指令
mov ax,a
,在语法上与
mov bx,4
相同,技术上是将
a
的地址给定的
a
立即值移动到
a
中,恒定且在汇编时已知,该指令被解释为移动
a
内容,内存中存在的一种值,只有通过内存访问才能读取,
ax
,因为已知
a
是一个变量


这种现象在x86中是有限的,而且在世界范围内更为普遍,在那里,通常需要的指令的缺乏得到了补偿。

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

首先,我认为这是“2EA0301”,是十六进制。