不会除法溢出的除法运算+现场保护
现有一子程序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