Skip to content

Commit b446ee7

Browse files
committed
Update CS253 Architectures II.md
1 parent 45cbc69 commit b446ee7

File tree

1 file changed

+87
-3
lines changed

1 file changed

+87
-3
lines changed

backup/CS253 Architectures II.md

Lines changed: 87 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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:
550550
END
551551
```
552552

553-
553+
---
554554

555555
### Lecture 5: Assembly Language (Ⅳ)
556556

@@ -822,5 +822,89 @@ $$
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

Comments
 (0)