
assume cs:codesg,ds:data,es:table,ss:stacks
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个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
以上是表示21年公司总收的21个dword型数据
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型数据
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
stacks segment
db 0,0,0,0
stacks ends
codesg segment
mov ax,data
mov ds,ax
mov ax,stacks
mov ss,ax
mov sp,8
mov bx,0
mov ax,table
mov es,ax
mov cx,21
mov si,0
mov di,0
mov dx,0
s:
以下传递年份
mov ax,ds:[si]
mov es:[di],ax
mov ax,ds:[si+2]
mov es:[di+2],ax
以下传递收入
mov ax,ds:[si+84]
mov es:[di+5],ax ax是低八位
mov dx,ds:[si+86]
mov es:[di+7],dx dx是高八位
push cx
以下传递雇员数
mov cx,ds:[bx+168]
mov es:[di+0ah],cx
mov cx,es:[di+0ah]
div cx 计算人均收入
mov es:[di+0dh],ax
add di,10h
add bx,2
add si,4
pop cx
loop s
mov ax,4c00h
int 21h
codesg ends
end
1、程序如下:codesegment
assume cs:code, ds:code, ss:code
org 100h
main: mov si,offset x 取数组中第一个元素的内存地址
mov cx,100 数组元素个数
cld 以下使用lodsb来获得各元素值,为此先清除方向标志
xor ah,ah 因x内全部为无符号数,所以将ah设为0,以便累加(根据 _fmlyht 意见从循环内移出以提高代码效率)
lab1: lodsb 从ds:si处取一个字节放入al中,同时si增1即指向下个元素
add sum,ax 累加
looplab1循环,前面对cx的赋值规定了循环次数为100次
int 20h 循环结束后sum中为总和,此处用int 20h退出
x db 100 dup (?) 定义100个字节型元素的数组,但不指定初值
sum dw 0 sum的初值为0,在程序代码部分中没有对该变量进行初始化,所以会使用这里定义的值为总和的初值
codeends
end main
2、代码如下:
cmp ax,bx 比较ax与bx
jge lab2若ax>=bx则转至lab2,带符号数比较须使用jg(e)/jl(e)/jng/jnl等指令
xchg ax,bx 根据 _fmlyht 意见,将ax与bx交换,如此,ax中为两者的较大值,bx为较小值
lab2: cmp ax,cx 执行到此时,ax中有最初时ax与bx中较大者,这时再比较ax与cx
jge lab3方法与前次类似,至lab3时ax将存有原来三者中最大的数
xchg ax,cx 没有跳转的话需将cx中较大的值与ax中较小的值交换以使ax中含最大值
lab3:
至此ax中已是三者中的最大值,下面代码是为完成中间值与最小值的排序,使三者从大到小分别存放于ax、bx、cx。原题无此要求,可去掉。
cmp bx,cx
jge lab4
xchg bx,cx
lab4:
至此,ax>=bx>=cx
----
谢谢楼下 _fmlyht 朋友指正,已在此答案中改进并注明。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)