目录
- 数据段
- DS 和 [address]
- 字型数据的传递(2个字节)
- 大小端和高低位
- 练习
- mov 指令
- add 和 sub 指令
- 注意
数据段
- 对于8086CPU来说,在编程时,可以根据需求,将一组内存单元定义为一个数据段段
- 我们可以将一组长为N(N<=64K)、地址连续、起始地址为16整数倍的内存单元当做专门存储数据的的内存空间,称为数据段。
比如 123B0H ~ 123B9H 这段内存空间用来存放数据,我们可以认为 123B0H ~ 123B9H 是一个数据段,它的段地址为123BH,长度为10字节 - 如何访问数据段中的数据 – 用DS存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元
DS 和 [address]
- CPU要读写一个内存单元时,必须要先给出这个内存单元的地址
在8086中,内存地址由段地址和偏移地址组成 - 8086中有一个DS段寄存器,通常用来存放要访问数据的段地址
- 8086不支持将数据直接送入段寄存器(CS、DS、SS、ES),即 mov ds, 1000H 是错误的
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// 下面3条指令的作用是将 10000H(1000:0000) 内存中的数据赋值到 al寄存器 中 // mov al, [address] 的意思是将 DS:address 中的内存数据赋值到 al寄存器 中 // 由于al是ax的低8位寄存器,所以将一个字节的数据赋值给al寄存器 mov bx, 1000H mov ds, bx mov al, [0] // 下面3条指令的作用是将 al寄存器 中的数据写入到内存 10000H(1000:0000) 中 // mov [address], al 的意思是将 al寄存器 中的数值 写入到内存 DS:address 中 // 由于al是ax的低8位寄存器,所以将一个字节的数据写入到内存中 mov bx, 1000H mov ds, bx mov [0], al
字型数据的传递(2个字节)
写出下面指令执行后寄存器ax,bx,cx中的值
复制代码
1
2
3
4
5
6
7
8
9// 指令执行序列 mov ax, 1000H mov ds, ax mov ax, [0] mov bx, [2] mov cx, [1] add bx, [1] add cx, [2]
复制代码
1
2
3
4
5
6// 最后结果 DS = 1000H AX = 1123H BX = 8833H CX = 8833H
大小端和高低位
- 大端模式(Big Endian),是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中(高低低高)
- 小端模式(Little Endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中(高高低低)
注意:
1.ARM既可以工作在大端模式,也可以工作在小端模式
2.大小端说的是内存地址高低位与其保存的数据的高低位的关系,而大小端的特性是由CPU决定的,更具体地说,是由数据总线的安装顺序决定的。不同的CPU生产厂商,数据总线的安装顺序不同,也就产生了大端模式和小端模式
3.大端模式内存地址的高低位与数据的高低位相反,小端模式内存地址的高低位与数据的高低位一致
4.一般我们画内存图的时候,都是低地址在上,高地址在下,从上往下内存地址逐渐递增。从这个角度来说,大端模式更符合人类的阅读习惯
练习
第一题 :
写出下面指令执行后寄存器ax,bx,cx中的值
复制代码
1
2
3
4
5
6
7
8
9// 指令执行序列 mov ax, 1000H mov ds, ax mov ax, 11316 mov [0], ax mov bx, [0] sub bx, [2] mov [2], bx
第二题:
各寄存器的初始值:CS=2000H,IP=0000H,DS=1000H,AX=0000H,BX=0000H;
1.写出CPU执行的指令序列(用汇编指令写出)
2.写出CPU执行完指令后,CS、IP和相关寄存器中的数值
3.再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些又是程序?
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// 指令执行序列 mov ax, 6622H jmp 0ff0:0100 // 段地址0ff0 x 16 = ff000H, 然后加上偏移地址 0100 = 10000H) mov ax, 2000H mov ds, ax mov ax, [0008] mov ax, [0002] // 最后结果 CS = 0FF0H IP = 010BH DS = 2000H AX = EA66H BX = 0000H
mov 指令
复制代码
1
2
3
4
5
6
7
8
9mov 寄存器, 数据 // 将数据写入到寄存器,比如:mov ax, 0008H mov 寄存器1, 寄存器2 // 将寄存器2的数据写入到寄存器1,比如:mov ax, bx mov 寄存器, 内存单元 // 将内存单元的数据写入到寄存器,比如:mov ax, [0] mov 内存单元, 寄存器 // 将寄存器的数据写入到内存单元中,比如:mov [0], ax mov 段寄存器, 寄存器 // 将寄存器中的数据写入到段寄存器中,比如:mov ds, ax mov 寄存器, 段寄存器 // 将段寄存器中的数据,写入到寄存器中,比如:mov ax, ds
注意:"mov 内存单元1, 内存单元2 " 是不允许的,比如 mov [0], [1]。因为这里连个寄存器都没有,CPU怎么知道读多少字节,写多少字节。
add 和 sub 指令
add指令 和 sub指令 同 mov指令 一样,都有两个操作对象。他们可以有以下几种形式:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12// add 指令 add 寄存器, 数据 // 将数据和寄存器中的值相加,结果保存到寄存器中,比如:add ax, 0008H add 寄存器1, 寄存器2 // 将寄存器2中的值和寄存器1中的值相加,结果保存到寄存器1中,比如:add ax, bx add 寄存器, 内存单元 // 将内存单元中的值与寄存器中的值相加,结果保存到寄存器中,比如:add ax, [0] add 内存单元, 寄存器 // 将寄存器中的值和内存单元中的值相加,结果保存到内存单元中,比如:add [0], ax // sub 指令 sub 寄存器, 数据 // 将寄存器中的值减去数据,结果保存到寄存器中,比如:sub ax, 0008H sub 寄存器1, 寄存器2 // 将寄存器1中的值减去寄存器2中的值,结果保存到寄存器1中,比如:sub ax, bx sub 寄存器, 内存单元 // 将寄存器中的值减去内存单元中的值,结果保存到寄存器中,比如:sub ax, [0] sub 内存单元, 寄存器 // 将内存单元中的值减去寄存器中的值,结果保存到内存单元中,比如:sub [0], ax
注意
- 8086CPU是小端模式
复制代码
1
2
3
4
5mov ax, [0008] // CPU从DS:0008H处开始读取2个字节的数据 mov al, [0008] // CPU从DS:0008H处开始读取1个字节的数据 mov ah, [0008] // CPU从DS:0008H处开始读取1个字节的数据 总结:CPU是根据寄存器的位数来决定从 DS:0008H 处读取多少位的数据的
最后
以上就是大意心情最近收集整理的关于8086 汇编(四)的全部内容,更多相关8086内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复