16位汇编 01

>> debug的使用

>>环境配置

1:XP系统

2:dosbox

3: msdos

 

>> debug命令

 

1:? —— help(帮助,显示所有命令)

 

2:u[range] —— [range] = [startaddr][endaddr]

或者[startaddr l num]

 

 

u - 反汇编: 把机器码转换成汇编源码

反编译: 把汇编语言变成高级语言(C语言)

 

range: 反汇编的内存范围, 以字节为单位

 

第一种查看内存反汇编的方式:

startaddr: 反汇编在内存中的起始地址

endaddr: 反汇编在内存中的结束地址

 

第二种方式:

startaddr: 反汇编在内存中的起始地址

L(小写): 指明后面的为长度

num: 起始地址到结束的额长度

 

 

 

3: a [addr]

 

 

a - 汇编: 把汇编语言转换成机器码

 

4: r[reg]

 

r - 寄存器

 

r命令可以查看寄存器,也可以修改寄存器

 

后面不加寄存器就是查看

后面加寄存器就是修改

 

5: d [range]

 

d - 内存 用法跟 u 的命令差不多

查看内存

 

6: e addr

 

e - 修改内存

后面加地址,回车后, 显示出以前的值, 在以前的值后面加上要修改的值, 按空格显示下一字节的值,再加上需要修改的值, 再空格,又显示下一个字节的值

 

还有一种格式连续修改内存:

输入命令, 加上地址, 在直接加上要修改的值1, 值2,值3 ... (值与值之间可以用空格或者,隔开)

 

例如:

 

修改成字符串:

 

7: g

 

g - 调试功能中的F5

 

后面加地址, 可以直接go过去


8: t

 

t - 调试功能中的F11

 

9: p

p - 调试功能中的F10

 

10: 写入文件(n, r - cx, w)

 

内存中数据写入文件

 

8,9,10一起写


 

11: q

退出

 

>> 基础汇编指令

 

赋值:

mov reg, reg
mov reg, imm;(立即数, 常数)
mov ax, 5566
mov al, 78

加法:
add reg1, reg2
add reg, imm;(立即数, 常数)

add ax, bx; ax = ax + bx
add ax, 5566; ax = ax + 5566;

 

 

 

>> 硬件运行机制:

 

图1:

 

 

图2:

 

 

 

图3:

 

 

 

>> 微机系统硬件组成

 

图1

 

图2:

 

图3:

 

 

 

>> 计算机系统组成

 

图1:

 

图2:

 

 

图3:

 

 

>> 8086CPU组织结构

图1:

 

图2:

 

图3:

 

缺点:流水线作业就像做菜一样, 每一个环节都 在执行固定的工作, 如果遇到跳转, 后面的操作全部要置0,重新开始

优点: 效率高

 

 

 

>> 通用寄存器

 

通用寄存器有8个:

1: AX —— 累加器

2: BX —— 基址寄存器

3: CX —— 计数寄存器

4: DX —— 数据寄存器

 

1,2,3,4寄存器为数据寄存器

 

5: SP —— 堆栈指针

6: BP —— 基址指针

 

5,6寄存器为指针寄存器

 

7: SI —— 源变址寄存器

8: DI —— 目的变址寄存器

 

7,8寄存器为变址寄存器

 

 

以上8个寄存器又统称为通用寄存器


 

>> 段寄存器

9:CS —— 代码段寄存器

10: DS —— 数据段寄存器

11: SS —— 堆栈段寄存器

12: ES —— 附加段寄存器

 

9,10,11,12为段寄存器组

 

>> 控制寄存器

 

13: IP —— 指令指针寄存器

14: FLAGS —— 标志寄存器

13,14寄存器为控制寄存器组

 

IP: 指令指针保存下一次代码执行的地址

 

FLAGS:标志寄存器保存有符号加法之类的运算 产生溢出或者进位的进位值

 

 

>> 标志寄存器

 

图1:

 

 

 

 

图2:


 

 

图3:

 

 

 

 

图4:

 

 

图5:

 

 

图6:

 

 

图7:

 

 


在8086CPU中,有一种标记寄存器,长度为16bit;

其中存储的信息被称为程序状态字(Program Status Word,PSW),以下将该寄存器简称为flag。

功能:1)用来存储相关指令的某些执行结果;

2)用来为CPU执行相关指令提供行为依据;

3)用来控制CPU的相关工作方式。

 

flag寄存器各位示意图

注明:16位中未标明字符的各位在8086CPU中没有使用,无意义;

标明字符的各位具有特殊含义。

位 符号 英文全称 中文名称 说明(数学或逻辑运算)

0 CF Carry Flag 进位标记位 无符号数运算结果是否进位/借位

2 PF Parity Flag 奇偶标志位 运算结果二进制表示各位为1的个数(奇偶表示)

4 AF Auxiliary carry Flag 辅助进位标记位 AF=1时,向高位或高字节进位或借位

6 ZF Zero Flag 零标志位 运算结果是否为0

7 SF Sign Flag 符号标记位 有符号数运算结果的正负

8 TF Trace Flag 跟踪标记位 TF=1,产生单步中断,引发中断过程

9 IF Interrupt-enable Flag 中断允许标记位 IF=1/0,CPU允许中断或关闭中断

10 DF Direction Flag 方向标记位 字符串处理指令中DF=0/1,控制每次操作si,di的增减

11 OF Overflow Flag 溢出标记位 有符号数运算结果是否溢出

 

注明:数学或逻辑运算指令才会影响flag,包括add,sub,mul,div,inc,dec,or,and等;

mov,push,pop等传送指令对flag没有影响;

TF跟踪标志(为调试机器或调试程序发现故障而设置):

TF=1,CPU在执行完一条指令后将引发单步中断,转去执行中断处理程序;

TF=0,CPU处在连续工作状态。

IF中断允许标记位(可屏蔽中断的中断过程中CPU检测IF确定是否屏蔽中断):

IF=1,CPU执行完当前指令后,响应中断,引发中断过程;

IF=0,CPU执行完当前指令后,不响应中断。

sti,则IF=1;

cti,则IF=0.

 

 

标记寄存器在Debug中的表示
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=**** ES=**** SS=**** CS=**** IP=0100 NV UP EI PL NZ NA PO NC
位 标志 值为1的标志 值为0的标志
0 CF CY (CarrY) NC (Not Carry)
2 PF PE (Parity Even) PO (Parity Odd)
4 AF AC (Auxiliary Carry) NA (No Auxiliary carry)
6 ZF ZR (ZeRo) NZ (Not Zero)
7 SF NG (NeGative) PL (Positive)
9 IF DI (Disabled Interrupt) EI (Inabled Interrupt)
10 DF DN (DowN) UP (Up)
11 OF OV (Overflow) NV (Not Overflow)

 

 

 

 

 

posted @ 2022-03-03 20:40  冷酷的国度  阅读(232)  评论(0)    收藏  举报