8086組合語言課程設計

2021-07-11 19:44:47 字數 4788 閱讀 8343

最近自學了王爽的《組合語言》,全書共有兩次課程設計,這是第乙個:

給定資料如下

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 ...