王爽《組合語言》課程設計1

2021-10-19 07:20:58 字數 4305 閱讀 9462

注:dtoc_1子程式較實驗十中dtoc有如下不同:1.運算元據範圍由0-ffffh變為0-ffffffffh;2.向ds:si指向的字串寫入資料後不會新增數字0(方便後面)

**如下:

assume cs:codesg

datasg segment

db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985'

db '1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827

dd 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

datasg ends ;di->年份和收入 bx->雇員

string segment

db ' ',0 ;佔位32b(16字)

string ends

stacksg segment

dw 0,0,0,0,0,0,0,0

dw 0,0,0,0,0,0,0,0 ;棧空間:0-1fh

stacksg ends

codesg segment

start:

mov ax,stacksg

mov ss,ax

mov sp,20h ;初始化棧空間

mov ax,datasg

mov es,ax

xor di,di

xor bx,bx ;es->運算元據:di->年份和收入,bx->雇員

;年份+0,收入+54h,雇員+0a8h

mov ax,string

mov ds,ax

xor si,si ;ds:si->string

mov cx,21 ;列印21年資訊

mov dx,0312h;設定列印位置

s: push cx ;儲存程式計數,下面需要cx暫存器

push dx ;儲存列印位置,下面需要dx暫存器

mov cx,40 ;清空string:防止這公司哪年賠大了哈哈

s5: mov byte ptr ds:[si],' '

add si,1

loop s5

xor si,si

mov ax,es:[di+0]

mov dx,es:[di+2]

mov ds:[si+0],ax

mov ds:[si+2],dx

add si,8 ;寫入年份資訊並將si->下一位置

mov ax,es:[di+54h]

mov dx,es:[di+56h] ;(dx)(ax)=收入

push ax

push dx ;儲存收入資訊,以便計算人均收入

call dtoc_1

add si,8 ;寫入收入資訊並將si->下一位置

add di,4 ;di->下一年份和收入

xor dx,dx

mov ax,es:[bx+0a8h] ;(dx)(ax)=雇員

push ax ;儲存雇員資訊,以便計算人均收入

call dtoc_1

add si,8 ;寫入雇員資訊並將si->下一位置

add bx,2 ;bx->下一雇員

pop cx ;(cx)=雇員

pop dx

pop ax ;(dx)(ax)=收入,!注意高低位字順序!

call divdw ;當前資料並不會溢位,這裡也可以用32位除

call dtoc_1

pop dx ;歸還列印位置給dx,為show_str準備引數

mov cx,2 ;設定列印顏色,為show_str準備引數

xor si,si ;將ds:si->string,為show_str準備引數

call show_str

pop cx

inc dh ;下一年資訊將列印到下一行

loop s

mov ax,4c00h

int 21h

;ds:si->字串,(bx)(ax)=運算元據

;暫存器均不會被修改

;與實驗10的dtoc不同,dtoc_1的運算元據範圍:0-ffffffffh

; 且字串結尾不再新增數字0

dtoc_1:

push ax

push bx

push dx

push cx

push di ;將用到的暫存器入棧

xor di,di ;di記錄轉化後字串長度,方便ok1

s3: mov cx,10

call divdw ;32位除中,商可能溢位,所以用divdw

push cx ;將餘數壓入棧:若直接寫入string段則為逆序

inc di

mov cx,ax

add cx,dx ;檢查商((bx)+(ax))是否為0

jcxz ok1

jmp s3

ok1:mov cx,di

xor bx,bx

s4: pop ax

add ax,30h ;將數字(0-9)轉化為字元

mov ds:[si+bx],al ;!注意,這裡是al而不是ax

inc bx

loop s4

pop di

pop cx

pop dx

pop bx

pop ax ;恢復被修改的暫存器

ret;ds:si->字串首位址

;dh行號 dl列號 cl顏色

;暫存器均不會被修改

show_str:

push es

push di

push ax

push bx

push cx

push dx ;將用到的暫存器入棧

mov ax,0b800h

mov es,ax

xor ax,ax

mov al,160

mul dh ;8位乘

xor dh,dh

add dx,dx

add ax,dx

mov di,ax ;es:di->指定顯示首位址

mov al,cl ;cl即將被用作判斷

xor bx,bx

s0: mov cl,ds:[si+bx]

jcxz ok0 ;若(cx)=0退出迴圈

mov es:[di+0],cl ;寫入要列印的字元

mov es:[di+1],al ;寫入要列印字元的顏色

inc bx

add di,2

jmp s0

ok0:pop dx

pop cx

pop bx

pop ax

pop di

pop es ;恢復被修改的暫存器

ret;(dx)=h,(ax)=l,(cx)=n

;(dx)(ax)/(cx)=(dx)(ax)

;(dx)(ax)%(cx)=(cx)

;除返回所用暫存器外,其他均不會被修改

divdw:

push bx ;將用到的暫存器入棧

mov bx,ax ;(bx)=被除數低16位

mov ax,dx

xor dx,dx ;(dx)(ax)=h

div cx ;32位除,(ax)=h/n,(dx)=h%n

push ax ;壓入h/n

mov ax,bx ;(dx)(ax)=h%n*65536+l

div cx ;(ax)=(h%n*65536+l)/n

mov cx,dx ;(cx)=(dx)=餘數

pop dx ;(dx)(ax)=

; h/n*65536+(h%n*65536+l)/n

pop bx ;恢復被修改的暫存器

retcodesg ends

end start

執行結果如下:

王爽《組合語言》課程設計一

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

最近在學習王爽老師的 組合語言 感覺十分有意思。花了乙個下午做了第十章的課程設計1,對於組合語言新手來說還是有點難的。下面把 貼出來吧。一共200多行,感覺有些地方寫麻煩了,還可以更靈活的應用迴圈assume cs codesg data segment db 1975 1976 1977 1978...

組合語言 王爽

cpu有三條匯流排 位址 資料 控制線 位址匯流排確定儲存單元 控制匯流排傳送指令 資料匯流排 傳輸資料 cpu n個位址線 位址匯流排寬度為n 可以尋找2 n個記憶體單元 儲存單元 0開始編號,乙個儲存單元可以儲存乙個byte 8086cpu有16根位址線 1bit就是一根位址線 注意 儲存器以b...