匯編語言程序基本結構


  小編最近學習匯編語言,特此記錄一下。(8086CPU)

  注意事項:

  * 首先記錄一下,al為8位寄存器。當我們命令當中調用 AL時,CPU會默認為8位寄存器,他和AX是相互獨立的兩個寄存器。即產生的僅為不會存到AH里面去。

  * 設定段寄存器的偽指令。匯編時,系統自動將代碼段的段地址送到CS,到那時如果定義了數據段,附加段,堆棧段,就需要用指令將DS,SS,ES初始化。小編             就是因為最初沒有初始化,造成了結果錯誤的現象。

DATA SEGMENT 'DATA'
    X DB 93H
ENDS
CODE SEGMENT 'CODE'
    START:
    MOV AX,00C5H
    MOV BL,X
    ADD AL,BL
    ENDS
     END START

  上述結果AX中的內容位0058H。最后產生的高位會進入標志位,不會到AH里面。

順序結構

  順序結構是最常見的,最基本的數據結構。就是順次執行的。

  下面為編寫計算 S = A * B - C,的程序,ABC都為無符號字節變量,S為字類型的變量。

DATA SEGMENT 'DATA'
    A DB 38
    B DB 54
    C DB 16
    S DW ?
    DATA ENDS

CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA
    START:MOV AX,DATA
    MOV AL,A
    MOV BL,B
    MUL BL
    MOV BL,C
    MOV BH,0
    SUB AX,BX
    MOV S,AX
    MOV AH,4CH
    INT 21H
    CODE ENDS
END START

  我們在編寫一個S = 86H * 34H - 21H的程序,式中的三個均為無符號數。

  涉及到三個數的運算,並且題中沒有給定相應的變量,所以只需一個定義字節類型的變量來標識存放三個數的地址。

DATA SEGMENT 'DATA'
    NUM DB 86H,34H,21H
    RESULT DW 0
DATA ENDS
CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA
    START:
    MOV AX,DATA
    MOV DS,AX
    LEA SI,NUM
    LEA DI,RESULT
    MOV AL,[SI]
    MOV BL,[SI+1]
    MUL BL
    MOV BL,[SI+2]
    MOV BH,0
    SUB AX,BX
    MOV [DI],AX
    MOV AH,4CH
    INT 21H
CODE ENDS
END START

  內存自TABLE開始的連續16個內存單元存放着0~15的平方值,查看表中任意數X的平方值,並將結果放在RESULT中。

DESG SEGMENT
    TABLE DB 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225
    DATA DB 3
    RESULT DB 0
 DESG ENDS
SSEG SEGMENT STACK 'STACK'
    DB 100 DUP(0)
SSEG ENDS
CSEG SEGMENT
    ASSUME CS:SSEG,DS:DESG
    BEGIN: MOV AX,DESG
    MOV DS,AX
    MOV AX,SSEG 
    MOV SS,AX
    LEA BX,TABLE
    MOV AH,0
    MOV AL,DATA
    ADD BX,AX
    MOV AL,[BX]
    MOV RESULT,AL
    MOV AH,4CH
    INT 21H
CSEG ENDS
END BEGIN

在匯編中XLAT指令的作用就是在bx保存array的首地址,AL保存array的位置的基礎上,執行XLAT指令,將返回值送入AL指令中.

  指令如下指令后AL=5

   lea    bx,array

    mov    al,1

    xlat        ;返回值AL=array[AL]
我們運用XLAT指令在處理上面的問題就簡單多了:

DATA SEGMENT 'DATA'
TABLE DB 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225
    RESULT DB 0
    X DB 11 
DATA ENDS
STACK SEGMENT 'STACK'
    DW 100H DUP(0)
    STACK ENDS
CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA,SS:STACK
    START:MOV AX,DATA
    MOV DS,AX
   LEA BX,TABLE
   MOV AL,X
   XLAT
   MOV CL,AL
    MOV AH,4CH
    INT 21H
CODE ENDS
END START

  分支程序:

根據不同的條件進行不同的跳轉。像if-then結構。

  下面展示:在提示信息“please input character:”,后面輸入字符,若輸入ESC,則結束運行;若輸入的是小寫字母則顯示;若大寫字母則轉換為小寫顯示。

DATA SEGMENT 'DATA'
    MESSAGE DB 'Please input character:' ,0DH,0AH,'$'
DATA ENDS
STACK SEGMENT 'STACK'
    DW 100H DUP(0)
    STACK ENDS
CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA,SS:STACK
    START:MOV AX,DATA
    MOV DS,AX
    AGAIN:MOV DX,OFFSET MESSAGE
    MOV AH,9
    INT 21H
    MOV AH,1
    INT 21H
    CMP AL,1BH ;IS ESC. JUMP TO EXIT
    JZ EXIT
    CMP AL,5BH
    JC LOW0
    CMP AL,7BH
    JC LOW1
    JMP AGAIN
  LOW0: 
    CMP AL,40H
    JC AGAIN 
    ADD AL,20H
  LOW1:
    CMP AL,60H
    JC AGAIN
    MOV AH,2
    MOV DL,AL
    INT 21H
    MOV DL,0AH
    INT 21H
    JMP AGAIN
  EXIT:MOV AH,4CH
    INT 21H
CODE ENDS
END START

  循環結構:

當程序中碰到多次重復執行的程序時i,就可以利用循環結構來實現。

  在數據段BUFF中開始存放的100個字節類型的無符號整數,編寫程序找出其中最大的數並存放到MAX單元中。

DATA SEGMENT 'DATA'
    BUFF DB 100 DUP(0)
    MAX DB 0
DATA ENDS

CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
      MOV DS,AX
      MOV CX,99
      LEA SI,BUFF
      MOV AL,[SI]
      INC SI
CON:  CMP AL,[SI]
      JNC NEXT
      MOV AL,[SI]
NEXT: INC SI
      LOOP CON
      MOV MAX,AL
      MOV AH,4CH
      INT 21H
CODE ENDS
END START

  過程設計:

  子過程(過程)是程序的一部分,完成特定功能的程序段。使用的時候要注意一下三點:

  1 參數的傳遞。需要有傳入參數和傳出參數。參數的傳遞可以通過寄存器,變量,地址表,堆棧

  2 相應寄存器的內容保護。

  3 子程序還可以調用別的子程序,稱為子程序的嵌套。

類似與高級語言的函數。但是也有不同的地方,高級語言中的參數都是形參,是臨時分配內存單元的,調用之后就會注銷,將返回值輸出。而匯編中相當於參數的直接調用,因此需要注意參數的保護,可以將保護的參數進行壓棧操作。

  proc是子程序定義偽指令, far是該子程序的屬性,決定調用程序和子程序是否在同一代碼段
如下:為子程序定義及說明,

子程序名 PROC NEAR ( 或 FAR )
xxxxxx具體代碼
ret
子程序名 ENDP

  調用平方和實現20個數的平方和:

DATA SEGMENT 'DATA'
    CON EQU 20
    SUM DW 0
DATA ENDS
CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
       MOV DS,AX
       MOV CX,CON
       CALL GO
       MOV SUM,DX
       MOV AX,4C00H
       INT 21H

GO    PROC NEAR
    MOV DX,0
    MOV BL,1
    MOV AL,BL
CC: MUL BL
    ADD DX,AX
    INC BL
    MOV AL,BL
    LOOP CC
    RET
GO  ENDP
CODE ENDS
END START

 


免責聲明!

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



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