我是靠谱客的博主 大意心情,最近开发中收集的这篇文章主要介绍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 是错误的
// 下面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

// 指令执行序列
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),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中(高高低低)
    大小端00

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

练习

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

// 指令执行序列
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

// 指令执行序列
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 汇编(四)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部