8086 汇编笔记(七):数据处理的两个基本问题

2024-06-04 11:44

本文主要是介绍8086 汇编笔记(七):数据处理的两个基本问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、bx、si、di 和 bp

在使用过程中有几处需要注意的地方:

(1)在 8086CPU 中,只有这4个寄存器可以用在“[....]”中来进行内存单元的寻址。其他寄存器是不可以的,例如“mov bx, [ax]”就是错误的用法。

(2)在[...]中,这四个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。为了方便记忆可以将si和di看做一组,将bx和bp看做一组。组间可以自由组合,组内不能组合。

以下指令都是正确的: 

mov ax,[bx]
mov ax,[si]
mov ax,[di]
mov ax,[bp]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp+si]
mov ax,[bp+di]
mov ax,[bx+si+idata]
mov ax,[bx+di+idata]
mov ax,[bp+si+idata]
mov ax,[bp+di+idata]

(3)只要在[...]中使用寄存器bp,而指令中没有显性的给出段地址,则段地址就默认在ss中。 

mov ax,[bp]                ;含义:(ax)=((ss)*16+(bp))
mov ax,[bp+idata]          ;含义:(ax)=((ss)*16+ (bp)+idata)
mov ax,[bp+si]            ;含义:(ax)=((ss)*16+(bp)+(si))
mov ax,[bp+si+idata]      ;含义:(ax)=((ss)*16+(bp)+(si)+idata)

二、汇编语言中数据位置的表达 

(1)立即数

对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),汇编语言中称为立即数(idata),在汇编指令中直接给出。 例如:

mov ax, 1
or bx, 00100000B

(2)寄存器

指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。例如:

mov ax, bx
push bx

(3)段地址(SA)和偏移地址(EA)

指令要处理的数据在内存中,在汇编语言中可以用[X]的格式给出EA,SA在某个段寄存器中。

存放段地址的寄存器可以是默认的,也可以显性给出。例如:

;段寄存器默认存储在DS中mov ax, [0]mov ax, [bx]mov ax, [di]...;段寄存器默认存储在SS中mov ax, [bp]mov ax, [bp+si]mov ax, [bp+di]...;段寄存器显性给出mov ax, ds:[bp]mov ax, es:[3]mov ax, ss:[bx+si]mov ax, cs:[bx+si+8]

三、寻址方式

四、指令要处理的数据有多长

8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作。对于这个问题,汇编语言中用以下方法处理。

(1)通过寄存器名指定要处理的数据的尺寸。如果寄存器名是字型寄存器(如ax、bx等),则说明指令进行的是字操作。如果寄存器名是字节型寄存器(如al、ah、bl等),则说明指令进行的是字节操作。

(2)在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word或byte。这种情形适用于没有寄存器参与的内存单元访问指令中。例如:

;下面的指令,用word ptr指明了指令中访问的内存单元是一个字单元
mov word ptr ds:[0], 1
inc word ptr [bx];下面的指令,用byte ptr指明了指令访问的内存单元是一个字节单元
mov byte ptr ds:[0], 1
inc byte ptr [bx]

五、div 指令

div是除法指令。在使用的过程中应注意以下问题:

(1)除数:有8位和16位两种,在一个reg(寄存器)或内存单元中。

(2)被除数:默认放在 AXDX 和 AX 中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。

(3)结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。

当除数是8位时,被除数默认是一个16位数,存储在AX寄存器中。执行div指令后:

  • 商存储在AL寄存器中。
  • 余数存储在AH寄存器中。

例如:

mov ax, 1234h   ; 将1234h放入AX作为被除数
mov bl, 10h     ; 将10h放入BL作为除数
div bl          ; 执行除法,AL得到商,AH得到余数

当除数是16位时,被除数是一个32位数,由DX寄存器存放高16位,AX寄存器存放低16位。执行div指令后:

  • 商存储在AX寄存器中。
  • 余数存储在DX寄存器中。

例如:

mov dx, 00FFh   ; 高16位放入DX
mov ax, 1234h   ; 低16位放入AX,构成32位被除数
mov bx, 100h    ; 16位除数放入BX
div bx          ; 执行除法,AX得到商,DX得到余数

六、伪指令 dd

dd用来定义dword(双字)型数据 

七、dup

dup(duplication的缩写)用来重复开辟内存空间。

dup指令要和db、dw、dd等数据定义伪指令配合使用,使用格式如下:

db 重复次数 dup (重复的字节型数据) dw 重复次数 dup (重复的字型数据) dd 重复次数 dup (重复的双字型数据)

例如,如下代码表示定义了9个字节:

db 3 dup (0,1,2)    ;它们是0、1、2、0、1、2、0、1、2

这篇关于8086 汇编笔记(七):数据处理的两个基本问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029985

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基