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

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

star 入門 start 設計 color 基址 family https 兩個

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

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起到恢復寄存器原值的作用。

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