|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 番茄遇蜜桃 于 2014-1-22 02:41 编辑
assume cs:codesg,ds:datasg,es:tablesg,ss:stacksg
datasg 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 11452,14430,15257,17800
datasg ends
tablesg segment
db 21 dup ('year summ ne ?? ')
tablesg ends
stacksg segment
dw 0,0,0,0,0,0,0,0 ;定义一个栈
stacksg ends
codesg segment
start: mov ax,datasg
mov ds,ax ;赋源数据段地址
mov ax,tablesg
mov es,ax ;赋目标段地址
mov ax,stacksg
mov ss,ax
mov sp,10h ;初始化客
mov bx,0
mov si,0
mov di,0
mov bp,0
mov cx,21 ;外循环控制行数
s1: push cx ;保护cx
mov cx,2 ;写入每行数据
s2: mov ax,[bx+si] ;定位第一个年份的低16位(2个字节)
mov es:[bp+si],ax ;将低16位送入制定位置
mov ax,[bx+si+54h] ;定位第一个收入低16位
mov es:[bp+5h+si],ax ;将低16位送入制定位置
add si,2h ;准备写入高16位
loop s2 ;写入高16位 ps:年份和收入都是32位(4个字节)所以考虑用2次16位寄存器ax写入指定位置。
mov ax,ds:[di+0a8h] ;定位雇员数 16位(2个字节)
mov es:[bp+0ah],ax ;写入指定位置
mov ax,[bx+54h] ;准备做除法
mov dx,[bx+56h]
div word ptr ds:[di+0a8h] ;开始做除法,定位除数
mov es:[bp+0dh],ax;将除法的商写入指定位置 ps:本行数据写入完成
add bx,4h;开始定位下个32位数据(年份和收入)准备下一行数据
add di,2h ;开始定位下个16位数据(雇员数)准备第下一行数据
add bp,10h;目标位置换下一行地址
pop cx;弹出cx值
loop s1;返回写入下一行数据
mov ax,4c00h
int 21h
codesg ends
end start
无法通过编译不知道有什么错误,肯定大家帮我看看。谢谢~~
大致算法如上。
|
|