最近自學了王爽的《組合語言》,全書共有兩次課程設計,這是第乙個:
給定資料如下
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 245980,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型資料
data ends
將其格式化顯示至螢幕,並計算收入和雇員人數相除的商然後後顯示到螢幕上。
格式如下:
1975 16 3 16/3
······
1995 5937000 17800 5937000/17800
問題很簡單,但是實現過程中有一些細節需要注意
首先,需要單獨實現三個功能,分別為:資料轉換dtoc,dword不會產生溢位的除法運算divdw,顯示字串show_str
實現這些子功能時要注意將衝突的暫存器內的值記錄在棧裡,
然後將這些子功能組合,實現整個程式,**如下:
assume ds:data,cs:code,ss:stack
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982'
db '1983','1984','1985','1986','1987','1988','1989','1990'
db '1991','1992','1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,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,11542,14430,15257,17800
db 16 dup(0)
data ends
stack segment
db 48 dup(0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,30h
mov si,0 ;data段偏移位址
mov bp,168 ;人數第乙個資料位址
mov dh,1 ;顯示行號
mov dl,20 ;顯示列號
mov cx,21
show1: push cx
mov cx,4 ;迴圈4次顯示年份
s: push cx
mov cl,00001010b
mov al,[si]
call dispal
inc si
inc dl
pop cx
loop s
add dl,5
mov di,dx
mov ax,ds:[si].80 ;轉換收入資料
mov dx,ds:[si].82
push si
mov si,21*10
call dtoc
mov dx,di
mov cl,00001010b ;顯示收入資料
call show_str
add dl,9
mov di,dx
mov ax,ds:[bp] ;轉換人數資料
mov dx,0
call dtoc
mov dx,di
mov cl,00001010b ;顯示收入資料
call show_str
add dl,9
mov di,dx
pop si
mov ax,ds:[si].80
mov dx,ds:[si].82 ;計算平均收入
mov cx,ds:[bp]
push si
call divdw
mov si,21*10 ;轉換
call dtoc
mov dx,di
mov cl,00001010b
call show_str ;顯示
inc dh
mov dl,20
add bp,2
pop si
pop cx
loop show1
mov ax,4c00h
int 21h
;顯示al中的字元
;al:字元ascll碼,cl:字元顏色,dh:行號,dl:列號
;返回值:無
dispal:
push si
push dx
push cx
push ax
push bx
mov bx,0b800h
mov es,bx
mov si,ax
mov al,160
mul dh ;計算行位址
mov bx,ax
mov al,2
mul dl
add bx,ax
mov ax,si
mov es:[bx],al
mov es:[bx].1,cl
pop bx
pop ax
pop cx
pop dx
pop si
ret;顯示ds:[si]中的字串
;ds:[si]:字串首位址,cl:字元顏色,dh:行號,dl:列號
;返回值:無
show_str:
push si
push dx
push cx
push ax
push bx
push si
mov ax,0b800h
mov es,ax
mov al,160
mul dh ;計算行位址
mov bx,ax
mov al,2
mul dl
add bx,ax
mov dl,cl
show: mov cl,ds:[si]
mov ch,0
jcxz ok
mov es:[bx],cl
inc bx
mov es:[bx],dl
inc bx
inc si
jmp short show
ok: pop si
pop bx
pop ax
pop cx
pop dx
pop si
ret
;將dword資料轉換為字串
;ds:[si]:字串首位址,dx,ax:數字的高位和低位
;返回值:無
dtoc:
push di
push bx
push si
push dx
push ax
push cx
mov di,0
push di
mov di,1
mov cx,10
a: call divdw
add cx,30h
push cx
inc di
mov cx,dx
add cx,ax
jcxz write
mov cx,10
jmp a
write: mov cx,di
b: pop bx
mov [si],bl
inc si
loop b
pop cx
pop ax
pop dx
pop si
pop bx
pop di
ret;進行不會產生溢位的除法運算
;dx,ax:數字的高位和低位,cx:除數
;返回值:結果的高位和低位,cx:餘數
divdw:
push si
push di
mov si,ax
mov ax,dx
mov dx,0
div cx
mov di,ax
mov ax,si
div cx
mov cx,dx
mov dx,di
pop di
pop si
retcode ends
end start
《組合語言》課程設計1
最近在學習王爽老師的 組合語言 感覺十分有意思。花了乙個下午做了第十章的課程設計1,對於組合語言新手來說還是有點難的。下面把 貼出來吧。一共200多行,感覺有些地方寫麻煩了,還可以更靈活的應用迴圈assume cs codesg data segment db 1975 1976 1977 1978...
王爽《組合語言》課程設計一
assume cs code,ds data buf segment db 0a0h dup 0 buf ends data segment db 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 db 1985 1986 1987 1988 198...
王爽《組合語言》課程設計1
注 dtoc 1子程式較實驗十中dtoc有如下不同 1.運算元據範圍由0 ffffh變為0 ffffffffh 2.向ds si指向的字串寫入資料後不會新增數字0 方便後面 如下 assume cs codesg datasg segment db 1975 1976 1977 1978 1979 ...