8086汇编一道很典型的习题

assume cs:code,ss:stack

stack segment
    dw 16 dup(0)
stack ends

code segment
start:    mov ax,4240H
        mov dx,000FH
        mov cx,0AH
        call divdw

        mov ax,4C00H
        int 21H
;子程序说明
;参数    ax 存放被除数低16位
;          dx 存放被除数高16位
;          cx 存放除数
;返回值    dx 存放商的高16位
;              ax 存放商果的低16位
;              cx 存放余数
    divdw:
        push si        ;这个子程序只需要入栈保护si一个寄存器 因为ax,cx,dx是要作为出口参数返回的,如果子程序结束出栈恢复寄存器则会覆盖作为出口参数的值

        push ax         ;保存被除数低位 此操作不是为了保护原寄存器
        mov ax,dx     ;准备做被除数高位的除法
        mov dx,0       ;除数是16位则被除数是32位,dx放高位
        div cx             ;执行完后ax存放高位除法的商,dx存放高位除法的余数
        mov si,ax       ;高位除法商保存
        pop ax           ;低位还原到ax寄存器,此时dx是余数,刚好对应了公式中的rem(H/N)*65536+L
        div cx            ;执行结束后ax存放低位除法的商,dx是余数
        mov cx,dx     ;将余数存到cx用于返回
        mov dx,si      ;将高位商存到dx用于返回
        
        pop si
        ret
code ends
end start


;突破点:乘65536指的是高16位和低16位的关系 并不是要进行乘法运算

你可能感兴趣的:(汇编语言,王爽)