|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
编写程序为王爽老师的《汇编语言》第211页课程设计一
编写工具 Notepa++
编译环境 XP虚拟机
编译工具 masm5.0
问题代码 设计1.zip
源代码:
assume cs:code,ds:data,es:table
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 11452,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
fruit segment
db 32 dup(0)
fruit ends
code segment
;初始化阶段
;将原始数据整理放到table处
;套用实验七的程序加以修改
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov si,0
mov bx,0
mov di,0
mov cx,21
s0: mov ax,[bx]
mov es:[si],ax
mov ax,[bx+2]
mov es:[si+2],ax
mov ax,[bx+84]
mov es:[si+5],ax
mov dx,[bx+86]
mov es:[si+7],dx
div word ptr [168+di]
mov es:[si+13],ax
mov ax,[168+di]
mov es:[si+10],ax
add di,2
add si,10h
add bx,4
loop s0
;准备阶段
;将数据转换为ASC码格式
;存储在fruit段
mov ax,table
mov ds,ax
mov dh,3 ;dh代表行号(0~24)
mov dl,3 ;dl代表列号(0~79)
mov al,160
mul dh ;相乘得出行地址存在ax
mov bx,ax ;ax后面用到,转移到bx
mov al,2
mul dl ;相乘得出列地址存在ax
add bx,ax ;行列相加得到真正地址,存放在bx
mov bp,0
mov cx,21
s1: push cx
push bx
mov ax,fruit
mov es,ax
mov si,0
mov di,0
mov ax,0
mov dx,0
mov ax,ds:[bp+di] ;将年份放进目标段
mov es:[si],ax
mov ax,ds:[bp+di].2
mov es:[si].2,ax
add si,6
add di,5
mov ax,ds:[bp+di] ;将总金额放进目标段
mov dx,ds:[bp+di].2
call dtoc
add si,10
add di,5
mov ax,ds:[bp+di] ;将人数放进目标段
mov dx,0
call dtoc
add si,6
add di,3
mov ax,ds:[bp+di] ;将人均金额放进目标段
mov dx,0
call dtoc
;打印输出阶段
mov ax,fruit ;段地址切换
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,0 ;循环实现0转换为空格,并以0结尾
mov cx,29
a: push cx
mov cl,[si]
jcxz b
c: inc si
pop cx
loop a
mov byte ptr [si],0
b: mov byte ptr [si],20h
jmp shor c
mov si,0
call show_str
pop bx
pop cx
add bx,0a0h ;转移到下一行显存
add bp,0ah ;table段切换到下一行
loop s1
mov ax,4c00h
int 21h
dtoc: push ax
push bx
push cx
push dx
push si
push di
mov di,0
mov cx,ax
jcxz short s3 ;低位为0,跳转到s3判断
mov cx,0ah
s2: call divdw ;引用实验十(2)除法模块
add cx,30h
push cx
inc di
jmp short dtoc
s3: mov cx,dx
jcxz s4 ;高低位均位0,结束
jmp short s2
s4: mov cx,di
s5: pop ax
mov es:[si],al
inc si
loop s5
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax)=dword型数据的低16位;
; (dx)=dword型数据的高16位;
; (cx)=除数。
;返回:(dx)=结果的高16位;
; (ax)=结果的低16位;
; (cx)=余数。
divdw: push di
push ax ;ax后面做除法要用到,暂存到栈
mov ax,dx
mov dx,0 ;被除数高位为0,低位为H
div cx
mov di,ax ;商暂存
pop ax ;取出L,此时高位为H/N的余数,低位为L
div cx
mov cx,dx ;余数
mov dx,di ;商高位
pop di
ret
show_str: mov al,2
mov ch,0
d1: mov cl,[si]
jcxz q
mov dl,ds:[si]
mov es:[bx],dl ;字符
mov es:[bx].1,al ;颜色
inc si ;存放顺序为倒序,自减一
add bx,2
loop d1
q: ret
code ends
end start
assume cs:code,ds:data,es:table
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 11452,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
fruit segment
db 32 dup(0)
fruit ends
code segment
;初始化阶段
;将原始数据整理放到table处
;套用实验七的程序加以修改
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov si,0
mov bx,0
mov di,0
mov cx,21
s0: mov ax,[bx]
mov es:[si],ax
mov ax,[bx+2]
mov es:[si+2],ax
mov ax,[bx+84]
mov es:[si+5],ax
mov dx,[bx+86]
mov es:[si+7],dx
div word ptr [168+di]
mov es:[si+13],ax
mov ax,[168+di]
mov es:[si+10],ax
add di,2
add si,10h
add bx,4
loop s0
;准备阶段
;将数据转换为ASC码格式
;存储在fruit段
mov ax,table
mov ds,ax
mov dh,3 ;dh代表行号(0~24)
mov dl,3 ;dl代表列号(0~79)
mov al,160
mul dh ;相乘得出行地址存在ax
mov bx,ax ;ax后面用到,转移到bx
mov al,2
mul dl ;相乘得出列地址存在ax
add bx,ax ;行列相加得到真正地址,存放在bx
mov bp,0
mov cx,21
s1: push cx
push bx
mov ax,fruit
mov es,ax
mov si,0
mov di,0
mov ax,0
mov dx,0
mov ax,ds:[bp+di] ;将年份放进目标段
mov es:[si],ax
;mov ax,ds:[bp+di].2 ; 我没有见过这种写法
;mov es:[si].2,ax
add si,6
add di,5
mov ax,ds:[bp+di] ;将总金额放进目标段
;mov dx,ds:[bp+di].2
call dtoc
add si,10
add di,5
mov ax,ds:[bp+di] ;将人数放进目标段
mov dx,0
call dtoc
add si,6
add di,3
mov ax,ds:[bp+di] ;将人均金额放进目标段
mov dx,0
call dtoc
;打印输出阶段
mov ax,fruit ;段地址切换
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,0 ;循环实现0转换为空格,并以0结尾
mov cx,29
a: push cx
mov cl,[si]
jcxz b
;不要用标号c
c1: inc si
pop cx
loop a
mov byte ptr [si],0
b: mov byte ptr [si],20h
jmp short c1
mov si,0
call show_str
pop bx
pop cx
add bx,0a0h ;转移到下一行显存
add bp,0ah ;table段切换到下一行
loop s1
mov ax,4c00h
int 21h
dtoc: push ax
push bx
push cx
push dx
push si
push di
mov di,0
mov cx,ax
jcxz short s3 ;低位为0,跳转到s3判断
mov cx,0ah
s2: call divdw ;引用实验十(2)除法模块
add cx,30h
push cx
inc di
jmp short dtoc
s3: mov cx,dx
jcxz s4 ;高低位均位0,结束
jmp short s2
s4: mov cx,di
s5: pop ax
mov es:[si],al
inc si
loop s5
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax)=dword型数据的低16位;
; (dx)=dword型数据的高16位;
; (cx)=除数。
;返回:(dx)=结果的高16位;
; (ax)=结果的低16位;
; (cx)=余数。
divdw: push di
push ax ;ax后面做除法要用到,暂存到栈
mov ax,dx
mov dx,0 ;被除数高位为0,低位为H
div cx
mov di,ax ;商暂存
pop ax ;取出L,此时高位为H/N的余数,低位为L
div cx
mov cx,dx ;余数
mov dx,di ;商高位
pop di
ret
show_str: mov al,2
mov ch,0
d1: mov cl,[si]
jcxz q
mov dl,ds:[si]
mov es:[bx],dl ;字符
;mov es:[bx].1,al ;颜色
inc si ;存放顺序为倒序,自减一
add bx,2
loop d1
q: ret
code ends
end start
|
|