微機原理與接口技術筆記(二)


上一篇筆記:https://www.cnblogs.com/Tony100K/p/11653755.html

轉移類指令

  • JMP Label 段內直接轉移

  • MOV BX,1200H JMP BX執行完之后 IP=1200H了

  • MOV BX,1200

  • JMP WORD PTR[BX]段內間接轉移,1200和1201這兩個單元送給了IP

  • 段間轉移也是32位 JMP FAR Label

  • 間接轉移 JMP DWORD PTR[BX] DWORD指32位

  • 低地址送IP,高地址送CS

  • 條件轉移范圍只有 -128到127

  • 統計內存數據段中以TABLE為首地址的100個8位帶符號數中的正數\負數和零的個數

  • START: XOR AL,AL
    	   MOV PLUS,AL
    	   MOV MINUS,AL
    	   MOV ZERO,AL
    	   LEA SI,TABLE
    	   MOV CX,100
    CHECK: LODSB
    	   OR AL,AL
    	   JS X1
    	   JS X2
    	   INC PLUS
    	   JMP NEXT
    X1:    INC MINUS
    	   JMP NEXT
    X2:    INC ZERO
    NEXT:  DEC CX
    	   JNZ CHECK
    	   HLT
    

循環控制指令

  • 范圍也非常小 是-128-127的

  • 循環次數CX

  • 無條件循環LOOP 只要CX不等於0

  • LOOPZ CX不等於0,ZF等於1繼續循環

  • LOOPNZ CX不等於0,ZF等於0繼續

  • 在以DATA為首地址的內存數據段中,存放有200個16位有符號數,找出其中最大和最小的符號數,並分別放在MAX和MIN為首的內存單元中

  • START: LEA SI,DATA
    	   MOV CX,200
    	   CLD
    	   LODSW
    	   MOV MAX,AX
    	   MOV MIN,AX
    	   DEC CX
    NEXT:  LODSW
    	   CMP AX,MAX
    	   JG LARGE
    	   CMP AX,MIN
    	   JL SMALL
    	   JMP GOON
    LARGE: MOV MAX,AX
           JMP GOON
    SMALL: MOV MIN,AX
    GOON:  LOOP NEXT
    	   HLT
    

過程調用指令

  • 段內調用
  • CALL TIMER
  • CALL WORD PTR[SI]
  • SI后的兩位送給IP
  • 段間調用
  • CALL FAR TIMER
  • CALL DWORD PTR[SI]
  • RET 返回指令,子程序的最后一條指令必須是RET

中斷控制指令

  • 是一個遠過程調用,需要記錄FLAGS
  • INT n之后n*4就是存放中斷服務子程序入口地址的單元偏移地址
  • *

執行過程

  • FLAGS壓棧
  • INT 指令的下一條指令的CS\IP壓棧
  • n*4得到存放中斷向量的地址
  • 將中斷向量送給CS IP
  • 轉入中斷服務程序

處理器控制指令

標志位操作

  • CLC 清零標志位

  • STC 置1標志位

  • CMC 取反C

  • CLD

  • STD

  • CLI 關中斷

  • STI IF置1 開中斷

匯編語言源程序

過程

  • 輸入匯編語言源程序 .ASM
  • 匯編 .OBJ
  • 鏈接 .EXE
  • 調試 最終環境

語句類型

  • 指令性語句 CPU執行的語句
  • 指示性語句 不執行 告訴匯編程序定義了多大內存等作用

格式

  • [標號:][前綴]助記符[操作數],[操作數][;注釋]

  • 偽指令助記符 操作數[,操作數,...][;注釋]

常量

  • 數字常量
  • 字符串常量 'ABCD' 匯編時被譯成對應的ASC碼

變量 內存單元的符號地址

  • 段值 變量所在的段地址
  • 偏移量 變量所指單元的偏移地址
  • 類型

表達式

  • 算術 邏輯 關系運算

  • 取值運算符

    • OFFSET 獲得變量或者標號的偏移地址

    • SEG 獲得變量或者標號的段地址

    • MOV AX,SEG 去變量的段地址送給DS
      MOV DS,AX
      MOV BX,OFFSET DATA 取變量的偏移地址送給BX
      
    • 屬性運算符

    • MOV BYTR PTR[BX],12H 字節12H
      MOV WORD PTR[BX],12H 字0012H
      

偽指令

作用

  • 定義變量
  • 分配存儲器
  • 定義邏輯段
  • 指示程序開始和結束
  • 定義過程

數據定義偽指令

指令助記符 大小
DB 1字節
DW 1字
DD 2字
DQ 4字
DT 10字

