我是靠谱客的博主 大意心情,这篇文章主要介绍8086 汇编(四),现在分享给大家,希望可以做个参考。

目录

    • 数据段
    • 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中的值
内存图00

复制代码
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),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中(高高低低)
    大小端00

注意:
1.ARM既可以工作在大端模式,也可以工作在小端模式
2.大小端说的是内存地址高低位与其保存的数据的高低位的关系,而大小端的特性是由CPU决定的,更具体地说,是由数据总线的安装顺序决定的。不同的CPU生产厂商,数据总线的安装顺序不同,也就产生了大端模式和小端模式
3.大端模式内存地址的高低位与数据的高低位相反,小端模式内存地址的高低位与数据的高低位一致
4.一般我们画内存图的时候,都是低地址在上,高地址在下,从上往下内存地址逐渐递增。从这个角度来说,大端模式更符合人类的阅读习惯

练习

第一题 :
写出下面指令执行后寄存器ax,bx,cx中的值
内存图01

复制代码
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

指令执行过程01

第二题:
各寄存器的初始值:CS=2000H,IP=0000H,DS=1000H,AX=0000H,BX=0000H;
1.写出CPU执行的指令序列(用汇编指令写出)
2.写出CPU执行完指令后,CS、IP和相关寄存器中的数值
3.再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些又是程序?
内存图02

复制代码
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
9
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指令 一样,都有两个操作对象。他们可以有以下几种形式:

复制代码
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
5
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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(83)

评论列表共有 0 条评论

立即
投稿
返回
顶部