《組合語言》課程設計1

2021-08-19 08:43:46 字數 3825 閱讀 7743

最近在學習王爽老師的《組合語言》,感覺十分有意思。花了乙個下午做了第十章的課程設計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...