|
发表于 2012-6-1 00:03:05
|
显示全部楼层
assume cs: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'
;以上是表示21年的21个字符串(dword型数据)(21*4个字节)
dd 000016,000022,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收的21个dword型数据(21*4个字节)
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,45257,17800
;以上是表示21年公司雇员人数的21个word型数据(21*2个字节)
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 bx,168 ;单独指向雇员人数 ,如果你这里不这样指定,你下面的bx加2没有意义
xor si,si ;ds:[si]指向数据 汇编中一般将取数据的地址用si指向
xor di,di ;es:[di]指向表格 汇编中一般将存数据的地址用di指向
xor bp,bp ;下面单独用作除数
mov cx,21 ;处理21行数据
s: mov ax,[si] ;读取[数据]中[年份列]低16位到ax
mov es:[di],ax ;将ax写入到[表格]中[年份列]低16位 这里你不指定段寄存器的话,会默认段寄存器为ds的,如果这样就跟你的想法相悖了,下面也是如此
mov ax,[si+2] ;读取[数据]中[年份列]高16位到dx
mov es:[di+2],dx ;将dx写入到[表格]中[年份列]高16位
mov ax,[si+54h] ;读取[数据]中[收入列]低16位到ax
mov es:[di+5],ax ;将ax写入到[表格]中[收入列]低16位
mov dx,[si+56h] ;读取[数据]中[收入列]高16位到dx
mov es:[di+7],dx ;将dx写入到[表格]中[收入列]高16位
mov bp,[si+0a8h] ;读取[雇员数列]到di
mov es:[di+0ah],bp ;将di写入到[表格]中[雇员数列]
div bp ;运算[人均收入] 这里用bp做除数,这个到是没有规定必须那个寄存器做除数,只要跟存放被除数的ax,dx不冲突就行
mov es:[di+0dh],ax ;将结果保存到bp行[人均收入]列中
add si,4 ;[数据]进入下一行(每行相差4个字节)
add bx,2 ;[雇员]进入下一行每行相差2个字节
add di,16 ;[表格]进入下一行(每行相差16个字节)
loop s
mov ax,4c00h ;程序出口
int 21h
codesg ends
end start
以上是我帮你修改的,红字是修改的地方!!!
|
|