\[\begin{array}{l}{\text { DATAI DB } 11 \mathrm{H} \text { , 22 H, 33H, 44H }} \\ {\text { DATA2 DW } 11 \mathrm{H}, 22 \mathrm{H}, 3344 \mathrm{H}} \\ {\text { DATA3 DD } 11 \mathrm{H}^{*} 2,22 \mathrm{H}, 33445566 \mathrm{H}}\end{array} \]

第二行的11H就相當於0011H
第三行的22H就是00000011H

注意高位對應高地址

DATA1 DB 'ABCD',66H 注意'ABCD'是四個變量

重復操作符

為一個區域各單元設置相同的初值
M1 DB 10 DUP(0)
定以一個以M1為首地址的10個字節單元,並且每個字節單元的初值都是0

MEM1 DB 34H,'A',?(問號表示一個隨機數,占1個字節單元)
DW 20 DUP(?) 40個單元的隨機值

\[\begin{array}{l}{\text { M1 DB 'How are you?" }} \\ {\begin{array}{ll}{\text { M2 DW 3 DUP(11H), 3344H }} \\ {\text { DB } 4 \text { DUP ( 2 ) }} \\ {\text { ( M3 DB 3 DUP (22H, 11H, ?) }}\end{array}}\end{array} \]

符號定義偽指令

  • EQU 用一個符號代替表達式
  • 符號名 EQU 表達式
  • EQU不會占用內存空間

段定義偽指令

  • 說明邏輯段的起始和結束

  • 說明不同程序模塊中同類邏輯段之間的練習形態

  • SEGMENT [定位類型][組合類型][類別]

    ENDS

  • DATA SEGMENT
    	MEM1 DB 11H,22H
    	MEM2 DB 'HELLO'
    	MEM3 DW 2 DUP (?)
    DATA ENDS
    
  • 段名也表示邏輯段的段地址

  • 變量在邏輯段中的位置就代表了它的偏移地址

設定段寄存器偽指令

  • ASSUME 段寄存器名:段名

結束偽指令

  • END [標號]

  • 只有代碼段不需要初始化

過程定義偽指令

過程名 PROC [NEAR/FAR] (段內/段外)

​ RET 負責返回斷點

過程名 ENDP

  • 過程名是過程體的入口地址

  • DELAY PROC
    	PUSH BX
    	PUSH CX
    	MOV BL,2
    NEXT:MOV CX,4167
    W10M:LOOP W10M
    	 DEC BL
    	 JNZ NEXT//一共循環了2*4167次
    	 POP CX
    	 POP BX
    	 RET
    DELLAY ENDP
    
  • CALL DELAY 調用延時子程序

宏定義偽指令

  • 與過程不同,不能成為一段可以獨立執行的代碼,只能和源程序一起用

  • 宏命令名 MACRO <形式參數>

    ENDM

  • DADD MACRO X,Y,Z
    	 MOV AX,X
    	 MOV AX,Y
    	 MOV Z,AX
    	 ENDM
    
  • DADD DATA1,DATA2,SUM 來進行調用

  • 形參和實參的位置必須一一對應

調整偏移量偽指令

ORG 表達式(要求計算結果為非負常數)

DATA SEGMENT
	ORG 1200H
	BUFF DB 1,2
DATA ENDS

這樣,BUFF的偏移地址就變成了1200H

系統功能調用

  • BIOS 駐留在ROM的基本輸入輸出系統

DOS(磁盤操作系統)功能調用的基本步驟

  • 將調用參數裝入指定的寄存器
  • 將功能號裝入AH
  • 按中斷類型號調用DOS中斷
  • 檢查返回參數是否正確

MOV AH,功能號
<置相應參數>

INT 21H

單字符輸入

MOV AH,01
INT 21H
可以敲一下鍵,鍵在AL中
GET KEY:MOV AH,1
		INT 21H
		CMP AL,'Y'
		JZ YES
		CMP AL,'N'
		JZ NO
		JMP GET KEY

字符串輸入

  • AH<-- 功能號10

  • DS:DX<---字符串在內存中的存放地址

  • DAT1 DB,20,?,20,DUP(?)//在數據段中定義
    
    
    LEA DX,DAT1
    MOV AH,0AH
    INT 21H
    

單字符輸出

  • MOV AH,2
    MOV DL,41H
    INT 21H
    

字符串輸出

  • AH=09H
  • 被顯示的字符串必須以'$'為結束

返回操作系統功能

  • 功能號 4CH
  • 常用於程序結尾處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM