1. 程式人生 > >8086彙編入門級知識(待補)

8086彙編入門級知識(待補)

試前一天用匯編寫了一個半成品黑白棋,導致本渣只有半小時的複習時間,總結一下用到的知識吧:

1.標誌位暫存器(P47)

8086CPU內部有14個16位暫存器。分為3類:

1)通用暫存器:分為資料暫存器(AX,BX,CX,DX)、地址指標暫存器(SP,BP)、變址暫存器(SI,DI)。其中資料暫存器常用,以AX為例,AH為高8位,AL為低八位,可分開使用,其它資料暫存器同理。

2)段暫存器:CS,SS,DS,ES

3)控制暫存器:IP,FLAGS。CPU取指令時總是以CS為段基址,IP為段內偏移地址,取一個指令後,ip自動加1,使用者程式不能直接訪問ip。

FALGS:常用ZF(對應的是jz,jmp等j族指令的使用)

2.暫存器的定址方式(P103)

暫存器的定址方式對應到程式碼上我感覺就是mov指令使用的問題。

1)立即定址:形如MOV AX,1111H

2)直接定址:形如MOV AX,[1111H],其中[1111H]代表以CS(預設是這樣,可以段超越)為基址,1111H為偏移地址的運算元。

3)暫存器定址:形如MOV SI,AX

4)暫存器間接定址:形如MOV AX,[SI],即通過SI這個第三者存放偏移地址。

5)暫存器相對定址:形如MOV AX,DATA[BX]

6)基址-變址定址:形如MOV AX,[BX][SI]

7)基址-變址-相對定址:形如MOV AX,DATA[BX][SI]

3.word ptr和byte ptr

即poniter,什麼時候用,什麼時候不用:https://blog.csdn.net/dongfengkuayue/article/details/23829611

以我前天的經驗,在cmp及mov指令中是要用的:

mov byte ptr[si+27],2

cmp byte ptr[bx],1

會發現,兩個都是帶[]的,還是能發現什麼的,但CPU發現不了,它蠢。

4.字串定義(P158)

使用db進行定義,比如hello world!:str db 'Hello World!',0dh,0ah,'$',其中'$'是必須要加的,相當於結束符,不然會錯。0dh表示回車(意為回到當前檔案首位置),0ah表示換行(意為到下一行)。

補充:db定義位元組型別佔8位,dw定義字型別佔16位。

5.子程式設計

call指令,可以實現子程式設計,實現巢狀的功能(相當於函數了,超方便),下面是將AL暫存器的內容按十進位制輸出到螢幕上的程式碼:

 1 dseg segment
 2     base db 10
 3 dseg ends
 4 cseg segment
 5     assume  cs:cseg,ds:dseg,es:dseg
 6 start:  
 7     mov ax,dseg
 8     mov ds,ax
 9     ;呼叫print_dec
10     call print_dec
11     ;結束
12 print_dec proc
13     push ax
14     mov ah,0
15     div base
16     mov bl,ah
17     
18     mov ah,2
19     mov dl,al
20     add dl,48
21     int 21h
22     
23     mov ah,2
24     mov dl,bl
25     add dl,48
26     int 21h
27     
28     pop ax
29     ret
30 print_dec endp
31 cseg ends
32     end start
View Code

 

其中ret返回地址,push和pop起到恢復暫存器原值的作用。