汇编学习记录1——不会除法溢出的除法运算+现场保护

不会除法溢出的除法运算+现场保护

现有一子程序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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章