王爽 汇编语言 实验十 汇编子程序设计
子程序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
作者:BuildNewApp
出处:http://syxchina.cnblogs.com、 BuildNewApp.com
本文版权归作者、博客园和百度空间共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则作者会诅咒你的。
如果您阅读了我的文章并觉得有价值请点击此处,谢谢您的肯定1。