汇编语言之数据处理的2个基本问题



1、bx、si、di和bp

Bx、si和di这3个寄存器我们已经学过了,现在进行一下总结,并学一下bp。

1:在8086CPU中,只有这4个寄存器可以用在[…]中来进行内存单元的寻址。比如,下面的指令都是正确

的:

Mov ax, [bx]

Mov ax, [bx+si]

Mov ax, [bx+di]

Mov ax, [bp]

Mov ax, [bp+si]

Mov ax, [bp+di]

而下面的指令是错误的:

Mov ax, [ax]

Mov ax, [cx]

Mov ax, [dx]

Mov ax, [ds]

2:在[…]中,这4个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。

比如,下面的指令是正确的:

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]

而下面的指令是错误的:

Mov ax, [bx+bp]

Mov ax, [si+di]

 
我们可以在访问内存单元的指令中显式地给出内存单元的段地址所在的段寄存器。

比如:mov ax, SS:[bx]    ;段地址在SS中。

      Mov ax, DS:[bp]    ;段地址在DS中。

      Mov ax, CS:[bp]    ;段地址在CS中。

      Mov ax, ES:[bp]    ;段地址在ES中。

在上面的指令:mov ax, ES:[bp] 中,我们接触到了一个新的段寄存器ES,ES叫附加段寄存器,它的功能与

DS基本相同。

如果在[…]中使用寄存器bp,而指令中没有显式地给出段地址,段地址就默认在SS中。比如,下面的指令:

Mov ax, [bp+200] 内存单元[bp+200]的段地址就在SS中。

BP被称作基址指针寄存器,它可以作SP使用,除了BP可以作为间接寻址寄存器而SP不能外,其余功能基

本相同。
 

事实上,通用寄存器除了ax、bx、cx、dx这4个外,还包括sp、bp、si、di这4个16位寄存器,以及ah、

al、bh、bl、ch、cl、dh、dl这8个8位寄存器,通用寄存器一共有以上这16个。


2、机器指令处理的数据在什么地方

绝大部分机器指令都是进行数据处理的指令,处理大致可分为3类:读取、写入、运算。在机器指令这一层来

讲,并不关心数据的值是多少,而关心指令执行前一刻,它将要处理的数据所在的位置。指令在执行前,所要处理

的数据可以在3个地方:CPU内部、内存、端口,比如下图所列的指令:

 


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

在汇编语言中如何表达数据位置?汇编语言中用3个概念来表达数据的位置,即立即数、寄存器、地址(偏移

地址和段地址)。

1. 立即数(idata)

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

例:mov ax, 136aH    ;指令要处理的数据就是立即数136aH。

Add ax, 2000H    ;指令要处理的数据就是立即数2000H。

Sub ax, a2c7H    ;指令要处理的数据就是立即数a2c7H。

2. 寄存器

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

例:mov ax, bx    ;指令要处理的数据在bx中。

Mov ds, ax    ;指令要处理的数据在ax中。

Push bx    ;指令要处理的数据在bx中。

Mov DS:[123a], bx    ;指令要处理的数据在bx中。

3. 段地址和偏移地址

指令要处理的数据在内存中,在汇编指令中可用[…]的格式给出偏移地址,段地址在某个段寄存器中。比如以下

的指令:

Mov ax, [107a]

Mov ax, [di]

Mov ax, [bx+8]

Mov ax, [bx+si]

Mov ax, [bx+si+8]

指令要处理的数据偏移地址在[…]中,段地址默认在DS中。

下面的指令:

Mov ax, [bp]

Mov ax, [bp+8]

Mov ax, [bp+si]

Mov ax, [bp+si+8]

指令要处理的数据偏移地址在[…]中,段地址默认在SS中。

存放段地址的寄存器也可以是显性给出的,比如以下指令:

mov ax, DS:[bp]    ;指令要处理的数据,段地址在DS中。

Mov ax, ES:[bx]    ;指令要处理的数据,段地址在ES中。

Mov ax, SS:[bx+si]    ;指令要处理的数据,段地址在SS中。

Mov ax, CS:[bx+si+8]    ;指令要处理的数据,段地址在CS中。

 


4、寻址方式


对寻址方式进行一下总结,见下表:表中EA=偏移地址,SA=段地址,寄存器加上一个小括号,表示这个

寄存器中的数值,比如第二条含义:EA=(bx);SA=(ds),(bx)就表示bx中的数值,(ds)就表示ds中的数

值。

 


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

8086CPU的指令,可以处理两种尺寸的数据:byte和word。所以在机器指令中要指明,指令进行的是字操

作还是字节操作,对于这个问题,汇编语言中用以下方式处理。

1. 通过寄存器名指明要处理的数据的尺寸。

例如,下面的指令中,寄存器指明了指令进行的是字操作,因为这些寄存器是16位的。

Mov ax, 123H

Mov bx, DS:[210a]

Add ax, 1000H

Sub bx, 2ffH

