8.数据处理的两个基本问题
[TOC]
基本问题
- 处理的数据在什么地方
- 要处理的数据有多长?
这两个问题,在机器指令中必须给以明确或隐含的说明,否则计算机就无法工作。
增加2个符号:
reg描述寄存器,集合有: ax, bx, cx,dx, ah,al,bh,bl,ch,cl,dh,dl, sp,bp,si,di
sreg描述段寄存器,集合有ds,ss,cs,es
bx,si,di和bp
只有这4个寄存器可用于内存寻址中的存放偏移量。
他们之间可以组合,但是只有 bx和si, bx和di, bp和si, bp和di 4中组合,用于间接寻址中 2个变量, 2个变量+常量 这两种场景。
变量中有bp时,默认的段地址存放在ss中,其他情况段地址在ds中。
机器指令处理的数据在什么地方
数据处理指令分类:
-
读取
-
写入
-
运算
数据指令处理前,数据可能在内存中,cpu内部,端口中。
机器码 | 汇编指令 | 指令执行前数据的位置 |
---|---|---|
8E1E0000 | mov bx,[0] | 内存:ds:0 单元 |
89C3 | mov bx,ax | cpu内部,ax寄存器 |
BB0100 | mov bx,1 | cpu内部,指令缓冲器 |
汇编语言中数据位置的表达
立即数(idata)
对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),在汇编语言中称为:立即数(idata), 在汇编指令中直接给出。
如
mov ax,1
add bx, 2000h
or bx, 00010000b
mov al,'a'
寄存器
如mov ax,bx
段地址和偏移地址
内存中的数据用短地址和偏移地址表达。
如mov ax, [bx]
寻址方式
指令要处理的数据有多长
8086CPU的指令,可以处理两种大小的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作。
寄存器名 暗示了数据的类型
如 mov ax,1
就是字操作
mov mov al, 1
就是字节操作
x ptr 明确指示。x为word or byte。
如 mov word ptr ds:[0], 1
为字操作
mov byte ptr ds:[0],1
为字节操作
其他
有些指令默认了访问的是字单元还是字节单元。如push
, 因为push指令只进行字操作。
寻址方式的综合应用
略
div指令
div
是除法指令,使用div
做除法的时候应注意以下问题。
- 除数:有8位和16位两种,在一个寄存器或内存单元中。
- 被除数:默认放在ax 或 ax和ax中。如果是 16位/8位,默认在ax中存放;如果是32位/16位,在dx和ax中存放,dx存放高16位,1x存放低16位。
- 结果:如果除数为8位,则
AL
存商,AH
存余数。如果除数为16位,则AX
存商,DX
存余数。
举例:
div word ptr es:[0]
解释:
除数为16位,存放在内存中。(idata) =( (es)*16+0)
被除数为32位,在dx和ax中存放。所以是$ ((dx)*10000H+(ax)) \div ((es)*16+0)$ 商存放到ax
中,余数存放到dx
中。
伪指令dd
定义数据的
db
define byte 定义一个字节。
dw
define word 定义一个字,2个字节。
dd
define double word 定义2个字,4个字节。
dup
dup是一个操作符,在汇编语言中同db、dw、dd等一样,也是由编译器识别处理的符号。和db、dw、dd等数据定义伪指令配合使用的,用来进行数据的重复。
如
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
number dup data
data为定义的数据。number为重复次数。