您的位置:首页 > 其它

汇编语言-王爽-课程设计1

2013-10-17 13:15 483 查看
子程序dtod将dx、ax表示的32位数字转化为si指向的以0结尾的字符串,dtoc、divdw、show_str按照书中要求,前面的实验8用于生成table段的代码改成子程序build。

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,15257,17800

;以上是表示21年公司雇员人数的21个word型数据

;临时内存空间
temp:    db 11 dup(0)
data ends

table segment
db 21 dup('year summ ne ?? ')
table ends

stack segment
dw 0,84,168
dw 27 dup(0)
stack ends

code segment
assume cs:code,ds:data,ss:stack
main:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,60

call build

mov bx,0e0h
mov cx,21
mov dh,0

mainl1:
push cx
mov cx,0002h

mov dl,0
mov byte ptr [bx].4,0
mov si,bx
call show_str

push dx
mov ax,[bx].5
mov dx,[bx].7
mov si,offset temp
call dtod
pop dx
mov dl,10
call show_str

mov ax,[bx].10
call dtoc
mov dl,20
call show_str

mov ax,[bx].13
call dtoc
mov dl,30
call show_str

inc dh
add bx,16
pop cx
loop mainl1

mov ah,4ch
int 21h

build:
push ax
push bx
push cx
push si

mov bx,0e0h
mov cx,21

buildl1:;构造21行
;年份
mov si,ss:[0]
mov ax,[si]
mov [bx].0,ax
mov ax,2[si]
mov [bx].2,ax

;收入
mov si,ss:[2]
mov ax,[si]
mov [bx].5,ax
mov ax,2[si]
mov [bx].7,ax

;雇员
mov si,ss:[4]
mov ax,[si]
mov [bx].0ah,ax

;人均收入
mov ax,[bx].5
mov dx,[bx].7
div word ptr [bx].0ah
mov [bx].0dh,ax

add word ptr ss:[0],4
add word ptr ss:[2],4
add word ptr ss:[4],2
add bx,16
loop buildl1

pop si
pop cx
pop bx
pop ax
ret

;arg si dh dl cl
;bx es ax cx
show_str:
push ax
push bx
push cx
push dx
push si
push es

;算出写入地址bx
mov ax,0b800h
mov es,ax
mov al,0a0h
mul dh

mov bx,ax
mov dh,0
add dx,dx
add bx,dx

;al存样式
mov al,cl
mov ch,0
show_strl1:
mov cl,[si]
jcxz show_stro1
mov es:[bx],cl
mov es:1[bx],al
inc si
add bx,2
jmp show_strl1

show_stro1:
pop es
pop si
pop dx
pop cx
pop bx
pop ax
ret

;ax bx cx dx
divdw:
push bx

;保存低位
push ax
mov ax,dx
mov dx,0
div cx
;保存高位商
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx

pop bx
ret

;arg si ax
;use dx,bx,cx
dtoc:
push ax
push bx
push cx
push dx
push si

mov byte ptr [si].5,0
;最大5位数
mov bx,4

dtocl1:
;高位置0
mov dx,0
mov cx,10
div cx
add dl,30h
mov [si][bx],dl
mov cx,ax
jcxz dtoco1
dec bx
jmp dtocl1

dtoco1:
;判断是否需要移动
mov cx,bx
jcxz dtocend

;向前移动
mov ch,0
dtocl2:
mov cl,[si][bx]
mov [si].0,cl
jcxz dtocend
inc si
jmp dtocl2

dtocend:
pop si
pop dx
pop cx
pop bx
pop ax
ret

;arg si ax dx
;use bx,cx
dtod:
push ax
push bx
push cx
push dx
push si

mov byte ptr [si].10,0
;最大10位数,从[9]开始写入
mov bx,9

dtodl1:
mov cx,10
call divdw
add cl,30h
mov [si][bx],cl

;当dx、ax都为0时退出循环
mov cx,ax
or cx,dx
jcxz dtodo1
dec bx
jmp dtodl1

dtodo1:
;判断是否需要移动
mov cx,bx
jcxz dtodend

;向前移动
mov ch,0
dtodl2:
mov cl,[si][bx]
mov [si].0,cl
jcxz dtodend
inc si
jmp dtodl2

dtodend:
pop si
pop dx
pop cx
pop bx
pop ax
ret

code ends
end main


10.asm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: