10.1、显示字符串
assume cs:code
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,0
call show_str
mov ax,4c00h
int 21h
show_str:
push ax
push bx
push cx
push dx
push di
mov al,160
mul dh ;ax存放行地址
mov bl,dl
mov bh,0
inc bx ;显示一个字符占用两个字节
add ax,bx
mov di,ax ;di中存放打印的首地址
mov bx,0b800h
mov es,bx
mov bx,0
mov al,cl
s: mov cl,ds:[bx]
mov ch,0
jcxz ok
mov es:[di],cl
mov es:[di+1],al
add di,2
inc bx
jmp short s
ok: pop di
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
10.2解决除法溢出的问题
对于32位的被除数,先高位的16位在前面补0组成一个32位数除以除数,得到的商便是最终结果的高16位,而得到的余数作为一个新的32位数的高16位,而被除数的低16位作为新32位数中的低16位,除以被除数,得到的余数就是最终的余数,而得到的商就是结果的低16位
assume cs:codesg,ss:stack
stack segment
dw 16 dup (0)
stack ends
codesg segment
start:
mov ax,stack
mov ss,ax
mov sp,32
mov ax,4240h
mov dx,0fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw:
mov si,ax ;先高位除以被除数,暂存ax
mov ax,dx
mov dx,0 ;除数16位,被除数应为32位,高位存储在dx中
div cx
mov bx,ax ;bx存储商
mov ax,si ;取出低位的值,上次除法的余数留在dx中作为这次除法的高16位,ax作为低16位
div cx ;ax作为最终的商的低16位
mov cx,dx
mov dx,bx ;第一次除法的商作为最终的商的高16位
ret
codesg ends
end start
10.3数据显示
assume cs:code,ss:code
data segment
db 10 dup (0)
data ends
stack segment
dw 256 dup (0)
stack ends
code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov bx,stack
mov ss,bx
mov sp,200h
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:
push ax
push bx
push cx
push dx
push di
mov di,0 ;保存余数的个数
s3: mov dx,0
mov bx,10
div bx
mov cx,ax ;商
push dx ;保存余数进栈
inc di ;每次进栈,余数个数加一
jcxz s1 ;商为0时,所有余数已经进栈,可跳转s1进行字符转换后存储至数据段中
jmp short s3
s1:
mov cx,di ;余数个数,也即循环次数
mov bx,si ;数据要保存的偏移地址,由调用方传递进来
s0: pop ax
add al,30h
mov ds:[bx],al
inc bx
loop s0
mov byte ptr ds:[bx],0 ;字符串结尾补0
pop di
pop dx
pop cx
pop bx
pop ax
ret
show_str:
push ax
push bx
push cx
push dx
push di
mov al,160
mul dh ;ax存放行地址
mov bl,dl
mov bh,0
inc bx ;显示一个字符占用两个字节
add ax,bx
mov di,ax ;di中存放打印的首地址
mov bx,0b800h
mov es,bx
mov bx,0
mov al,cl
s: mov cl,ds:[bx]
mov ch,0
jcxz ok
mov es:[di],cl
mov es:[di+1],al
add di,2
inc bx
jmp short s
ok: pop di
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
进行debug跟踪,除错,并观察执行过程中的寄存器变化情况,最终数据可以按照需求进行正常显示到屏幕中。如下图