文章目录
- 数据处理的两个基本问题
- bx、si、di、bp
- 机器指令处理的数据所在位置
- 汇编语言中数据位置的表达
- 寻址方式
- 指令要处理的数据有多长?
- div 指令
- 伪指令 dd
- dup
数据处理的两个基本问题
我们知道,计算机是进行数据处理、运算的机器,那么有两个基本的问题就包含在其中:
- 处理的数据在什么地方?
- 要处理的数据有多长?
bx、si、di、bp
bx寄存器(Base Register):通常用作基址寄存器,用于存储数据的基地址,常用于访问数据段中的数据。
si寄存器(Source Index Register):通常用作源索引寄存器,用于存储源数据的索引,常用于数据传输操作。
di寄存器(Destination Index Register):通常用作目的索引寄存器,用于存储目的数据的索引,也常用于数据传输操作。
bp寄存器(Base Pointer Register):通常用作基址指针寄存器,用于存储栈帧的基地址,常用于访问栈中的数据。
在8086CPU 中,只有这4个寄存器(bx、bp、si、di)可以用在“[…]” 中来进行内存单元的寻址。
在“[…]” 中,这4个寄存器(bx、bp、si、di)可以单个出现,或只能以四种组合出现:bx和si、bx和di、bp和si、bp和di。
机器指令处理的数据所在位置
指令在执行前,所要处理的数据可以在三个地方: CPU内部、内存、端口
汇编语言中数据位置的表达
汇编语言中用三个概念来表达数据的位置:
- 立即数(idata)
- 寄存器
- 段地址(SA)和偏移地址(EA)
1)立即数(idata):对于直接包含在机器指令中的数据(执行前在cPu 的指令缓冲器中),在汇编语言中称为:立即数(idata ) ,在汇编指令中直接给出。例如:mov ax,1
2)寄存器:指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。例如:mov ax,bx
3)段地址(SA)和偏移地址(EA) :指令要处理的数据在内存中,在汇编指令中可用[X]的格式给出EA,SA在某个段寄存器中。存放段地址的寄存器可以是默认的,也可以显性的给出。
寻址方式
当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式。
指令要处理的数据有多长?
当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式。
用word ptr指明了指令访问的内存单元是一个字单元:
mov word ptr ds:[0],1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2
用byte ptr指明了指令访问的内存单元是一个字节单元:
mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2
在没有寄存器参与的内存单元访问指令中,用word ptr或byte ptr显性地指明所要访问的内存单元的长度是很必要的,否则,CPU无法得知所要访问的单元是字单元,还是字节单元。
有些指令默认了访问的是字单元还是字节单元,比如:push [1000H]就不用指明访问的是字单元还是字节单元,因为push指令只进行字操作。
div 指令
div是除法指令(division),使用div作除法的时候:
- 除数:8位或16位,在寄存器或内存单元中
- 被除数:(默认)放在AX 或 DX和AX中
除数为8位时,被除数为16位(AX),除数为16位时被除数为32位(DX+AX)。
div指令格式:
- div reg
- div 内存单元
编程1:利用除法指令计算100001/100。
实现:
mov dx,1
mov ax,86A1H ;(dx)*10000H+(ax)=100001
mov bx,100
div bx
被除数 100001 大于 65535,不能用ax寄存器存放,所以我们要用dx和ax两个寄存器联合存放100001,也就是说要进行16位的除法。
编程2:利用除法指令计算1001/100。
实现:
mov ax,1001
mov bl,100
div bl
被除数1001可用 ax寄存器存放,除数100可用 8位寄存器存放,也就是说,要进行8位的除法。
伪指令 dd
我们用db和dw定义字节型数据和字型数据。dd是用来定义dword (double word双字)型数据的。
示例:
data segment
db 1
dw 1
dd 1
data ends
在data段中定义了三个数据:
第一个数据为01H,在data:0处,占1个字节;
第二个数据为0001H,在data:1处,占1个字;
第三个数据为00000001H,在data:3处,占2个字节;
dup
dup是一个操作符,在汇编语言中同db、dw、dd 等一样,也是由编译器识别处理的符号。
它是和db、dw、dd 等数据定义伪指令配合使用的,用来进行数据的重复。
dup示例:
db 3 dup (0) :定义了3个字节,它们的值都是0,相当于 db 0,0,0
db 3 dup (0,1,2) :定义了9个字节,它们是0、1、2、0、1、2、0、1、2,相当于 db 0,1,2,0,1,2,0,1,2
可见,dup的使用格式如下:
- db 重复的次数 dup (重复的字节型数据)
- dw 重复的次数 dup (重复的字型数据)
- dd 重复的次数 dup (重复的双字数据)