处理的数据在什么地方
处理的数据有多长
reg:寄存器;sreg:段寄存器
[…]中四个寄存器bx、bp、si、di可以单独出现,或者以四种组合出现
bx默认的段地址是ds,bp的段地址默认是ss
- 只要在[…]中使用寄存器bp,而指令没有显式给出段地址,短地址就会默认在ss中。
汇编中数据位置的表达
- 读取、写入、运算
- 数据的位置:内存、寄存器、指令缓冲器
- 汇编语言中用三个概念表示数据位置:立即数(放在cpu指令缓冲器中的位置)、寄存器、内存
- 显式/隐式给出段地址。
- 寻址方法:直接寻址、寄存器简介寻址、寄存器相对寻址、基质址变址寻址、相对基址变址寻址。
指令要处理的数据有多长
- byte / word
- 通过寄存器指明要处理的数据的长度:
mov ax, 1
就说明要处理的是16位,如果是mov al, 1
那处理的就是8位。 - 汇编中使用操作符
X ptr
指明内存单元的长度,X在汇编中是word或byte。否则cpu无法知道访问的是字单元还是字节单元。mov word ptr ds:[0], 1
inc word ptr [bx]
和mov byte ptr ds:[0], 1
inc byte ptr [bx]
- 其他方法
- 有些指令默认访问了字单元还是字节单元
- 例如push [1000H]就不用指明访问的是字单元还是字节单元,因为push指令只进行字操作。
用bx定位结构体,用idata定位结构体中的某一个数据项,用si定位数据项中的每一个元素。
div指令 :除法指令
- 除数:8位/16位(AX)
- 被除数:16位/32位(DX+AX)
div指令格式:div 除数
- div 寄存器
- div 内存单元
- 示例:
div byte ptr ds:[0]
注意[…]里边可以是零,但是不能是其他常数。含义:(al) = (ax)/((ds)*16+0) 的商
(ah)=(ax)/((ds)*16+0)的余数
- 示例:
div word ptr ds:[0]
注意[…]里边可以是零,但是不能是其他常数。含义:(ax) = [(dx)*10000H+(ax)]/((ds)*16+0) 的商
(dx)= [(dx)*10000H+(ax)]/(ds)*16+0)的余数
8位除数对16位被除数,被除数默认在ax中,结果也存放在ax中,al是商,ah是余数
16位除数对32位被除数,被除数默认在ax和dx中,dx放高位,dx放低位,结果商在ax中,余数在dx中
- 例如ax = 0004; dx = 0001; bx = 0004; div bx其实就是
0001 0004H / 0004H
伪指令dd
- dd是用来定义dword型数据(double word双字)
- 例如
data segment
db 1
dw 1
dd 1
data ends
第一个数据为01H,在data:0 处,占一个字节,
第二个数据为0001H,在data:1处,占1个字,两个字节
第三个数据为00000001H,在data:3处,占1个双字,两个字,四个字节。
dup操作符。由编译器识别处理的符号
- 和db、dw、dd等数据定义伪指令配合使用,用来进行数据的重复
- 例如
db 3 dup(0)
等同于db 0,0,0
,相当于定义了三个字节, db 3 dup(0,2,3)
相当于定义了九个字节db 0,1,2,0,1,2,0,1,2
- db 3 dup(‘abc’, ‘ABC’)相当于定义了18个字节,等同于
db 'abcABCabcABCabcABC'
- 其他的db还能换成dw和dd,类上