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
- 作用:汇编程序返回所需要使用的Debug命令。
汇编命令
mov
- 作用:将值写入左侧的寄存器中
- 语法1:
mov 寄存器,值
。 - 语法2:
mov [段]寄存器,[段]寄存器
。 - 语法3:
mov 寄存器,[偏移地址]
,偏移地址需要使用中括号进行包围,偏移地址是针对ds寄存器进行定位的。
示例:mov [段]寄存器,[偏移地址]
,用于取出内存地址为 段地址(从ds寄存器获取):0000 处的内容传送到ax寄存器中。“[]”表示一个内存单元,“[....]”中的Hex值表示内存单元的偏移地址
- 语法4:
mov [偏移地址],[段]寄存器
,将ax寄存器的值传送到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
。
定义:
- 栈:具有入和出一个方向叫做栈,特征是后进先出(LIFO),也就是最后进入的会从栈中最先弹出(也可以理解为栈顶总是最后入栈的。)。栈只有2个操作,即是入栈和出栈。
栈顶总是指向字单元的低8位。
标签:汇编,语法,地址,指令,偏移,内存,寄存器,Debug,单元 From: https://www.cnblogs.com/XingXiaoMeng/p/16748248.html8086CPU入栈和出栈都是以字单元(字单元所占2Byte=16Bit)进行的。
字单元用2个存储单元(1Byte)存放,高地址存储单元存放高8位,低地址存储单元存放低8位。
注意:当空栈时,此时栈中没有元素,这时SS:SP指向栈中最底部的字单元偏移地址+2地址单元处。
当栈处于段地址的最大范围时,SP处于0000:FFFF时,会循环覆盖其他存储单元的数据。例如:0000-2会导致SP指向FFFE,而FFFE+2会导致SP指向0000。