@@ -397,7 +397,7 @@ das ; 调整AL为88h (88的压缩BCD格式)
397397| ` JAE ` | Above or Equal | ` CF=0 ` | ` JNAE ` | Not Above or Equal | ` CF=1 ` |
398398| ` JB ` | Below | ` CF=1 ` | ` JNB ` | Not Below | ` CF=0 ` |
399399| ` JBE ` | Below or Equal | ` ZF=1 or CF=1 ` | ` JNBE ` | Not Below or Equal | ` ZF=0 and CF=0 ` |
400- | ` JC ` | ** Carry** | ` CF=1 ` | ` JNC ` | ** Not Carry** | ` CF=0 ` |
400+ | ` JC ` | Carry | ` CF=1 ` | ` JNC ` | Not Carry | ` CF=0 ` |
401401| ` JCXZ ` | CX is Zero | ` CX=0 ` | - | - | - |
402402| ` JE ` | Equal | ` ZF=1 ` | ` JNE ` | Not Equal | ` ZF=0 ` |
403403| ` JG ` | Greater | ` ZF=0 and SF=OF ` | ` JNG ` | Not Greater | ` ZF=1 or SF!=OF ` |
@@ -550,7 +550,7 @@ again:
550550END
551551```
552552
553-
553+ ---
554554
555555### Lecture 5: Assembly Language (Ⅳ)
556556
822822- ` FSUBR S1/D, S2 ` 与上面相反,相当于 ` S1 = S2 - S1 `
823823- 此外还有 ` FMUL ` ,` FDIV ` ,` FMULP ` ,` FIMUL ` ,` FDIVR ` ,` FDIP ` ,` FIDIV ` 等
824824
825- ---
825+ ### Lecture 6: Assembly Language (V)
826+
827+ #### 浮点数计算 —— 毕达哥拉斯问题
828+
829+ <img src =" https://s2.loli.net/2025/01/18/yO3klJvp1MThsYD.png " alt =" image-20250118下午94629825 " style =" zoom :50% ;" />
830+
831+ 使用 FP 处理器 (8087) 执行上述计算
832+
833+ ``` assembly
834+ .8087 ; 告诉 MASM 协处理器存在
835+ .MODEL medium
836+ .STACK
837+ .DATA
838+
839+ SX dd 5.0 ; 定义短实数(4 字节),初始值为 5.0
840+ SY dd 12.0 ; 定义短实数(4 字节),初始值为 12.0
841+ HY dd 0.0 ; 定义短实数(4 字节),用于存储结果
842+ cntrl dw 03FFh ; 定义控制字,用于设置 8087 协处理器的状态
843+ stat dw 0 ; 定义状态字,用于存储 FPU 的状态
844+
845+ .CODE
846+ .STARTUP
847+
848+ FINIT ; 初始化 FPU,将其设置为默认状态
849+ FLDCW cntrl ; 加载控制字,设置舍入模式为偶数,并屏蔽中断
850+
851+ FLD SX ; 将 SX 压入 FPU 栈
852+ FMUL ST, ST(0) ; 将栈顶元素与自身相乘,结果存储在栈顶
853+ FLD SY ; 将 SY 压入 FPU 栈
854+ FMUL ST, ST(0) ; 将栈顶元素与自身相乘,结果存储在栈顶
855+ FADD ; 将栈顶的两个数相加
856+ FSQRT ; 计算栈顶元素的平方根
857+ FSTSW stat ; 将 FPU 的状态字加载到 [stat]
858+ mov ax, stat ; 将 [stat] 复制到 AX
859+ and al, 0BFh ; 检查所有 6 个状态位
860+ jnz pass ; 如果有任何位被设置,则跳转到 pass
861+ FSTP HY ; 将栈顶的结果存储到 HY
862+ jmp print ; 跳转到打印函数
863+
864+ print:
865+ mov bx, OFFSET HY ; 将 HY 的地址加载到 BX 寄存器
866+ mov ax, [bx+2] ; 将 HY+2 的值加载到 AX 寄存器
867+ mov cx, 16 ; 设置循环次数为 16
868+ call print_num
869+ mov ax, [bx] ; 将 HY 的值加载到 AX 寄存器
870+ mov cx, 16
871+ call print_num
872+ jmp pass
873+
874+ print_num:
875+ push bx ; 存储 BX 寄存器
876+ rol ax, 1 ; 将 AX 寄存器左移一位
877+ jc set ; 如果 ZF=1 ,则 DL='1'
878+ mov dl, '0' ; DL='0'
879+ jmp over
880+
881+ set:
882+ mov dl, '1'
883+
884+ over:
885+ push ax ; 存储 AX 寄存器
886+ mov ah, 02h
887+ int 21h
888+ pop ax ; 恢复 AX 寄存器
889+ loop print_num
890+ pop bx ; 恢复 BX 寄存器
891+ ret
892+
893+ pass:
894+ nop
895+
896+ ; 程序结束
897+ mov ah, 4Ch ; 设置 AH 为 4Ch(DOS 功能调用:程序退出)
898+ int 21h
899+
900+ END
901+ ```
902+
903+ ` HY ` 在内存中的排列:
904+
905+ ![ image-20250118下午104917314] ( https://s2.loli.net/2025/01/18/UHmLhaO6S5Bqesb.png )
906+
907+ > 汇编的内容终于结束了 ~ \( ≧▽≦)/~
908+
909+ ------
826910
0 commit comments