小編最近學習匯編語言,特此記錄一下。(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