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