(八)汇编语言——数据处理的两个基本问题

2023-01-08 09:17:24 浏览数 (1)

目录

用于内存寻址的寄存器

bp

组合

两个基本问题

数据位置

立即数

寄存器

内存

数据长度

除法指令

dup指令

总结


        接下来,我们要处理的是有关数据处理的两个基本问题,那么这两个基本问题是什么呢?我们先告诉大家这两个问题,到时候再来慢慢解决:第一个就是我们要处理的数据在什么地方?第二个就是要处理的数据有多长?好啦,就让我们开始吧!

用于内存寻址的寄存器

        我们之前介绍过,8086一共有14个寄存器: 通用寄存器:AX、BX、CX、DX; 变址寄存器:SI、DI; 指针寄存器:SP、BP; 指令指针寄存器:IP; 段寄存器:CS、SS、DS、ES; 标志寄存器:PSW          之前介绍的是通用寄存器,但是我们用来寻址的寄存器有哪些呢?答案是只有bx、bp、si、di可以用在[...]对内存单元寻址,但是他们也不能乱用,我们接下来就来详细的介绍一下用法。

bp

        bp寄存器和bx寄存器是类似的,但是两者也有区别:bx默认指ds段;bp默认指ss段。但是呢,只需要在前面加上段地址即可改变。

组合

        这些寄存器的用法也不是可以乱用的,我们来看看,bx和bp只能搭配si和di来用,bx和bp,si和di不能组合,具体关系如下图所示:

两个基本问题

        好啦,我们接下来就来介绍一下这两个基本问题:要处理的数据在什么地方?要处理的数据有多长?

数据位置

        我们在程序中,数据位置一般是由三个:立即数,寄存器,内存。

立即数

        对于直接包含在机器指令中的数据,称为立即数(idata),数据包含在指令中。

寄存器

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

内存

       主要包括段地址(SA)和偏移地址(EA),指令要处理的数据在内存中,由SA:EA确定内存单元。

数据长度

        数据长度主要包括了字和字节。我们一般是用word ptr或byte ptr指明,在没有寄存器参与的内存单元访问指令中,用word ptr或byte ptr显性地指明所要访问的内存单元的长度是很必要的,否则,CPU无法得知所要访问的单元是字单元,还是字节单元。

除法指令

        div是除法指令,使用div作除法的时候,被除数:(默认)放在AX或DX和AX中,除数:8位或16位,在寄存器或内存单元中。总而言之,就是高位放余数,低位放商。

被除数

AX

DX和AX

除数

8位内存或寄存器

16位内存或寄存器

AL

AX

余数

AH

DX

        我们来看一个例子,用div计算data段中第一个数据除以第二个数据后的结果,商存放在第3个数据的存储单元中。

代码语言:javascript复制
// 数据段
data segment
dd 100001
dw 100
dw 0
data ends
代码语言:javascript复制
// 代码段
mov ax,data
mov ds,ax
mov ax,ds:[0]
mov dx,ds:[2]
div word ptr ds:[4]
mov ds:[6],ax

dup指令

        其实dup指令的话,不难理解,但是却非常重要,dup和db、dw、dd等数据定义伪指令配合使用,用来进行数据的重复。我们举个例子就好了,比如你想定义一个容量为200字节的栈段,我们可能会这样去做:

代码语言:javascript复制
// 不使用dup
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends

        但是我们如果使用dup指令的话,代码就会变成下面这样。怎么样,是不是特别简介明了。好啦,关于dup指令我们就介绍这么多。

代码语言:javascript复制
// 使用dup
stack segment
db 200 dup(0)
stack ends

总结

        状态恢复,继续学习,加油!!!!

0 人点赞