|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
哈哈,这种时隔多年发生羁绊的评论还是很让人激动的
回归正题,先给一下我的源码和结果吧(我的段定义并没有完全依照课本上,我做了一些“优化”,为了大家理解我也在旁边做了解释“
assume cs:a
b segment
dw 1975h,1976h,1977h,1978h,1979h,1980h,1983h
dw 1984h,1985h,1986h,1987h,1988h,1989h,1990h ;这里换成16进制是为了在内存中更直观的体现出来,难度与原差异不大
dw 1991h,1992h,1993h,1994h,1995h,1996h,1997h
b ends
c segment
dd 16H,22h,382h,1356h,2390h,8000h,16000h,24486h,50065h,97479h,140417h,197514h ;但是这里换成十六进制我想了很久,和上面不同这里换成十六进制更多是为了
dd 345980h,590827h,803530h,1183000h,1843000h,2759000h,3753000h,4649000h,5937000h ;给ax,dx复制。因为我不知道有哪条指令可以将一个十进制化为十六进制并从中分出高低位(因为有的收入大于word型 而ax,dx都是字型)
c ends ;所以我直接将这些收入设为十六进制,也是给大家提个醒,以后涉及到这类问题要将收入先化为十六进制.....也可能是我没学到更牛的指令
d segment
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
d ends
table segment
dd 21 dup (0,0,0,0 );年b2 总c4 人d2 均t2 00 00 00 00,00 00 00 00,00 00 00 00,00 00 00 00 ;我通过完成这个实验也体会到了这个段内存的引用,就是不用管它是dd、dw还是db你只要指向你需要的偏移地址,如现在dd 0,0是两个双字型
table ends ;但其实就是8个字节,你可以在0到1装一个al,2到3装一个ah。所以我后面才发现内存里面有部分零是可以不出现的,但是总收入里面为了后面还会有很多零
e segment
dw 0,0,0,0,0,0
e ends
a segment
start:mov ax,c
mov ds, ax
mov ax,d ;调用总,人求均
mov es,ax
mov ax,e
mov ss,ax
mov sp,10
mov bx,0
mov si,0
mov di,0 ;调试循环参数,bx:调取总。si:调取人数
mov cx,21 ;cx:21组
s:
mov ax,[bx]
mov dx,[bx+2] ;调取总的高字节和低字节
push ax
push dx
div word ptr es:[si] ;调取人数
push ds
push ax ;调取t地址,由上到下 商,总段,总高,总低
mov ax, table
mov ds,ax
pop [di+12] ;存入均,si在t,Tt和T人不一样改为di
pop dx ;总段放入dx
pop [di+6] ;存入总高
pop [di+4] ;存入总低
mov ax,es:[si] ;存入人数
mov [di+8],ax
push es ;栈内为ren段
mov ax,b
mov es,ax ;es为b段
mov ax,es:[si]
mov [di+2],ax
pop es
mov ds,dx
add bx,4
add si,2
add di,16
loop s
mov ax,4c00H
int 21
a ends
end start
我醉了不会发图片,我只截屏了。有需要可以教我。。。
|
|