@fiy-fish
2017-04-12T23:30:04.000000Z
字数 2375
阅读 1723
汇编语言
CPU构成:运算器,控制器,寄存器
运算器:信息处理
寄存器:信息存储
控制器:控制各种器件进行工作
内部总线:链接各种器件,数据传送
8086寄存器:AX BX CX DX SI DI SP BP IP CS SS DS ES PSW
通用寄存器:AX、BX、CX、DX
8086所有寄存器都是16位,存两个字节
AX=AH+AL
BX=BH+BL
CX=CH+CL
DX=DH+DL
字在寄存器中的存储
字: word = 2byte 两个字节构成,分别称为这个字的高位字节和地位字节
几条汇编指令
汇编指令 | 控制CPU完成的操作 | 用高级语言的语法描述 |
---|---|---|
mov ax,18 | 将18送入寄存器AX | AX=18 |
mov ah,78 | 将78存入寄存器AH | AH=78 |
add ax,8 | 将寄存器AX中的数值加上8 | AX=AX+8 |
mov ax,bx | 将寄存器BX中的数据宋日寄存器AX | AX=BX |
add ax,bx | 将AX和BX中的数值相加,结果在AX中 | AX=AX+BX |
上面的指令都不区分大小写AX=ax; MOV = mov; ADD = add
练习:下面的指令结果?
程序段中的指令 | 指令执行后AX中的数据 | 指令执行后BX中的数据 |
---|---|---|
mov ax,4E20H | 4E20H | 0000H |
add ax,1406H | 6226H | 0000H |
mov bx,2000H | 6226H | 2000H |
add ax,bx | 8226H | 2000H |
mov bx,ax | 8226H | 8226H |
add ax,bx | ? | 8226H |
ax+bx = 1044CH
8086 寄存器只能存储16位2进制,这里把最高位1抹掉,结果为 044CH
如果是32位寄存器,则结果为1044CH
练习2
指令 | AX结果 | - |
---|---|---|
mov ax,00C5 | 00C5 | - |
mov al,93 | ? | - |
按理来说是0158,但是mov al 是在 al这个单独的寄存器上进行操作,8086中只能存放两位十六进制数据,8086中答案是58
物理地址:内存单元在一维线性空间的唯一地址
16位结构的CPU
8086 CPU 给出物理地址的方法
8086
8086有20条地址总线,可是他本身是16位CPU,为了能高效利用这20条地址总线,我们采用了使用两个16位来合成20位
段的概念
段地址肯定是16的倍数
16位地址的寻址能力是64KB,一个段的最长为64KB
段寄存器:CS,DS,SS,ES
CS 和 IP
CS:代码段寄存器
IP:指令指针寄存器
任意时刻,CPU将执行CS:IP中的指令
CPU的工作过程
凡是被CS:IP指向的内容都是指令不是数据
修改CS、IP的指令
CPU中程序员能修改的部件只有寄存器,通过改变寄存器中的内容实现对CPU的控制
程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令
mov :传送指令,改变寄存器中的值,不能改变CS寄存器
jmp指令修改CS、IP
jmp 段地址:偏移地址(同时修改CS、IP内容)
jmp 2AE3:3 执行之后,CS=2AE3H, IP=0003H,CPU从2AE33H处读取指令
jmp 3:0B16 执行之后,CS=0003H, IP=0B16, CPU从00B46H处读取指令
jmp 段地址:偏移地址
指令功能为,用指令中给出的段地址修改CS,偏移地址修改IP
只修改IP内容:jmp 某一合法寄存器
jmp ax = jmp IP ax(IP = ax)
代码段:
跟数据一样,代码段也是一段数据,CUP会把CS:IP中的数据当做代码指令执行,我们要执行一段代码只需要把CS:IP指向那段代码段内存就好。
小结:
1. 段地址在8086CPU的段寄存器中存放,当8086CPU要访问内存时,由段寄存器提供内存 单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址
2. CS存放指令的段地址,IP存放指令的偏移地址
8086机中,任意时候,CPU将CS:IP指向的内容当做指令执行
3. 8086CPU的工作过程:
- 1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
- 2. IP指向下一条指令
- 3. 执行指令(转到第一步,重复整个过程)
Debug 是DOS、Windows提供的程序调试工具
Debug 功能
进入Debug
windows 电脑开始->运行->输入“command”
R命令 : 查看改变CPU寄存器的内容
查看寄存器内容
D命令:查看内存中的内容
查看1000:10之后的内存
E命令:改写内存中的内容
在1000:10 1000:11 1000:12 1000:13 1000:14
分别写入 A B C D E
U命令:查看内存中机器码的含义(把指定内存中的数据 翻译为机器码)
查看1000:10之后所有机器码(也就是把1000:10之后的所有内容翻译成机器码)
T命令:执行CS:IP 指向的机器码
A命令:以汇编指令的形式在内存中写入机器码
在1000:10处写入汇编指令 MOV AX,1