Debug命令和汇编指令介绍
8086CPU地址:
物理地址:段地址16+偏移地址
逻辑地址:段地址:偏移地址
物理内存地址:段地址16+偏移地址
逻辑内存地址:段地址:偏移地址
内存单元=1Byte。内存单元是字节单元,也就是一个存储单元存放一个字节。
字单元=2Byte=16Bit;一个字单元占2个连续的存储单元,以起始单元进行命名字单元。例如:2(低位Byte),3(高位Byte) 存储单元,称为2字单元。
寄存器
AX
- 类型:通用寄存器
- 大小:2Byte = 16Bit
- 分为高位(AH)和低位寄存器(AL),个所占1Byte=8Bit
BX
- 类型:通用寄存器
- 大小:2Byte = 16Bit
- 分为高位(AH)和低位寄存器(AL),个所占1Byte=8Bit
CX
- 类型:通用寄存器
- 大小:2Byte = 16Bit
- 分为高位(AH)和低位寄存器(AL),个所占1Byte=8Bit
DX
- 类型:通用寄存器
- 大小:2Byte = 16Bit
- 分为高位(AH)和低位寄存器(AL),个所占1Byte=8Bit
CS
- 存储执行指令的段寄存器
CS:IP 指向下一条待执行的指令。
IP
- 指定段地址的待执行处的偏移值。会根据累加每次执行汇编指令的所占字节数。
CS:IP 指向下一条待执行的指令。
BP
SI
DI
DS
- 内存段寄存器,存储要访问内存的段地址寄存器。
需要使用
mov,ds,寄存器给ds段寄存器进行赋值。直接使用mov ds,1000是无法给ds段寄存器赋值的,会直接返回Error错误。
ES
- 类型:段寄存器
- 作用:
SS
- 类型:段寄存器,存储要访问栈段的段地址。
栈顶的段地址存放在SS(段寄存器) 中,偏移地址存放在SP(寄存器)中。
任意时刻,SS:SP 指向栈顶元素(指向字单元的低8位地址存储单元),当push和pop指令执行时,CPU会根据SS和SP中得到栈顶的地址。
SP
- 类型:寄存器,存储要访问栈段段地址的偏移地址。逻辑语法为:SS:SP
栈顶的段地址存放在SS(段寄存器) 中,偏移地址存放在SP(寄存器)中。
任意时刻,SS:SP 指向栈顶元素(指向字单元的低8位地址存储单元),当push和pop指令执行时,CPU会根据SS和SP中得到栈顶的地址。
命令行
R
- 作用:改变寄存器的值
- 语法1:
-r,用于查看全部寄存器的值信息 - 语法2:
-r <寄存器名>,按Entry回车后,在:号后输入值,在按Entry回车结束。
D
- 作用:查看内存中的内容。
- 语法1:
-d 段地址:起始偏移地址 [结束偏移地址],查看指定地址范围的内存数据,将列出128个内存单元的内容。 - 语法2:
-d 段地址:起始偏移地址。交互式的修改数据项。
使用方法:回车后,点前是现有的数据,点后的是要输入的替换的数据。空格以确定当前的修改内容,然后会继续下一个存储单元的修改。按Entry回车可以完成此次修改,返回主界面。 - 语法3:
-d 段寄存器:偏移地址。列出 段寄存器(的值):偏移地址 所处的内存单元的数据。
E
- 作用:改写内存中的数据项
- 语法1:
-e 起始地址 Hex存储单元1(2Byte=16Bit) Hex存储单元2(2Byte=16Bit) [Hex存储单元N(2Byte=16Bit)...] - 语法2:
-e 起始地址 <string|Hex|Ascll字符>。 - 语法3:
-e 段寄存器:偏移地址。列出 段寄存器(的值):偏移地址 所处的内存单元的数据。
U
- 作用:将内存中存储单元的机器码数据以汇编指令进行展示。
- 语法1:
-u 起始地址:偏移地址 [结束地址]。
多次使用
-u命令,可以看到连续地址所处的数据信息。可以使用-r后再使用-u可以看到当cs:ip所处的数据内容。
- 语法2:
-u 段寄存器:偏移地址。列出 段寄存器(的值):偏移地址 所处的内存单元的数据。
T
- 作用:执行寄存器CS:IP指向内存中的汇编命令。寄存器IP会自动的更新为下一个汇编指令所处的内存位置。
针对SS段寄存器,相应的SP指令会紧随隐式执行。这涉及到中断机制。
A
- 作用:以汇编指令的形式在内存中写入机器码。
- 语法1:
-a [段地址:偏移地址]。在直接使用-a命令,则会从预设地址开始输入汇编指令。
使用方法:一行输入一个汇编指令;结束在空行处使用Entry回车即可。 - 语法2:
-a 段寄存器:偏移地址。列出 段寄存器(的值):偏移地址 所处的内存单元的数据。
P
- 作用1:汇编程序返回所需要使用的Debug命令。在执行
int 21H时使用p命令执行。否则程序会因为没有程序返回导致无命令输入响应。 - 作用2:可以在loop指令待执行处,使用p命令可以一次执行完所给定循环的次数后,会将IP指向loop指令的下一处待执行的指令。
g
- 作用:在Debug程序中,执行一段指令,使IP寄存器到达预定的位置后继续断点跟踪。
- 语法:
-g <运行到目标指令地址>。 - 示例:
-g 0012,这会使IP地址直接运行到0012指令处进行断点住。
汇编命令
mov
- 作用:将值写入左侧的寄存器中
- 语法1:
mov 寄存器,值。 - 语法2:
mov [段]寄存器,[段]寄存器。 - 语法3:
mov 寄存器,[偏移地址],偏移地址需要使用中括号进行包围,偏移地址是针对ds寄存器进行定位的。
示例:mov [段]寄存器,[偏移地址],用于取出内存地址为 段地址(从ds寄存器获取):0000 处的内容传送到ax寄存器中。“[]”表示一个内存单元,“[....]”中的Hex值表示内存单元的偏移地址
- 语法4:
mov [偏移地址],[段]寄存器,将ax寄存器的值传送到ds:偏移地址处。 - 语法5:
mov [段]寄存器,[寄存器],将ds寄存器段地址处的,偏移地址为[寄存器]处的值,传送给逗号前的寄存器。
add(加法)
作用:
语法1:add 寄存器,数据
语法2:add 寄存器,寄存器
语法2:add 寄存器,内存单元,内存单元使用[]表示,但需要设置ds段寄存器表示访问内存地址的基础地址。
语法2:add 内存单元,寄存器
sub(减法)
作用:
语法1:sub 寄存器,数据
语法2:sub 寄存器,寄存器
语法2:sub 寄存器,内存单元
语法2:sub 内存单元,寄存器
push
作用:入栈,将寄存器的数据入栈。
语法:push <寄存器|段寄存器|[内存单元(需要定义内存段地址ds段寄存器)]>
注意:SS:SP逻辑地址,SP+2;因为栈使用字单元存储数据的,所以,这里需要-2。
pop
作用:出栈,用一个寄存器接收出栈的数据。
语法:pop <寄存器|段寄存器|[内存单元(需要定义内存段地址ds段寄存器)]>
注意:SS:SP逻辑地址,SP-2;因为栈使用字单元存储数据的,所以,这里需要-2。
执行步骤:
jmp
- 语法:
jmp 段地址:偏移地址 - 示例:
jmp 073F:0000;这会将CS寄存器更改为073F,IP寄存器更改为0000。类似mov cs,073F;mov ip,0000。
inc
- 语法:
inc 寄存器 - 作用:使寄存器自加1。等同 寄存器=寄存器+1。
- 示例:
loop
- 作用:循环执行指定次数(由寄存器cx决定,当为0时,继续loop下的指令执行,否则会跳转到Label处执行)Label处之后和loop前的指令。
- 注意:当循环次数不为0时,loop会改变IP寄存器的指向地址。
执行步骤:先将cx-1后,判断cx寄存器的值是否等于0,为0继续往下执行,否则跳转到loop指令后的地址处执行指令。
- 示例:
mov cx,循环次数
<Label>:
循环执行的程序段
loop s
dw(define word)
作用:定义字形数据,每个数据会占2个存储单元(2Byte);高8位数据字节存入高地址字节中,而低8位数据字节则存入低地址字节中。
语法:dw dataItem1, dataItem2, dataItem3,... 。其中每个dataItemN会占2个字节。
定义:
- 栈:具有入和出一个方向叫做栈,特征是后进先出(LIFO),也就是最后进入的会从栈中最先弹出(也可以理解为栈顶总是最后入栈的。)。栈只有2个操作,即是入栈和出栈。
栈顶总是指向字单元的低8位。
8086CPU入栈和出栈都是以字单元(字单元所占2Byte=16Bit)进行的。
字单元用2个存储单元(1Byte)存放,高地址存储单元存放高8位,低地址存储单元存放低8位。
注意:当空栈时,此时栈中没有元素,这时SS:SP指向栈中最底部的字单元偏移地址+2地址单元处。
当栈处于段地址的最大范围时,SP处于0000:FFFF时,会循环覆盖其他存储单元的数据。例如:0000-2会导致SP指向FFFE,而FFFE+2会导致SP指向0000。

浙公网安备 33010602011771号