下面的指令中,寄存器指明了指令进行的是字节操作,因为这些寄存器是8位的。

Mov al, 12H

Mov bl, DS:[210a]

Add al, 10H

Sub bl, 2fH

2. 在没有寄存器名存在的情况下,用操作符word prt或byte prt指明内存单元的长度,前者为字单元,后者

为字节单元。

例如,下面的指令中,用word ptr指明了指令访问的内存单元是一个字单元。

Mov word ptr DS:[a017], 28H

Add word ptr [bx], 78H

下面的指令中,用byte prt指明了指令访问的内存单元是一个字节单元。

Mov byte ptr DS:[1a7], 1aH

Add byte ptr [bx], 62H

在没有寄存器参与的内存单元访问指令中,用word ptr或byte ptr显性地指明所要访问的内存单元的长度是

很必要的,否则,CPU无法得知所要访问的单元是字单元还是字节单元,从而造成出错。

3. 其它方法。有些指令默认了访问的是字单元还是字节单元,比如:push [123a]和pop[123c]就不用指明访

问的是字单元还是字节单元,因为push和pop指令只进行字操作。


6、mul指令

Mul为乘法指令,使用mul做乘法的时候,注意以下两点:

1. 两个相乘的数:这两个相乘的数,要么都是8位,要么都是16位,如果是8位,一个默认放在al中,另一

个放在8位寄存器或内存字节单元中;如果是16位,一个默认放在ax中,另一个放在16位寄存器或内存字单元

中。

2.结果:如果是8位乘法,结果默认放在ax中,如果是16位乘法,结果高位默认在dx中存放,低位在ax

中存放。

指令格式如下:

Mul 通用寄存器

Mul 内存单元

内存单元可以用不同的寻址方式给出,比如:

Mul byte ptr DS:[7102]    ;8位乘法。

Mul word ptr [bx+si+8]    ;16位乘法。

例1:计算100×10。

100和10都小于255,可以做8位乘法,代码如下:

Mov al, 100

Mov bl, 10

Mul bl

结果:ax=al×bl=100×10=1000(3E8H)

例2:计算100×10000。

100小于255,可10000大于255,所以必须做16位乘法,代码如下:

Mov ax, 100

Mov bx, 10000

Mul bx

结果:ax×bx=100×10000=1000000(F4240H)

Ax=4240H  dx=FH


7、div指令

Div是除法指令,使用div做除法的时候,应注意以下问题:

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

2. 被除数:如果除数为8位,被除数则为16位,默认放在ax中;如果除数为16位,被除数则为32位,在

Dx和ax中存放,dx存放高16位,ax存放低16位。

3. 结果:如果除数为8位,则al存储结果的商,ah存储结果的余数;如果除数为16位,则ax存储结果的

商,dx存储结果的余数。

指令格式如下:

Div 通用寄存器

Div 内存单元

内存单元可以用不同的寻址方式给出,比如:

Div byte ptr DS:[21a5]    ;除数为8位的除法。

Div word ptr [bx+si+8]    ;除数为16位的除法。

例1:计算100001÷100。

被除数100001为32位,转化成16进制为186a1H,低16位值86a1H放在ax中,高16位值1H放在

Dx中,除数100转化为16进制64H后,放在一个16位寄存器中,代码如下:

Mov dx, 1H

Mov ax, 86a1H

Mov bx, 64H

Div bx

结果:(dx×10000H+ax)÷bx=186a1H÷64H=3E8H余1。

Ax=3e8H(1000)  dx=1H

例2.计算1001÷100。

被除数1001可用ax存放,除数100可用8位寄存器存放,代码如下:

Mov ax, 1001

Mov bl, 100

Div bl

结果:ax÷bl=1001÷100=10余1。

Al=10  ah=1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nvm用标准sata ahci码_能者多劳!让NVMe固态硬盘做系统盘的同时,加速SATA数据盘...

不知不觉当中,固态硬盘已经取代机械硬盘成为主流。越来越多的玩家已经淘汰机械盘,使用NVMeSATA的固态硬盘高低搭配。既然是高低搭配,就一定会有性能差距,是否能从NVMe固态硬盘中划分出一小部分空间来给SATA固态硬盘加速&#xff0…

天了噜!定义static字段还有顺序要求?

