能在[····]中进行内存单元的寻址的寄存器只有4个, 分别是bx , si , di , bp
其中bx , bp 是基址,bx对应的段地址是ds,bp对应的段地址是ss
si , di 是变址,单独使用时段地址是ds,组合使用段地址是跟随组合的基址对应的段地址
[·····]中进行内存单元寻址汇总:
[si] [di] [bx] [bp] [常量]
[si+常量] [di+常量] [bx+常量] [bp+常量]
[bx+si] [bx+di] [bp+si] [bp+di]
[bx+si+常量] [bx+di+常量] [bp+si+常量] [bp+di+常量]
汇编还提供了更为贴切的书写方式:如([bx].常量 、[bx].常量[si])
在需要直接使用内存单元进行操作时,必须知道操作的内存长度。因此汇编提供了X ptr 这操作符代替所要操作内存的长度,X可以是word或type
(例子:mov word ptr [bx] , '12')
这章提供了一个除法指令 div:
除数有两种,8位和16位
如果除数为8位,被除数则为16位,默认存放在AX中,得到的结果商存放在AL,余存放在AH。如果除数为16位,被除数则为32位,那高16位存放在DX,低16位存放在AX,得到的结果商存放在AX,余存放在DX
这章提供了一个伪指令 dd:
dd是用来定义dword型数据(dword 是 double word)
这章提供了一个操作符 dup:
这操作符与数据定义伪指令配合使用,用于进行数据的重复。
(例如:db 3 dup (0) == db 0,0,0)
结合上几章所学的知识总结练习:
将给出的数据进行表格型排列,并求出人均工资
assume ds:data, cs:code, ss:table
data segment
db '1975','1976','1977','1978','1979','1980'
db '1981','1982','1983','1984','1985','1986'
db '1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;年份
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479
dd 140417,197514,345980,590827,803530,1183000,1843000
dd 2759000,3753000,4649000,5937000
;收入
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793
dw 4037,5635,8226,11542,14430,15257,17800
;雇员数
data ends
table segment
db 21 dup ('year summ ne ?? ')
dw 0,0,0,0,0,0,0,0
table ends
code segment
start: mov ax, data
mov ds, ax
mov ax, table
mov ss, ax
mov sp, 160H
mov dx, 0
mov bp, 0
mov bx, 0
mov si, 0
mov di, 0
mov cx, 21
T: push cx
mov cx, 2
mov di, 0
D: mov ax, [bx]
mov [bp+di] , ax
mov ax , [54H+si]
mov [bp+di+5H] , ax
add bx, 2
add si, 2
add di, 2
loop D
mov di, dx
mov ax , [ 0A8H+di]
mov [bp+0AH] , ax
add dx, 2
push dx
push bx
mov di, 0
mov bx, ax
mov ax, [bp+di+5H]
add di, 2
mov dx,[bp+di+5H]
div bx
mov [bp+0DH] , ax
pop bx
pop dx
pop cx
add bp, 10H
loop T
mov ax,4c00H
int 21H
code ends
end start