【x86彙編】第四章:程序設計的基本方法

順序結構

  • 程序無分支、無循環、無轉移, 以直線方式一條指令接着一條指令順序執行

分支結構

  • 運行時, 讓機器根據不同情況自動做出判斷, 有選擇地執行相應的處理程序
  • 一般根據標誌寄存器的某些位作爲判斷條件

轉移指令

  • 轉移指令可以改變程序的執行順序(也就是改變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
  • 棧中保存,先進後出

傳遞參數的方式

概念:主程序準備入口參數,子程序提供出口結果,這個過程稱爲參數傳遞

寄存器法

速度快,但是寄存器個數有限

約定單元法

  • 把入口參數和出口參數都放到事先約定好的內存單元中
  • 優點是不易出錯,缺點是佔用內存空間

堆棧法

  • 通過堆棧傳遞參數
  • 優點是不佔用寄存器,不佔用內存空間,靈活性強
  • 缺點是存取參數時要計算堆棧地址,不能有差錯

程序設計注意事項

目標:

  • 首先保證正確性
  • 使程序結構合理,簡潔明瞭,容易閱讀和交流
  • 便於使用和擴充,能節省存儲空間,提高運行速度

方法:

  • 依操作數的多少,值的大小,正確分配數據存儲區
  • 選擇合適的指令和尋址方式
  • 選擇合適的尋址方式
  • 選用效率高的指令
  • 不要插入不必要的語句
  • 合理安排寄存器的使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章