最近在學習王爽老師的《組合語言》,感覺十分有意思。花了乙個下午做了第十章的課程設計1,對於組合語言新手來說還是有點難的。下面把**貼出來吧。一共200多行,感覺有些地方寫麻煩了,還可以更靈活的應用迴圈
assume cs:codesg
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,160000,24486,50065,97479,140416,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 11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
ascii segment
db 80 dup (' ') ;最終顯示的一行**佔32個字元
ascii ends
stack segment
dd 8 dup(0)
stack ends
codesg segment
start:
mov ax,stack
mov ss,ax
mov sp,32
mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov si,0
mov cx,21
year:
mov ax,[bx]
mov es:[si],ax
mov ax,[bx+2]
mov es:[si+2],ax
add si,16
add bx,4
loop year
mov di,0 ;168[di](雇員數)
mov bx,0 ;84[bx] (年收入資料)
mov si,0
mov cx,21
income:
mov ax,168[di]
mov es:[si+0ah],ax
mov ax,84[bx] ;低16位
mov dx,84[bx+2] ;高16位置
mov es:[si+5],ax
mov es:[si+7],dx
div word ptr es:[si+0ah]
mov es:[si+0dh],ax
add si,16
add di,2
add bx,4
loop income
;下面需要把table中的部分資料(es:[bx+5]~es:[bx+9])轉換為ascii
mov bx,0
mov ax,ascii
mov ds,ax
mov bx,0 ;bx指示行
mov cx,21
mov ax,0
push ax ;記錄快取區的行
copyascii:
mov ax,es:[bx]
mov ds:[0],ax
mov ax,es:[bx+2]
mov ds:[2],ax
mov si,6 ;[bx+6]為收入
mov ax,es:[bx+5]
mov dx,es:[bx+7]
call changetoascii
mov dx,0
mov ax,es:[bx+0ah]
mov si,16
call changetoascii
mov dx,0
mov ax,es:[bx+0dh]
mov si,26
call changetoascii
; ds:si指向的,儲存ascii的區域,複製到顯示快取區
pop ax
inc ax
push ax
call showascii
add bx,10h ;指向tale下一行
loop copyascii
mov ax,4c00h
int 21h
上面算是「主程式」吧,接下來就是幾個函式了
;******下面都是各個函式***********
changetoascii:
;在呼叫changtoascii前,ds:si都是設定好的
push cx
push di
push ax
push dx
push bx
push si
mov di,0
s0:mov cx,10
call divdw
add cl,30h
mov ch,0
push cx
inc di
mov cx,0
or cx,ax
or cx,dx
jcxz ok
jmp short s0
ok:mov cx,di
changes0:
pop bx
mov ds:[si],bl
inc si
loop changes0
pop si
pop bx
pop dx
pop ax
pop di
pop cx
retdivdw:
;呼叫前dx-ax為被除數,cx為除數
;呼叫後dx-ax為商,cx為餘數
push si
push ax
mov ax,dx
mov dx,0
div cx
mov si,ax
pop ax
div cx ;[rem(h/n)*65536+l]/n, ax中為商,dx中為餘數
mov cx,dx
mov dx,si
pop si
retshowascii:
;ax 表示行
push es
push cx
push bx
push di
push si
push ax
mov ax,ascii
mov ds,ax
mov si,0
mov ax,0b800h
mov es,ax
mov bl,160 ;每行的位元組數
pop ax
mul bl ; es:[ax]指向快取區
mov di,ax
mov cx,80
shows0:
mov bl,ds:[si]
mov es:[di],bl
add si,1
add di,2
loop shows0
pop si
pop di
pop bx
pop cx
pop es
retcodesg ends
end start
這個課程設計基本包含了好幾個前面章節實驗的內容了,有空我再詳細整理出來~ 8086組合語言課程設計
最近自學了王爽的 組合語言 全書共有兩次課程設計,這是第乙個 給定資料如下 data segment db 1975 1976 1977 1978 1979 1980 1981 1982 1983 db 1984 1985 1986 1987 1988 1989 1990 1991 1992 db ...
王爽《組合語言》課程設計1
注 dtoc 1子程式較實驗十中dtoc有如下不同 1.運算元據範圍由0 ffffh變為0 ffffffffh 2.向ds si指向的字串寫入資料後不會新增數字0 方便後面 如下 assume cs codesg datasg segment db 1975 1976 1977 1978 1979 ...
王爽《組合語言》課程設計一
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...