汇编语言(王爽)——课程设计1

1、原题目

2、个人代码

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'	
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
data1 segment;0x0778
db 16 dup(0)
data1 ends
 
codesg segment
start:
mov ax,data
mov ds,ax
mov cx,21;循环21次
mov si,0;每轮增加4
mov di,1;每轮增加1
mov bp,0;每轮增加2
;要显示的数据分为四部分年份、收入、雇员数、人均收入
s:

;第一部分年份

call ctod;调用子程序,字符串转10进制,也可以直接调用显示子程序
;得到字符串10进制存在ax中
;调用dtoc子程序转成字符串
mov bx,data1
mov ds,bx
call dtoc

mov dx,di 
mov dh,dl
mov dl,2;在第2列
call show_str;调用显示子程序

;第二部分收入
mov bx,data
mov ds,bx
mov ax,[si+84]
mov dx,[si+86]
mov bx,data1
mov ds,bx
call dtoc

mov dx,di 
mov dh,dl
mov dl,17;在第17列
call show_str;调用显示子程序

;第三部分雇员数
mov bx,data
mov ds,bx
mov ax,[bp+168]
mov dx,0
mov bx,data1
mov ds,bx
call dtoc

mov dx,di 
mov dh,dl
mov dl,32;在第32列
call show_str;调用显示子程序

jmp ss1;loop循环超出范围,中间过渡一下
ss2:jmp s

ss1:

;第四部分人均收入
;显示人均收入
mov bx,data
mov ds,bx
mov ax,[si+84]
mov dx,[si+86];收入

mov bx,[bp+168];雇员数
div bx;被除数32位,除数16位
;商存在ax中
mov dx,0
mov bx,data1
mov ds,bx
call dtoc

mov dx,di 
mov dh,dl
mov dl,47;在第47列
call show_str;调用显示子程序


add si,4
add di,1
add bp,2
mov bx,data
mov ds,bx
loop ss2
mov ax,4c00h
int 21h

;字符串转对应的10进制子程序
;参数ds:si指向字符串首地址
;返回ax=1975 (dword型数据ax,dx如'1975'->dx=0000 ax=1975)
ctod:
push ds;入栈保存数据
push si
push bx
push cx
;以1975为例
mov ax,[si];得到前两个字节0x3931
mov bx,[si+2];后两个字节0x3537
sub ah,30h;09得到对应字符如31h->1 
sub al,30h;01
sub bh,30h;05
sub bl,30h;07
push ax
mov ah,0
mov dx,1000
mul dx;结果是ax dx,本题有用数据是ax
mov cx,ax;存到cx
pop ax
mov al,ah
mov dh,100
mul dh
add cx,ax
mov al,bl
mov dh,10
mul dh
add cx,ax
mov al,bh
mov dh,1
mul dh
add cx,ax
mov ax,cx
mov dx,0;高位是0
pop cx
pop bx
pop si
pop ds
ret

dtoc:
push ax
push bx
push cx
push dx
push si
push ds
mov si,0
mov bx,0
push bx;0入栈标识数据结尾
mov cx,10;除数
 
s0:
call divdw;调用divdw子程序,求每位的值cx余数dx、ax商16位除32位
;调用前面写的解决除法溢出的子程序,这里也可以用16位除32位计算但不能用8位除16位(商溢出)
add cx,30h
push cx;得到ascii,入栈
add ax,dx
mov cx,ax
jcxz s1;商为0跳到s1
mov cx,10;除数为10
jmp s0
 
s1:
pop ax
mov cx,ax
jcxz s2;栈顶数据为0,数据结束
mov [bx],al
inc bx
jmp s1
 
s2:
mov [bx],al;得到字符串后以数0结尾
pop ds
pop si
pop dx
pop cx
pop bx
pop ax
ret

divdw:
push bx
push si
push di
mov bx,ax;把被除数低16位存到bx
mov ax,dx;高16位存到ax
mov dx,0
div cx;计算原被除数的高16位除以原除数ax存商dx存余数
mov si,ax;商存到si
mov di,dx;余数存到di
mov dx,si
mov ax,0;乘以65536等于在低位加上16个0
push dx
push ax;高位和低位分别入栈
mov dx,di
mov ax,0
add ax,bx
div cx;商存到ax,余数dx
pop di;低位
pop si
add di,ax;计算商,低16位不会进位
mov ax,di;商低16位存到ax
mov cx,dx;余数存到cx
mov dx,si;商高16位存到dx
pop di
pop si
pop bx
ret

show_str:
push ax
push bx
push cx
push si
push dx
push di
mov cl,02
mov di,0
mov si,0
add dl,dl;计算在显存中(字节)列号(从0开始)如显存第三个字符是第6个字节(从0起)

change:
mov al,cl;暂时存储cl颜色属性
mov cl,[di];取ds一个字节
mov ch,0
jcxz ok;判断是否为0,为0结束跳到标号ok,否则继续
mov cl,al;恢复cl颜色属性值
mov al,160;每行80个字符160个字节
mul dh;结果存在ax中,是第dh行(初始行为1)之前的字节数
mov bl,16
div bl;除数在一个reg或内存单元中,结果存到al中
mov ah,0
add ax,0b800h;计算第行的首地址
mov es,ax;es为第dh行的首地址
mov al,[di];取字符串字符,di每次加1
mov bl,dl
mov bh,0;bx是列的偏移地址
mov byte ptr es:[si+bx],al;si每次加2,al每次取字符串的一个字符
mov es:[si+bx+1],cl;颜色属性值为cl
add si,2;在显存中每次写入两个字节	
inc di;字符串每次取一个字节
jmp short change

ok:
pop di
pop dx
pop si
pop cx
pop bx
pop ax
ret

codesg ends

end start 

3、结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z2bns

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值