彙編學習記錄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

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