检测点10.1
第一空:1000
第二空:0000
检测点10.2
ax=6
注意: 执行call s是ip的值为6 接着进栈,然后执行pop ax 相当于把ip的值放到ax中!!
检测点10.3
ax=1100H
注意:执行callfar ptr s后 cs=1000 ip=3(10H)接着进栈 然后执行pop ax 此时ax=3
==〉add ax,ax此时ax=6(100H)==〉pop bx 此时bx=1000 ==〉add ax,bx此时ax=1100H
检测点10.4
ax=000B 具体我就不一一分析了,呵呵!!
检测点10.5
(1)
ax=3
(1)ax=1 bx=0
实验十:编写子程序
(1)显示字符串
;*******************************************************************
;显示字符串的子程序 (dh)= 行号(取值范围0-24),(dl)=列号(取值范围0-79)
;(cl)=颜色,ds:si指向字符串的首地址
;********************************************************************
assume cs:code,ds:data,es:display,ss:stack
data segment
db 'welcome to masm!',0
data ends
stack segment
db 8 dup(0)
stack ends
display segment
db 1024 dup(0)
display 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 cx
push si
mov ax,0B800H
mov es,ax
mov al,0a0h
dec dh
mul dh
mov bx,ax
mov al,2
mul dl
sub dl,2
add bx,ax ;得到偏移地址=(dh-1)*160+dl*2-2
mov di,0
mov ch,0
mov al,cl
s:
mov cl,ds:[si]
jcxz next ;进行判断最后一个字符是否是零,如果是零则结束
mov es:[bx+di],cl ;将字符串放到偶地址中
mov es:[bx+di+1],al ;颜色属性放到奇地址中
add di,2
inc si
jmp s
next:
pop si
pop cx
ret
code ends
end start
注意:子程序中用到的寄存器一定要将其保存起来,注意参数的传递!!!,只要程序中要进栈和出栈,就一定要定义堆栈段!!!!
2.解决除法溢出问题
;*****************************************************************
;解决除法溢出问题,
;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
;*****************************************************************
assume cs:code,ss:stack
stack segment
dw 8 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,10h
mov ax,4240h
mov dx,0fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw: ;子程序定义开始
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx ;dx:ax/cx=高位的商*65536+[高位的余数*65536+低位]/cx
ret ;子程序定义结束
code ends
end start
3.数值显示子程序
;**********************************************
;数值显示子程序
;编程,将data段中的数据以十进制的形式显示出来
;**********************************************
assume cs:code,ds:data
data segment
db 10 dup(0)
data ends
code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
;******************************************************
;将word型的数据转变为十进制数字符串的子程序
;****************************************************
dtoc:
push ax
push si
push dx
push cx
push bx
mov bx,0
s0:
mov cx,10d
mov dx,0
div cx
mov cx,ax ;将商放到cx中判断商是否为零
jcxz s1
add dx,30h
push dx
inc bx
jmp s0
s1:
add dx,30h
push dx
inc bx
mov cx,bx
mov si,0
s2:
pop ax
mov ds:[si],al
inc si
loop s2
pop bx
pop cx
pop dx
pop si
pop ax
ret
;***********************************************************
;显示字符串子程序
;***********************************************************
show_str:
push bx
push cx
push si
mov al,0a0h
dec dh
mul dh
mov bx,ax
mov al,2
mul dl
sub ax,2
add bx,ax ;得到偏移地址=(dh-1)*160+(dl-2)*2
mov ax,0B800H
mov es,ax
mov di,0
mov ch,0
mov al,cl
s:
mov cl,ds:[si]
jcxz next ;进行判断最后一个字符是否是零,如果是零则结束
mov es:[bx+di],cl ;将字符串放到偶地址中
mov es:[bx+di+1],al ;颜色属性放到奇地址中
add di,2
inc si
jmp short s
next:
pop si
pop cx
pop bx
ret
code ends
end start