文章目錄
順序結構
- 程序無分支、無循環、無轉移, 以直線方式一條指令接着一條指令順序執行
分支結構
- 運行時, 讓機器根據不同情況自動做出判斷, 有選擇地執行相應的處理程序
- 一般根據標誌寄存器的某些位作爲判斷條件
轉移指令
- 轉移指令可以改變程序的執行順序(也就是改變CS:EIP/IP指針的值)
- 轉移指令不改變標誌寄存器的值
條件轉移
調用格式:操作符 標號
如果滿足條件,則轉移,否則繼續執行
分支條件轉移特別需要注意以下幾點
- 選擇合適的轉移指令,注意有無符號的區別
- 爲每個分支安排好出口
- 把公共部分儘量放到公共段中
簡單條件轉移
指令名稱 | 助記符 | 轉移條件 | 功能說明 |
---|---|---|---|
相等/等於0轉 | JE/JZ | ZF=1 | 前次操作結果是否相等或等於0 |
不相等/不等於0轉 | JNE/JNZ | ZF=0 | 前次操作結果是否不相等或不等於0 |
爲負轉 | JS | SF=1 | 前次操作結果是否爲負 |
爲正轉 | JNS | SF=0 | 前次操作結果是否爲正 |
溢出轉 | JO | OF=1 | 前次操作結果是否溢出 |
未溢出轉 | JNO | OF=0 | 前次操作結果是否未溢出 |
進位位爲1轉 | JC | CF=1 | 前次操作結果是否有進位或借位 |
進位位爲0轉 | JNC | CF=0 | 前次操作結果是否無進位或借位 |
偶轉移 | JP/JPE | PF=1 | 前次操作結果中1的個數是否爲偶數 |
奇轉移 | JNP/JPO | PF=0 | 前次操作結果中1的個數是否爲奇數 |
無符號數
無符號數的運算結果有三種情況
- 結果爲正:大數-小數,結果爲正,無溢出無進位
- 結果爲0
- 結果爲負:小數-大數,結果爲負,高位變成1,產生進位
JA / JNBE
- 大於(above)轉移,比較兩個無符號數,a>b,則轉移
- 條件:CF=0且ZF=0(未進位或借位,運算結果不爲0)
JAE / JNB
- 大於等於(above equ)轉移,比較兩個無符號數,a>=b,則轉移
- 條件:CF=0或ZF=1(未進位或借位,或者運算結果爲0)
JB / JNAE
- 小於(below)轉移,比較兩個無符號數,a>b,則轉移
- 條件:CF=1且ZF=0(產生了進位或借位,運算結果不爲0)
JBE / JNA
- 小於等於(below equ)轉移,比較兩個無符號數,a>b,則轉移
- 條件:CF=1或ZF=1(產生了進位或借位,或者運算結果爲0)
有符號數
有符號數的結果比較複雜,分爲下面四種
- 不進位,不溢出
- 不進位,溢出
- 進位,不溢出
- 進位,溢出
溢出的情況分兩種:
- 負數 - 負數 = 正數
- 正數 + 正數 = 負數
JG / JNLE
- 大於(greater)轉移,比較兩個有符號數,a>b,則轉移
- 條件:SF=OF且ZF=0
JGE / JNL
- 大於等於(greater equ)轉移,比較兩個有符號數,a>=b,則轉移
- 條件:SF=OF或ZF=0
JL / JNGE
- 小於(less)轉移,比較兩個有符號數,a>b,則轉移
- 條件:SF≠OF且ZF=0
JLE / JNG
- 小於等於(less equ)轉移,比較兩個有符號數,a>b,則轉移
- 條件:SF≠OF或ZF=0
無條件轉移
無條件轉移指令使CPU無條件地轉移到指令指明的目的地址處執行,包括JMP、CALL、RET、INT和IRET
- 段內轉移:轉移指令和目的地址在同一段,只改變EIP
- 段間轉移:轉移指令和目的地址在不同段,改變EIP,同時改變CS寄存器
JMP有直接和間接尋址兩種方式
循環結構
按照一定規律, 多次重複執行一串語句
循環程序的結構
循環程序一般由以下 4 部分組成
- 初值部分:退出條件初值,循環內容初值
- 重複執行部分:重複執行某些操作
- 變量部分:利用變量的增或減,按順序訪問存儲器
- 退出條件部分:達到條件時退出循環
循環控制方法
計數控制法
用於循環次數已知的情況,有4種控制循環的指令
一般循環轉移指令
LOOP 標號
功能:ECX/CX先減一,然後判斷,不爲0則跳轉到標號處
等於或0循環轉移指令
LOOPE/LOOPZ 標號
功能:ECX/CX先減一,然後判斷,不爲0,並且ZF=1,則跳轉到標號處
不等於或0循環轉移指令
LOOP 標號
功能:ECX/CX先減一,然後判斷,不爲0,並且ZF=0,則跳轉到標號處
跳轉指令
JCXZ/JECXZ 標號
功能:當寄存器ECX/CX的值爲0時,跳轉到標號
該指令警經常放在循環前,用於跳過循環體
條件控制法
循環次數不確定,但是可以由某些條件確定
子程序設計
子程序的概念
將重複的或者經常用到的功能設計成可供反覆調用的獨立程序段,在需要的時候調用
子程序的定義
子程序名 PROC NEAR/FAR
…
子程序名 ENDP
如果主程序與子程序在相同段,則定義爲NEAR,NEAR可省略,否則定義爲FAR
子程序的調用與返回
調用指令CALL
段內直接調用
CALL 過程名
- EIP/IP入棧
- 目的地址 -> EIP/IP
段間直接調用
CALL FAR PTR 過程名
- CS入棧,目的段首址 -> CS
- EIP/IP入棧,目的地址 -> EIP/IP
段內間接調用
CALL WORD/DWORD PTR OPD
- EIP/IP入棧
- OPD -> EIP/IP
段間間接調用
CALL DWORD/FWORD PTR OPD
- CS入棧,( OPD + 2/4 ) -> CS
- EIP/IP入棧,OPD -> EIP/IP
返回指令RET
RET
- EIP/IP出棧
- 如果是段間調用,CS出棧
RET n
- 作用同上,特殊之處在於,在上述操作之後,廢除棧頂n/2或者n/4個無用的參數
- 當利用堆棧法傳遞參數時,常用此法回收空間
- CALL指令和RET指令均不影響標誌位
子程序現場保護方法
- 保護現場的工作,一般是在子程序中完成
- 在子程序開始處保護現場PUSH,在退出時恢復現場POP
- 棧中保存,先進後出
傳遞參數的方式
概念:主程序準備入口參數,子程序提供出口結果,這個過程稱爲參數傳遞
寄存器法
速度快,但是寄存器個數有限
約定單元法
- 把入口參數和出口參數都放到事先約定好的內存單元中
- 優點是不易出錯,缺點是佔用內存空間
堆棧法
- 通過堆棧傳遞參數
- 優點是不佔用寄存器,不佔用內存空間,靈活性強
- 缺點是存取參數時要計算堆棧地址,不能有差錯
程序設計注意事項
目標:
- 首先保證正確性
- 使程序結構合理,簡潔明瞭,容易閱讀和交流
- 便於使用和擴充,能節省存儲空間,提高運行速度
方法:
- 依操作數的多少,值的大小,正確分配數據存儲區
- 選擇合適的指令和尋址方式
- 選擇合適的尋址方式
- 選用效率高的指令
- 不要插入不必要的語句
- 合理安排寄存器的使用