前言前段时间,发现一个bug,代码结构类似下面的示例。你能说出这段代码的正确返回结果吗?class Program {private static int a1 a2;private static int a2 Init();private static int Init(){return 123;}static void Main(string[] args){…

汇编语言之转移指令和原理

1、引言 可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存 中某处代码的指令。 8086CPU的转移行为有以下几类: 1. 同时修改CS和IP时,称为段间转移&#…

【高德地图开发2】---配置工程

1.从网站下载开发包并解压。 3D地图包解压后得到:3D地图显示包“Android_Map_2.x.x.jar ”和文件夹“ armeabi ”(以 V2.2.0为例,含 - libamapv302.so 和 libmapv302ex.so 文件)。2D地图包解压后得到:2D地图显示包“An…

antd option宽度自适应_建议收藏:Axure手机自适应教程

hello,我又来啦,今天和大家分享用axure怎么做自适应,也就是说,我们做app端的作品时,怎么在不同的手机尺寸,显示最佳的样式。那么这期的话,我会以一个游戏的案例来展开,所以比较好玩。…

安装pip

2019独角兽企业重金招聘Python工程师标准>>> linux系统安装pip: 1.下载get-pip.py wget https://bootstrap.pypa.io/get-pip.py 2.安装pip python get-pip.py windows系统安装pip,这里使用easy_install: 1.首先在命令行切换到easy_install.exe所在的Scri…

所以,路遥工具箱到底是什么东西?

笔者的软件开发生涯是从 2008 年开始的,彼时还是 2G 时代。站长之家是笔者当时经常访问的网站,站长工具也成为当时探索网络世界时的入门工具。软件开发这些年也是浑浑噩噩的度过,鲜有建树。2020 年之前也写了一些小工具用于解决一些注入字符串…

刷1000遍奥数题,不如学会这几道逻辑题,让孩子秒懂数学,学习早开窍!

▲ 点击查看前阵子发现一个英国BBC制作的纪录片,叫《逻辑的乐趣》(The Joy Of Logic),介绍了逻辑的概念,逻辑的发展史,及其在现实生活中的应用和价值。讲解非常有意思,深入浅出,风趣…

oracle技术之顺序文件上的索引(一)

顺序文件上的索引(一)研究索引结构,我们首先来考虑最简单的一种:由一个称为数据文件的排序文件得到另一个称为索引文件的文件,而这个索引文件由键-指针对组成。在索引文件中查找键K通过指针指向数据文件中查找键为K的记…

汇编语言之标志寄存器

1、标志寄存器 CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下3种作 用: 1. 用来存储相关指令的某些执行结果。 2. 用来为CPU执行相关指令提供行…

web网页的表单排版利器--960css

表单排版样式 960css 前言 一般web网页的表单排版,大家都习惯用table排版,自己需要根据实际需要去定义TR和TD,很多时候对于TD的高宽度、是否合并行,合并列,都要去做一些处理,这些都是比较繁琐的工作。找到一…

c语言将十进制转化为二进制算法_base64算法初探即逆向分析

算法分析虽说base64严格意义上来说并不能算是加密算法,但的确应用方面来说还算是比较广,在CTF的算法逆向中Base系列算是也比较常见的,萌新刚开始学算法,就以base64为例,对该算法进行一个简单的分析。简单来说&#xff…

新功能抢先看!Windows 11 2022 版全新 ISO 镜像来了+下载

面向 Dev 频道的 Windows 预览体验成员,微软现已发布 Windows 11 操作系统全新 ISO 镜像文件,此版本 ISO 镜像整合了自 Build 22449 至 Build 22533 的所有功能。文件名称:windows11_insiderpreview_client_x64_zh-cn_22533.iso 文件大小: 4.64 GB MD5:…

这是哪里来的小妖精!!!

1 或许小鸟依人就是怎么来的吧2 果然球体运动全靠弹。。3 小猫咪从爬猫架下来时的样子萌爆了....4 这猫也是很配合了~5 以后请不要说“有朝一日”,请说“下周五晚七点我请你吃火锅”,“三分钟后我给你打钱”,“现在我就喜欢你”。6 内容来源于…

汇编语言之常见的汇编指令

1、常见汇编指令 1. 传送指令(4个):mov、push、pop、lea。2. 转移指令(8个):call、jmp、je、jne、jb、jnb、ja、jna。3. 运算指令(7个):add、sub、mul、div、adc、sbb、c…

java list 初始化_Java新特性:数据类型可以扔掉了?

在很久很久以前,我们写代码时要慎重的考虑变量的数据类型,比如下面这些: 枚举:尽管在 JDK 5 中增加了枚举类型,但是 Class 文件常量池的 CONSTANT_Class_info 类型常量并没有发生任何语义变化,仍然是代表一…

Kubernetes应用程序开发认证(CKAD) 经验分享

众所周知,Kubernetes在容器编排器大战中脱颖而出后,从2020年以来变得越发的火热。那么云原生计算基金会(CNCF)联合Linux基金会就适时的推出了皆在考察相关从业者对Kubernetes的运维和开发知识了解程度的认证考试,分别是…

【数据结构入门精讲 | 第十九篇】考研408、企业面试图专项练习(二)

在上一篇中我们进行了图的专项练习,在这一篇中我们重点探讨图的编程专项习题。 目录 R7-1 城市间紧急救援R7-2 地铁一日游R7-3 最小生成树的唯一性R7-4 网红点打卡攻略R7-5 畅通工程之最低成本建设问题R7-6 寻宝图R7-7 逆散列问题R7-8 任务调度的合理性R7-9 关键活动…