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。

posted @ 2022-10-05 22:33  星小梦  阅读(350)  评论(0)    收藏  举报