王爽《組合語言》實驗10 編寫子程式

2022-07-06 21:00:22 字數 4796 閱讀 7456

前幾個實驗都沒記錄,實驗10想記錄一下!

名稱:show_str

功能:指定位置,指定顏色,顯示乙個以數字0結束的字串

引數:(dh)=行號,(dl)=列號,(cl)=顏色,ds:si->字串

返回:無

;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

名稱:divdw

功能:32位除商不會溢位(餘數自然不會溢位)

引數:(dx)(ax)=被除數,(cx)=除數

返回:(dx)(ax)=商,(cx)=餘數

;(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 ;恢復被修改的暫存器

ret

名稱:dtoc

功能:將範圍在0-65535的資料轉化為十進位制字串,並新增數字0結尾

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

返回:無

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

;字串結尾新增數字0

;暫存器均不會被修改

dtoc:

push ax

push bx

push dx

push cx

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

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

s3: mov bx,10

xor dx,dx ;(dx)(ax)=運算元據

div bx

mov cx,ax

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

inc di

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

mov ds:[si+bx],0 ;結尾新增數字0

pop di

pop cx

pop dx

pop bx

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

ret

data segment

dw 123,12666,1,8,3,38

data ends

**如下:

assume cs:codesg,ds:data

data segment

dw 123,12666,1,8,3,38

data ends

string segment

string ends

stack segment

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

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

stack ends

codesg segment

start:

mov ax,stack

mov ss,ax

mov sp,20h ;初始化棧

mov ax,string

mov ds,ax

xor si,si ;ds:si->字串

mov ax,data

mov es,ax

mov di,di ;es:di->運算元據集

mov dh,5

mov dl,20

mov cl,2 ;準備show_str引數:5行20列綠色

push cx ;記錄顏色資訊,cx即將被用作迴圈計數

mov cx,6

xor bx,bx

s1: mov ax,es:[di+bx] ;準備dtoc引數

call dtoc

mov ax,cx ;ax暫存迴圈計數

pop cx ;歸還顏色資訊給cx

call show_str

push cx

mov cx,ax ;歸還迴圈計數給cx

inc dh ;下個運算元據將列印在下一行,偷個懶哈哈哈

add bx,2

call dtoc

loop s1

mov ax,4c00h

int 21h

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

;字串結尾新增數字0

;暫存器均不會被修改

dtoc:

push ax

push bx

push dx

push cx

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

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

s3: mov bx,10

xor dx,dx ;(dx)(ax)=運算元據

div bx

mov cx,ax

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

inc di

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

mov ds:[si+bx],0 ;結尾新增數字0

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 ;恢復被修改的暫存器

retcodesg ends

end start

執行結果如下:

王爽《組合語言》第三版 實驗10 編寫子程式

1.顯示字串 子程式描述 名稱 show str 功能 在指定的位置,用指定的顏色,顯示一 個用0結束的字串。引數 dh 行號 取值範圍0 24 d 列 號 取值範圍0 79 cl 顏色,ds si指向字串的首位址 返回 無 應用舉例 在螢幕的8行3列,用綠色顯示data段中的字串。assume c...

王爽 組合語言 實驗10 1

assume cs code,ds data data segment db welcome to masm 0 data ends code segment start mov dh,8 行號 mov dl,3 列號 mov cl,2 顏色 mov ax,data mov ds,ax mov si...

王爽 組合語言 實驗7

assume cs codesg,ds data 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...