概述
目录
- 数据段
- 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 是错误的
// 下面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中的值
// 指令执行序列
mov ax, 1000H
mov ds, ax
mov ax, [0]
mov bx, [2]
mov cx, [1]
add bx, [1]
add cx, [2]
// 最后结果
DS = 1000H
AX = 1123H
BX = 8833H
CX = 8833H
大小端和高低位
- 大端模式(Big Endian),是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中(高低低高)
- 小端模式(Little Endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中(高高低低)
注意:
1.ARM既可以工作在大端模式,也可以工作在小端模式
2.大小端说的是内存地址高低位与其保存的数据的高低位的关系,而大小端的特性是由CPU决定的,更具体地说,是由数据总线的安装顺序决定的。不同的CPU生产厂商,数据总线的安装顺序不同,也就产生了大端模式和小端模式
3.大端模式内存地址的高低位与数据的高低位相反,小端模式内存地址的高低位与数据的高低位一致
4.一般我们画内存图的时候,都是低地址在上,高地址在下,从上往下内存地址逐渐递增。从这个角度来说,大端模式更符合人类的阅读习惯
练习
第一题 :
写出下面指令执行后寄存器ax,bx,cx中的值
// 指令执行序列
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.再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些又是程序?
// 指令执行序列
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 指令
mov 寄存器, 数据 // 将数据写入到寄存器,比如: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指令 一样,都有两个操作对象。他们可以有以下几种形式:
// 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是小端模式
mov 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 汇编(四)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复