bsp;mov si,0010h ;si=0010h
mov ax,0001h ;ax,=0001h
call Add
cmp 0100h:word ptr [0010h],0 ;Call Add subroutine
push ds ;Interrupted
push si
push ax
mov ds,0200h ;ds=0200h
mov si,0200h ;si=0020h
mov ax,0003h ;ax=0003h
call Add
cmp 0200h:word ptr [0020h],0 ;0200:0020h=0004h
jne
add ax,0200h:word ptr [0020h] ;ax=0007h
ret ;Return
pop ax ;ax=0001h
pop si ;si=0010h
pop ds ;ds=0100h
iret ;Return to Add subroutine
jne
add ax,0100h:word ptr [0100h] ;ax= 0001h
;0100h:0010h= 0002h
;----------------------------------------
;ax = 0003h
ret
mov bx,ax
而下面的子程序是不可重入的:
Add proc near
mov Temp,ax
mov ax,DS:word ptr [si]
cmp ax,0
je DonotTheValue
add ax,Temp
DonotTheValue:
ret
Temp:
dw 0
Add endp
可以利用检查可重入子程序的方法检查这个子程序的不可重入性,尝试一下在" mov ax,DS:word ptr [si]"指令后再次执行该子程序,那么就会出第一次调用返回的结果不对.
mov ds,0100h ;ds=0100h
mov si,0010h ;si=0010h
mov ax,0001h ;ax,=0001h
call Add
mov Temp,ax ;Call Add subroutine
;Temp=0001h
mov ax,0100h:word ptr [0010h] ;0100h:0010h=0002h
;ax=2
push ds ;Interrupted
push si
push ax
mov ds,0200h ;ds=0200h
mov si,0020h ;si=0020h
mov ax,0003h &
上一页 [1] [2] [3] [4] [5] 下一页