数据处理的问题
思考两个问题
1. 处理的数据在什么地方
2. 要处理的数据有多长
`
reg表示寄存器sreg表示段寄存器
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
下面的程序是正确的
mov ax, [bx]
mov ax, [bx + si]
mov ax, [bx + di]
mov ax, [bp]
mov ax, [bp + si]
mov ax, [bp + di]
下面的程序是错误的
mov ax, [cx]
mov ax, [ax]
mov ax, [dx]
mov ax, [ds]
没有寄存器名存在的情况下使用操作符X ptr
知名内存单元的长度, X
可以为word
或byte
word ptr
表示指令访问的内存单元是一个字单元byte ptr
表示指令访问的内存的那元是一个字节单元
mov ax, 2000h
mov ds, ax
mov word ptr [1000h], 1 ; worde的使用方式
mov byte ptr [1000h], 1 ; byte 的使用方式
push
指令只进行字操作,无需指明byte
或 word
div 除法指令(回头在学)
- 除数:有8为和16位两种,在一个reg或内存单元中
- 被除数:默认放在ax或dx和ax中
- 如果除数为8位,被除数则位16位,默认在AX中存放
- 如果除数位16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位
- 如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;
- 如果除数位16位,则AX存储除法操作的商,DX存储除法操作的余数
mul 乘法指令
mul是乘法指令,做乘法的时候注意两点
- 两个相乘的数:要么都是8位,要么都是16位
- 都是8位
- 一个默认放在AL中,另一个放在8位reg或内存字节单元中
- 结果:默认放在AX中
- 都是16位
- 一个默认放在ax中,另一个放在16位reg或内存字单元中
- 结果:高位默认放在DX中,低位在AX中存放
- 都是8位
格式如下
; mul reg
; mul 内存单元
; 例如:8位
mul byte ptr ds:[0] ; (ax) = (al) * ((ds) * 16 + 0)
; 16位
mul word ptr [bx + si + 8] ; (ax) = (ax) * ((ds) * 16 + (bx) + (si) + 8)) 结果的低16为
; (dx) = (ax) * ((ds) * 16 + (bx) + (si) + 8)) 结果的高16为
伪指令dd
dd 用来定义dword(double word,双字)型数据。
data segment
db 1
dw 1
dd 1
data ends
第一个数据为01H,在data:0处,占1个字节
第二个数据为0001H,在data:1处,占1个字节
第三个数据为00000001H,在data:3处,占2个字节
伪指令dup
它和db、dw、dd等数据定义伪指令配合使用,用来进行数据的重复
语法格式如下:
db 重复次数 dup (重复的数据)
例子
db 3 dup(0) ; 相当于 db 0, 0, 0
db 3 dup(0, 1, 2) ; 相当于0, 1, 2, 0, 1, 2, 0, 1, 2
db 3 dup('abc', 'ABC') ; 相当于db 'abcABCabcABCabcABC'