不會除法溢出的除法運算+現場保護
現有一子程序divOverFlow的功能是進行不會除法溢出的除法運算: 1000000 商100000
;輸入參數:被除數(高16位在DX中,低16位在AX中)、除數(在CX中)
;輸出:商(高16位在DX中,低16位在AX中)、餘數(在CX中) divOverFlow proc near
push ax
mov ax,dx
mov dx,0
div cx ;此時AX裏是公式加法左邊的結果
mov bx,ax ;保存到BX中
pop ax
div cx
mov cx,dx
mov dx,bx
ret divOverFlow endp 現在利用該子程序把數據段中的數據輸出到屏幕上。 DATAS SEGMENT
ARRAY DD 1000000 DATAS ENDS
程序如下:
DATAS SEGMENT
;此處輸入數據段代碼
data2 dd 1000000
DATAS ENDS
STACKS SEGMENT
;此處輸入堆棧段代碼
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此處輸入代碼段代碼
mov dx,word ptr data2+2
mov ax,word ptr data2
mov cx,10
mov si,0
again:
cmp dx,0
jnz next ;高位不爲零,即不爲零時轉到next
cmp ax,0 ;若高位爲零,比較低位是否爲零
jz display
next:
call divOverFlow
push cx
inc si ;記錄出棧操作次數
jmp again
display:
pop dx
add dl,30h
mov ah,2
int 21h
dec si
jnz display
MOV AH,4CH
INT 21H
;輸入參數:被除數(高16位在DX中,低16位在AX中)、除數(在CX中)
;輸出:商(高16位在DX中,低16位在AX中)、餘數(在CX中)
divOverFlow proc near
mov cx,10
push ax
mov ax,dx
mov dx,0
div cx ;此時AX裏是公式加法左邊的結果
mov bx,ax ;保存到BX中
pop ax
div cx
mov cx,dx
mov dx,bx
ret
divOverFlow endp
CODES ENDS
end start
在divOverFlow中,將CX重新賦值
運行結果爲1000000