微機原理第七周筆記

5.7 匯編語言程序設(shè)計舉例

匯編源程序的設(shè)計步驟

  • 分析問題,建立數(shù)學模型
  • 確定最佳算法
  • 合理分配存儲單元和寄存器
  • 繪制流程圖
  • 編寫程序
  • 調(diào)試程序

程序基本結(jié)構(gòu)

  • 模塊化設(shè)計方法
    ? “自頂向下,逐步細化”
  • 結(jié)構(gòu)化編碼方法
    ? 順序、分支、循環(huán)三種基本結(jié)構(gòu)

  • 順序程序設(shè)計
    指令指針 IP 值線性增加,IP = IP + 1
  • 條件程序設(shè)計
    IP 值受標志位的影響而跳變,影響標志的指令 CMP、TEST、JXX
  • 循環(huán)程序設(shè)計
    IP 值受計數(shù)器 CX 中的值不為零而循環(huán),影響標志的指令 DEC

5.7.2順序結(jié)構(gòu)程序設(shè)計

5.7.3分支結(jié)構(gòu)程序設(shè)計

  1. 分支程序的結(jié)構(gòu)形式
    單純分支、并行分支結(jié)構(gòu)、選擇分支結(jié)構(gòu)


  2. 跳躍表法
    需要在數(shù)據(jù)段事先安排一個按順序排列的轉(zhuǎn)移地址表。
    輸入的數(shù)字作為偏移量。因為只有2個字節(jié)16位偏移地址,所以偏移量需要乘2。
    多分支結(jié)構(gòu)的實現(xiàn),還可以使用跳躍表法,使程序能根據(jù)不同的條件轉(zhuǎn)移到多個程序分支中去。
    關(guān)鍵是要理解間接尋址方式JMP指令

5.7.4循環(huán)結(jié)構(gòu)程序設(shè)計

  1. 循環(huán)程序結(jié)構(gòu)
    三種循環(huán):計數(shù)循環(huán),當循環(huán),直到循環(huán)

    循環(huán)程序由五個部分組成:
    循環(huán)初始化部分,循環(huán)體,循環(huán)修改部分,循環(huán)控制部分,結(jié)束處理部分
  2. 循環(huán)控制方法
    計數(shù)控制(循環(huán)次數(shù)已知時,常用)
    ① 倒計數(shù) 將循環(huán)次數(shù)n ,送入循環(huán)計數(shù)器中,每循環(huán)一次,計數(shù)器減1,直到其值為0。
……
MOV CX,循環(huán)次數(shù)
LOOPA:……
       ……
       DEC CX
       JNE LOOPA

② 正計數(shù) 循環(huán)次數(shù)n 。0送入循環(huán)計數(shù)器中,每循環(huán)一次,計數(shù)器加1,直到其值為n。

……
MOV CX,0
LOOPA:……
       ……
      INC CX
      CMP CX, n
      JNE LOOPA 

條件控制
循環(huán)次數(shù)未知。但是循環(huán)結(jié)束與某些條件(比較、運算的結(jié)果等等)相 關(guān),比較所要求的條件是否達到,未滿足繼續(xù)循環(huán),否則結(jié)束循環(huán)。 在解決實際問題時,往往要根據(jù)問題給定的已知條件,在認真分析 算法之后才能確定選用哪種方法。
邏輯尺控制
循環(huán)體內(nèi)的處理任務(wù)在每次循環(huán)執(zhí)行時并無規(guī)律,但確實 需要連續(xù)運行。此時,可以給各處理操作標以不同的特征 位,所有特征位組合在一起,就形成了一個邏輯尺。

5.7.5子程序設(shè)計

  1. 子程序定義與調(diào)用
    ①定義:
過程名 PROC [NEAR/FAR]
       … 
       RET 
過程名 ENDP 

②調(diào)用: CALL 過程名
?子程序名也具有段屬性,偏移地址屬性類型屬性(FAR和 NEAR(缺省))。
? NEAR類型為段內(nèi)調(diào)用,即主子程序在同一個代碼段內(nèi),NEAR 可省略。
? FAR類型為段間調(diào)用,被另外代碼段調(diào)用的過程要定義為FAR過程

  1. 子程序的調(diào)用與返回
    ①段內(nèi)直接調(diào)用(重點)
    格式:CALL 子程序名
    功能:
    a.(返回地址:跟在CALL后的下一條指令/斷點的EA) → ↓(SP)
    b.目的地址(子程序名)EA→IP
    ② 返回指令RET
    格式:RET/RET n
    功能:a. 段內(nèi)返回 ↑(SP)→IP
    b. 段間返回 ↑(SP)→IP,↑(SP)→CS
    為了能正確返回主程序,在執(zhí)行子程序過程中,不管是否使用過堆棧,必須保證進入子程序時的棧頂與執(zhí)行RET時的棧頂一樣,否則不能正確返回
    注意:
    ? CALL和RET不影響標志位;
    ? 是段內(nèi)返回還是段間返回要看子程序定義偽指令PROC后面的類;
    ? 對于RET n 表示返回時,清除堆棧中棧頂的n/2個無用參數(shù)(n為偶數(shù)), 在前述動作之后再作(SP)+n → SP,當使用堆棧傳遞子程序參數(shù)的時候經(jīng)常使用。
    ? 返回地址也稱為斷點,是CALL指令下一條指令的第一個字節(jié)地址 (段內(nèi)調(diào)用僅保存IP,段間調(diào)用保存CS和IP)。
  2. 編寫子程序時的注意事項
    (1) 子程序的結(jié)構(gòu)
    ?子程序通常由子程序說明部分與代碼部分所組成。
    ?說明部分由下列幾部分所組成:子程序名稱,子程序功能,入口 參數(shù),出口參數(shù),使用的寄存器和存儲單元,調(diào)用的其它子程序,
    ?代碼部分:保護現(xiàn)場;根據(jù)入口參數(shù),獲取要處理的數(shù)據(jù);進行 數(shù)據(jù)處理;根據(jù)出口參數(shù),將處理后的數(shù)據(jù)送至指定的區(qū)域;恢復 現(xiàn)場;返回主程序。
    (2)主程序與子程序的參數(shù)傳遞的方法
    主程序為子程序提供入口參數(shù)
    子程序根據(jù)入口參數(shù)進行一系列處理 程序返回結(jié)果給主程序
    三種傳遞參數(shù)的方式:
    a.寄存器法:適合于參數(shù)較少的情況,傳遞速度較快。
    b.存儲器法:適合于參數(shù)較多的情況,事先需要在存儲器 中建立一個參數(shù)表。
    c.堆棧法:適合于參數(shù)較多的情況,尤其是在子程序嵌套 與遞歸調(diào)用的情況。
    (3)用堆棧傳遞參數(shù):轉(zhuǎn)向子程序前,將子程序所用參數(shù)壓入堆棧,進入子程序,由子程序從堆棧中取出所用的參數(shù)。
    (4)子程序的嵌套和遞歸調(diào)用
    子程序的嵌套:在一個子程序中又調(diào)用其他的子程序。(只要堆棧允許,嵌套的層次就可以不加限制)
    子程序的遞歸調(diào)用:指在子程序嵌套調(diào)用時,調(diào)用的子程序就是它本身。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容