王爽 汇编语言 实验十 课程设计1

image

assume cs:code

code segment

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年的字符串 4 * 21 = 84
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
        ;以上是表示21年公司总收入的dword型数据 4 * 21 = 84
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
        dw 11542,14430,15257,17800
        ;以上是表示21年公司雇员人数的21个word型数据 2 * 21 = 42
data ends
datads segment
        db 100 dup(0)
datads ends
start:
        mov bx , data
        mov es , bx
        mov bx , datads
        mov ds , bx
        mov cx , 21
        mov dh , 2
        mov si , 0
        mov bx , 0 ;year
        mov di , 0;income
        mov bp , 0;num
s:
        ;-----------years----------------------
        mov dl , 3
        mov word ptr ds:[0] , 0;ds:si段使用过的要清零
        mov word ptr ds:[2] , 0
        mov word ptr ds:[4] , 0
        mov ax , es:[bx]
        mov ds:[0] , ax
        mov ax , es:[bx+2]
        mov ds:[2] , ax
        push cx
        mov cx , 4
        call show_str
        pop cx
        ;-----------income---------------------
        add dl , 10
        push dx;dtocex时要使用dx做高位,保护
        mov word ptr ds:[0] , 0
        mov word ptr ds:[2] , 0
        mov word ptr ds:[4] , 0
        mov ax , es:[84+di]
        mov dx , es:[86+di]
        call dtocex
        pop dx
        push cx
        mov cx , 4
        call show_str
        pop cx
        ;-----------num-------------------------
        add dl , 10
        push dx
        mov word ptr ds:[0] , 0
        mov word ptr ds:[2] , 0
        mov word ptr ds:[4] , 0
        mov ax , es:[168+bp]
        call dtoc
        pop dx
        push cx
        mov cx , 4
        call show_str
        pop cx
        ;----------------aver---------------------
        add dl , 10
        push dx
        mov word ptr ds:[0] , 0
        mov word ptr ds:[2] , 0
        mov word ptr ds:[4] , 0
        mov ax , es:[di+84]
        mov dx , es:[di+86]
        div word ptr es:[bp+168]
        call dtoc
        pop dx
        push cx
        mov cx , 4
        call show_str
        pop cx
        ;--------------------------------------
        add bx , 4
        add di , 4
        add bp , 2
        inc dh

        dec cx
        cmp cx , 0
        jne s_help
mov ax , 4c00h
int 21h
s_help:
        jmp far ptr s

;名称:dtocex
;功能:将dword型数据转变为表示十进制的字符串,字符串以0为结尾符。
;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,ds:si指向字符串的首地址
;返回:无
dtocex:
dataseg_dtocex segment
db 100 dup(0) ;存放参数和寄存器值
db 100 dup(0) ;存放结果和中间变量
dataseg_dtocex ends
push bx 
push es
push di
push cx
mov bx , dataseg_dtocex
mov es , bx
mov es:[0] , ax
mov es:[2] , ds
mov es:[4] , si
mov es:[6] , dx

mov di , 0
mov ax , es:[0]
dtocex_s:
mov cx , 10
call divdw;dx:ax / cx = dx:ax~cx
add cl , 30h
mov byte ptr es:[100+di] ,cl 
inc di
cmp dx , 0
je dxisz
jmp dtocex_s
dxisz:
cmp ax , 0
jne dtocex_s

mov cx , di
mov ds , es:[2]
mov si , es:[4]
dtocex_reverse:
mov bl , es:[99+di]
mov ds:[si] , bl
inc si
dec di
loop dtocex_reverse
mov byte ptr ds:[si] , 0

mov ds , es:[2]
mov si , es:[4]
pop cx
pop di
pop es
pop bx
ret

;名称:divdw
;功能:进行不会溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
divdw:
dataseg_divdw segment
db 100 dup(0) ;存放参数
db 100 dup(0) ;存放结果和中间变量
dataseg_divdw ends
push bx
push es
mov bx , dataseg_divdw
mov es , bx
mov es:[0] , ax ;L
mov es:[2] , dx ;H
mov es:[4] , cx ;N

mov dx , 0
mov ax , es:[2]
div word ptr es:[4]
mov es:[100] , ax   ;结果dx
mov ax , es:[0]
div word ptr es:[4]
mov es:[102] , ax   ;结果ax
mov es:[104] , dx   ;结果cx


mov dx , es:[100]
mov cx , es:[104]
pop bx
pop es
ret

;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si指向字符串的首地址
;返回:无
show_str:

push ax
push bx
push cx
push dx
push si
push bp
push di
push es

mov al , dh;行号
add al , 1
mov bl , 0a0h
mul bl
mov dh , 0
sub dx , 1;
add dx , dx;因为一个字符占两个字节
add ax , dx;把dl中的列号加在ax中
mov di , ax;di放屏幕显示的初始位置

mov ah , cl;ax 要显示的字符和颜色
mov ch , 0;cx 确定循环的条件
mov bx , 0b800h
mov es , bx;es显示的地址
mov bp , 0;显示地址的游标
s_showstr:
mov cl , ds:[si]
mov al , ds:[si]
jcxz retseg
mov es:[di+bp] , ax
inc si
add bp , 2
loop s_showstr

retseg:
pop es
pop di
pop bp
pop si
pop dx
pop cx
pop bx
pop ax
ret

;名称:dtoc
;功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符。
;参数:(ax)=word型数据,ds:si指向字符串的首地址
;返回:无
dtoc:
dataseg_dtoc segment
db 100 dup(0) ;存放参数和寄存器值
db 100 dup(0) ;存放结果和中间变量
dataseg_dtoc ends
push bx
push es
push dx
push cx
push di
mov bx , dataseg_dtoc
mov es , bx
mov es:[0] , ax
mov es:[2] , ds
mov es:[4] , si

mov bx , 10
mov di , 0
mov ax , es:[0]
dtocs:
mov dx , 0
div bx
mov cx , ax
add dl , 30h
mov byte ptr es:[100+di] ,dl 
inc di
jcxz getCount
mov cx , 2 ; 当商为1的时候cx-- , 就为1了,就会跳出循环
loop dtocs

getCount:
mov cx , di
mov ds , es:[2]
mov si , es:[4]
dtocreverse:
mov bl , es:[99+di]
mov ds:[si] , bl
inc si
dec di
loop dtocreverse
mov byte ptr ds:[si] , 0

mov ds , es:[2]
mov si , es:[4]
pop di 
pop cx 
pop dx 
pop es 
pop bx
ret

code ends
end start
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值