跳转至

Lecture 6. 汇编语言 Part5:浮点与 8087

这一节就只是给出了一个浮点运算的汇编代码的例子,实验当中也有涉及过。

代码主要分两块,一块是浮点运算,另一块是打印输出。

对于浮点计算,就是注意一下一开始的初始化操作,以及检查运算是否发生错误(检查 status word,与上 3fh)。

    FINIT           ; Set FPU to default state
    FLDCW cntrl     ; Round even, Mask Interrupts
    FLD A          ; Push A onto FP stack
    FLD A          ; Push A onto FP stack
    FMUL ST, ST(1)  ; Multiply top two numbers on stack to ST
    FMUL ST, ST(1)  ; Multiply top two numbers on stack to ST
    nop             ; Now ST is A^3
    FLD B          ; Push B onto FP stack
    FSQRT           ; Square root number on stack
    nop             ; Now ST is sqrt(B), ST(1) is A^3
    FADD ST, ST(1)  ; Add up top two numbers on stack to ST
    FSTSW stat      ; Load FPU status into [stat]
    mov ax, stat    ; Copy [stat] into ax
    and al, 03Fh    ; Check all 6 status bits
    jnz pass        ; If any bit set then jump
    FSTP RESULT     ; Copy result from stack into RESULT

对于打印输出,就是利用寻址以及移位,分别获取 32 个 bit 的值,然后打印。注意,这个 32 bit 的值先打印高 16 位,再打印低 16 位。因此用到了两次 mov bx, OFFSET RESULT

RESULT 的四个字节的地址关系是这样的(对应图中 HY)

    mov bx, OFFSET RESULT
    inc bx
    inc bx          ; Get higher 16 bits of RESULT
    mov ax, [bx]
    mov bx, ax
    mov cx, 16
back:
    rol bx, 1
    jc set
    mov dl, '0'
    jmp over
set:
    mov dl, '1'
over:
    mov ah, 02h
    int 021h
    cmp cx, 16  ; print a space for view
    je space
    cmp cx, 8   ; print a space for view
    je space
    jmp nospace
space:
    mov ah, 02h
    mov dl, ' '
    int 021h
nospace:
    loop back
    mov bx, OFFSET RESULT
    mov ax, [bx]
    mov bx, ax
    mov cx, 16
back1:
    rol bx, 1
    jc set1
    mov dl, '0'
    jmp over1
set1:
    mov dl, '1'
over1:
    mov ah, 02h
    int 021h
    loop back1