170407 汇编-综合练习 实验7

来源:互联网 发布:闭关锁国知乎 编辑:程序博客网 时间:2024/06/05 19:39

1625-5 王子昂 总结《2017年4月7日》 【连续第188天总结】

A.汇编第八章实验 100%

B.题:将给定的定义好的数据重新按格式写入指定table段中,并计算21年中的人均收入

乍一看还是有点懵的,汇编的结构太混乱了。或者说太简单了,全部由寄存器和内存单元构成。

慢慢理清思路,由于年份和总收入都占4个字节,而人数只占2个字节,因此不可能同用一个寄存器来表示(因为长度不定)

那么年份和总收入使用同一个寄存器来指向,人数单独使用另一个寄存器来指向。每次循环以后对两个寄存器分别增加一个数据长度,同时令table段的指针增加16位即可。

所犯的错:

附加段寄存器,即需要另外使用的段寄存器要使用es。es不可以直接与立即数发生关系,它只能由通用寄存器赋值

通用寄存器ax,dx在除法div命令时需要使用,因此不可作为跨越循环的变量;bx则是指向内存的寄存器,相当于指针;cx是循环计数作用。它们都有各自的作用,如果需要大量临时存储的值,开辟一个内存空间通过栈来使用

本题暂不需要,寄存器勉强足够使用。

代码:

assume cs:codesg,es:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;年份
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;公司总收入
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;雇员人数
data ends


table segment
db 21 dup ('year summ ne ?? ')
table ends


codesg segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov cx,21
;数据初始化
mov bx,0
mov si,168
;bx作为年份和总收入的指针,si作为雇员人数的指针
l: mov ax,[bx]
mov es:[0],ax
;把每组数据的年份的前两个字节送入表格段,下同,分别是总收入的前两个字节、年份的后两个字节、总收入的后两个字节、雇员数,除法得到人均收入并送入表格段
mov ax,[bx+84]
mov es:[5],ax
add bx,2
mov ax,[bx]
mov es:[2],ax
mov ax,[bx+84]
mov es:[7],ax
mov ax,[si]
mov es:[10],ax

mov ax,es:[5]
mov dx,es:[7]
div word ptr es:[10]
mov es:[13],ax


mov ax,es
inc ax
mov es,ax
add bx,2
add si,2
loop l


mov ax,4c00h
int 21h
codesg ends
end start


Debug中,右侧显示ASCII码的结果,而不是值。因此在本题中只能用来检查年份,收入、雇员数和人均收入的值都是以16进制的形式保存在内存中,需要自行计算检查。

C.明日计划

汇编第九章

0 0