(2011.10.29)汇编_王爽_第08章_学习小结
本章主要内容:
1. div除法指令
2. dup指令
3. 寻址方式的综合应用
4. 偏移地址的寄存器的使用:bx, si, di, bp
5. ptr的使用
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
需注意的知识点:
1. push指令只进行字操作
2. mov word ptr ds:[0], 1 用word ptr指明了指令访问的内存单元是一个字单元。
3. 当在偏移地址中包括bp时, […bp],段地址就默认在ss中,(ss)*16+bp
4. bx,si,di,bp四种寄存器可以单独出现,也可以双个出现,不用多个同时出现,
当两个出现的时候,只能bx与 si或di搭配,bp与si或di搭配,即可以将其分为两组:
组1是 (bx, bp), 组2是(si, di), 同组内的成员不能同时出现,只能异组搭配。
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:实验7_寻址方式在结构化数据访问中的应用.asm
; 程序功能:将几个数据段的内容放到一段数据段中,并使用除法计算数值。
; 题目如下:编程,将data段中的数据按如下格式写入到table段中,
; 并计算21年中的人均收入(取整),结果也按下面的格式保存在table段中。
; ____________________________________________________________________________________________
; | 行起始地址 | 年份(4字节) |空| 收入(4字节) |空| 雇员数(2字节 ) |空 | 人均收入(2字节)|空|
; | table:0 | 1975 |格| 16 |格| 3 |格 | ??? |格|
; | table:10H | 1976 | | 22 | | 7 | | ??? | |
; | table:20H | 1977 | | 382 | | 9 | | ??? | |
; | table:30H | 1978 | | 1356 | | 13 | | ??? | |
; | table:40H | 1979 | | 2390 | | 28 | | ??? | |
; | table:50H | 1980 | | 8000 | | 38 | | ??? | |
; ..........................................................................
; ..........................................................................
; | table:140H | 1995 | | 5937000 | | 17800 | | ??? | |
; |____________|______________|__|______________|__|________________|__|__________________|__|
assume cs:codesg, ds:data, ds:table
data segment
db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985'
db '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995'
; 以上表示21年的21个字符串(年份)(4字节)
dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514, 345980
dd 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
; 以上表示21年公司总收入的21个dword型数据(收入)(4字节)
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635
dw 8226, 11542, 14430, 15257, 17800
; 以上是表示21年公司雇员人数的21个word型数据
data ends
table segment
db 21 dup ('year summ ne ?? ') ; dup指令,用于数据的重复
; db 重复的次数 dup (重复的字节型数据)
; dw 重复的次数 dup (重复的字型数据)
; dd 重复的次数 dup (重复的双字型数据)
; dd:用来定义dword(double word, 双字)
table ends
codesg segment
start:
mov ax, data
mov ds, ax ; 首先将data数据段放入ds中,用于提取数据时所用的地址
mov ax, table
mov es, ax ; 然后将table数据段放入es中,用于放入时所用的地址
mov bx, 0 ; 将源内存分为两个起点,此为其一
mov si, 168 ; 将源内存分为两个起点,此为其二
mov di, 0 ; 目的内存的偏移地址
mov cx, 21 ; 一共有二十一年,因为设置循环次数为21
s:
mov al, ' ' ; byte ptr 指明了指令访问的内存单元是一个字节单元
mov es:[di].4, al
mov es:[di].9, al
mov es:[di].12, al
mov es:[di].15, al ; 以上,先将一年中数据为空格的内存单元设为空格
mov ax, ds:[bx].0 ; 将年份放入目的地址
mov es:[di].0, ax
mov ax, ds:[bx+2].0
mov es:[di+2].0, ax
mov ax, ds:[bx].84 ; 将收入放入目的地址
mov es:[di].5, ax
mov ax, ds:[bx+2].84
mov es:[di+2].5, ax
mov ax, ds:[si] ; 将雇员数放入目的地址
mov es:[di].10, ax
; div除法指令
; div 8位 16位
; 被除数 ax dx*10000H + ax
; 除数 [...] [...]
; 商 al ax
; 余数 ah dx
; 计算人均收入:总收入除以人数
mov dx, es:[di].7
mov ax, es:[di].5 ; 将被除数放入dx与ax中
div word ptr es:[di].10 ; 进行除法并且设定除数
mov es:[di].13, ax ; 结果会被放到ax中,将ax的结果放入目标内存中
add di, 16
add si, 2
add bx, 4
loop s
mov ax, 4c00h
int 21h
codesg ends
end start