王爽 匯編語言 實驗十 匯編子程序設計


子程序1:顯示字符串

assume cs:code

data segment
db'100000000',0
data ends

code segment
start:
mov dh , 2
mov dl , 5
mov cl , 2
mov ax , data
mov ds , ax
mov si , 0
call show_str
mov ax , 4c00h

int 21h



;名稱:show_str
;功能:在指定的位置,用指定的顏色,顯示一個用0結束的字符串
;參數:(dh)=行號(取值范圍0~24),(dl)=列號(取值范圍0~79),(cl)=顏色,ds:si指向字符串的首地址
;返回:無
show_str:

push ax
push bx
push cx
push dx
push si
push bp
push di
push es

mov al , dh;行號
add al , 1
mov bl , 0a0h
mul bl
mov dh , 0
sub dx , 1;
add dx , dx;因為一個字符占兩個字節
add ax , dx;把dl中的列號加在ax中
mov di , ax;di放屏幕顯示的初始位置

mov ah , cl;ax 要顯示的字符和顏色
mov ch , 0;cx 確定循環的條件
mov bx , 0b800h
mov es , bx;es顯示的地址
mov bp , 0;顯示地址的游標
s_showstr:
mov cl , ds:[si]
mov al , ds:[si]
jcxz retseg
mov es:[di+bp] , ax
inc si
add bp , 2
loop s_showstr

retseg:
pop es
pop di
pop bp
pop si
pop dx
pop cx
pop bx
pop ax
ret

code ends

end start



 子程序2:解決除法溢出的問題

assume cs:code
code segment

start:

mov ax , 2h
mov dx , 2h
mov cx , 0ah

call divdw

mov ax , 4c00h
int 21h

;名稱:divdw

;功能:進行不會溢出的除法運算,被除數為dword型,除數為word型,結果為dword型

;參數:(ax)=dword型數據的低16位,(dx)=dword型數據的高16位,(cx)=除數

;返回:(dx)=結果的高16位,(ax)=結果的低16位,(cx)=余數

;X/N = int(H/N)*65536 +[rem(H/N)*65536+L]/N

divdw:

dataseg_divdw segment

db 100 dup(0) ;存放參數

db 100 dup(0) ;存放結果和中間變量

dataseg_divdw ends



push bx

push es



mov bx , dataseg_divdw

mov es , bx

mov es:[0] , ax ;L

mov es:[2] , dx ;H

mov es:[4] , cx ;N



mov dx , 0

mov ax , es:[2] ;計算 H/N , dx:ax / cx

div word ptr es:[4]

mov es:[100] , ax ;結果dx

mov ax , es:[0];[rem(H/N)*65536+L]/N ren是余數

div word ptr es:[4]

mov es:[102] , ax ;結果ax

mov es:[104] , dx ;結果cx



mov dx , es:[100]

mov ax , es:[102]

mov cx , es:[104]



pop bx

pop es



ret



code ends

end start

子程序3:數值顯示(word轉字符串)

assume cs:code 



data segment

db 10 dup(0)

data ends



code segment

start:

mov ax , 10000

mov bx ,data

mov ds , bx

mov si , 0

call dtoc



mov dh , 8

mov dl , 3

mov cl , 2

call show_str ; 子程序1實現



mov ax , 4c00h

int 21h



;名稱:dtoc

;功能:將word型數據轉變為表示十進制的字符串,字符串以0為結尾符。

;參數:(ax)=word型數據,ds:si指向字符串的首地址

;返回:無

dtoc:

dataseg_dtoc segment

db 100 dup(0) ;存放參數和寄存器值

db 100 dup(0) ;存放結果和中間變量

dataseg_dtoc ends

push bx

push es

push dx

push cx

push di



mov bx , dataseg_dtoc

mov es , bx

mov es:[0] , ax

mov es:[2] , ds

mov es:[4] , si



mov bx , 10

mov di , 0

mov ax , es:[0]

s:

mov dx , 0

div bx

mov cx , ax

add dl , 30h

mov byte ptr es:[100+di] ,dl

inc di

jcxz getCount

mov cx , 2 ; 當商為1的時候cx-- , 就為1了,就會跳出循環

loop s



getCount:

mov cx , di

mov ds , es:[2]

mov si , es:[4]

reverse:

mov bl , es:[99+di]

mov ds:[si] , bl

inc si

dec di

loop reverse

mov byte ptr ds:[si] , 0



mov ds , es:[2]

mov si , es:[4]



pop di

pop cx

pop dx

pop es

pop bx

ret



code ends

end start



子程序3加強版:32位數值轉字符串

assume cs:code 



data segment

db 20 dup(0)

data ends



code segment

start:

mov dx , 0

mov ax , 10

mov bx ,data

mov ds , bx

mov si , 0

call dtocex



mov dh , 8

mov dl , 3

mov cl , 4

call show_str ;子程序1實現



mov ax , 4c00h
int 21h



;名稱:dtocex

;功能:將dword型數據轉變為表示十進制的字符串,字符串以0為結尾符。

;參數:(ax)=dword型數據的低16位,(dx)=dword型數據的高16位,ds:si指向字符串的首地址

;返回:無

dtocex:

dataseg_dtocex segment

db 100 dup(0) ;存放參數和寄存器值
db 100 dup(0) ;存放結果和中間變量

dataseg_dtocex ends

push bx
push es
push di
push cx

mov bx , dataseg_dtocex
mov es , bx
mov es:[0] , ax
mov es:[2] , ds
mov es:[4] , si
mov es:[6] , dx

mov di , 0
mov ax , es:[0]

dtocex_s:
mov cx , 10
call divdw;dx:ax / cx = dx:ax~cx;子程序二實現
add cl , 30h
mov byte ptr es:[100+di] ,cl
inc di

cmp dx , 0
je dxisz
jmp dtocex_s

dxisz:
cmp ax , 0
jne dtocex_s


mov cx , di
mov ds , es:[2]
mov si , es:[4]

dtocex_reverse:
mov bl , es:[99+di]
mov ds:[si] , bl
inc si
dec di

loop dtocex_reverse
mov byte ptr ds:[si] , 0

mov ds , es:[2]
mov si , es:[4]

pop cx
pop di
pop es
pop bx


ret
code ends
end start




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: