chunhuaqiuyue 发表于 2022-1-1 22:41:36

实验10-2

assume cs:code

code segment
start:
        mov ax,4247h
        mov dx,000fh
        mov cx,0ah
        call divdw

        mov ax,4c00h
        int 21h

divdw:
        mov bx,ax
        mov ax,dx
        mov dx,0;; 以上三步则是 计算 H/N, 之后ax=int(H/N), dx=rem(H/N)
        div cx
    ; 因为当前ax中存放的是 int(H/N),相当于存放的是高位的数据
    ; 所以下面这3个 xor 操作是将高位的值放到bx中,然后再将 L 的数据放到ax中
        xor ax,bx ; 交换 ax和bx 的值
        xor bx,ax ; 交换 ax和bx 的值
        xor ax,bx ; 交换 ax和bx 的值
    ; 交换的目的其实只是为了减少空间的使用,不使用多余的内存来存储数据
        div cx
    ; 这一步之后,存放的是 ax=(rem(H/N)*65536+L)/N 的结果
    ;                  dx=余数
   

    ; 将高位的结果放到dx中
    xor dx,bx
    xor bx,dx
    xor dx,bx
   
        mov cx,bx ; 将余数存入cx
        ret

code ends
end start

snamp 发表于 2024-9-10 15:21:56

; 将高位的结果放到dx中
    xor dx,bx
    xor bx,dx
    xor dx,bx
   
      mov cx,bx ; 将余数存入cx
这里不对吧?

snamp 发表于 2024-9-10 15:33:09

;不溢出除法子程序开始
DIVDW:
        PUSH BX
       
        ;AX=L DX=H CX=N
        MOV BX,AX        ;备份被除数低16位
        MOV AX,DX
        XOR DX,DX        ;DX清零
        DIV CX        ;计算H/N,之后AX=商INT(H/N) DX=余数REM(H/N)
       
        ;交换AX,BX,H放BX中,L放AX中
        XOR AX,BX
        XOR BX,AX
        XOR AX,BX
       
        DIV CX        ;AX=/N,DX=余数
        MOV CX,DX        ;余数放CX中
        MOV DX,BX
       
        POP BX
       
        RET
;不溢出除法子程序结束
页: [1]
查看完整版本: 实验10-2