lab7
assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980','1978','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上是21年的21个字符串
;21*4 = 84 个字节
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,19514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示公司21年收入的21个dword数据 21*4 = 84
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是21年雇佣人数的21个word数据 21*2 = 42
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
code segment
;ds指 datasg , es指 tablesg
;在ds段中, 用bx指年份 , 用si指收入, 用di指 人数
;在es段中, 可以用idata 确定每个内容, 然后用bp去动
start: mov ax,data ;得到段
mov ds,ax
mov ax,table
mov es,ax
mov bx,0 ;data段指针
mov si,84
mov di,168
mov bp,0 ;table段指针
mov cx,21
;复制年份
yeare: push [bx]
pop es:[bp]
push [bx+2]
pop es:[bp+2]
;复制收入
mov ax,ds:[si]
mov dx,ds:[si+2]
mov es:[bp+5],ax
mov es:[bp+2+5],dx
;复制员工数
push ds:[di]
pop es:[bp+0ah]
;除法
div word ptr ds:[di]
mov es:[bp+00dh],ax
add si,4
add bx,4
add di,2
add bp,16
loop yeare
mov ax,4c00h
int 21h
code ends
end start
对这道题做一个小小的总结
分析数据的来源:
用 ds 定位data段
用 es 定位table段
在 data 段内, 可以用 idata 去确定段内不同的类型
然后用 bx, di, si 去在不同类型中 做指向具体数据的指针
ds: [idata + 寄存器指针]
在table 段内, 用 idata 去指向不同的内容, 用 指针bp 确定第几段数据
es:[idata +bp]
总的来说, 确定一个数据的位置, 我们先想清楚 用什么存一个段 , 如果 段中不同的数据长度确定的话, 可以用 idata 把这个段划分成几个段, 然后再用 寄存器 bx, si, di , bp作为每个段内的指针
关于除法:
在确定要进行除法时, 先确定除数和被除数的大小, 合理的存储被除数和除数, 如果除数是 16位的数, 那么被除数就是32位的数, 其高16位存在 dx 寄存器中, 低 16位存在 ax寄存器中, 商的结果存在ax寄存器中, 余数存在 bx寄存器中. 除数如果是 8位, 则被除数存在ax中, 商的结果存在al中, 余数存在 ah 中
对寄存器的复习:
段寄存器: ds , es , ss
可以在[ ]中使用的寄存器: si , di , bp(默认对应的段寄存器是ss) , bx
循环: cx ( 可以用栈结构来暂存多个 cx )