2011 11 01 彙編 王爽 第09章

2021-06-01 09:27:56 字數 2474 閱讀 7666

(2011.11.01)彙編_王爽_第09章_學習小結

本章內容:

1. 轉移指令——同時修改cs和ip的指令的統稱。

2. 段內轉移——只修改ip

——短轉移——ip修改範圍為 -128至127.

——近轉移——ip修改範圍為 -32768 至 32767

3. 段間轉移——同時修改cs和ip

4. offset功能是取得標號的偏移位址。

5. jmp無條件轉移指令,可以只修改ip,也可以同時修改cs和ip

6. jmp short 標號[ip]  jmp near 標號[ip]  jmp far 標號[cs:ip] jmp 16位的reg[ip]

7. jmp word ptr 記憶體單元位址(段內轉移)  jmp dword ptr 記憶體單元位址(段間轉移)

8. jcxz 標號(如果(cx) = 0, 轉移到標號處執行。)

; 程式名稱:實驗9_根據材料程式設計_在螢幕中間顯示不同顏色的字串.asm

; 程式功能:在螢幕中間分別顯示綠色、綠底紅色、白底藍色的字串'welcome to masm'

; 程式材料:

; 在記憶體中,有乙個 80 * 25 彩色字元模式顯示緩衝區,b8000h - bffffh 共 32kb 的空間。

; 顯示器可以顯示25行,每行80個字元,每個字元可有256種屬性(背景色,前景色,閃爍,高亮等組合資訊)

; 一行共有80個字元,佔160個位元組。

; 乙個字元在記憶體中佔兩個位元組,(偶位址)低位存放字元的ascii碼,(奇位址)高位存放字元的屬性。

; 例:

; 在b8000h至b8f9fh為第一屏(25行,9+f=25-1),其中,偏移位址 000 - 09f 對應顯示器上的第一行,(9f = 10 * 16 - 1)

; 屬位元組的格式:

; 7 6 5 4 3 2 1 0

; bl r g b i r g b

; 當它們的位數為1的時候會被啟用:bl(7):閃爍,(654)背景,i(3)高亮,(210)前景色,r(4,2)紅色,g(5,1)綠色,b(6,0)綠色.

; 注意:

; 閃爍的效果必須在全屏dos方式下才能看到。

; 程式分析:

; 簡單地說,編寫該程式的方法就是將字元放到b8000h - bffffh的空間就可以了。

; 那麼,這裡可以使用mov 指令,還有loop指令。

assume cs:code, ds:data

; 開始定義資料段,也就是題目要求的字元

data segment

db 'welcome to masm!'

data ends

; 開始定義**段,並且設定程式執行的入口

code segment

start:

mov ax, data ; 找到字串的起點

mov ds, ax

mov al, 8 ; 設定段位址

mov ah, 12

mov es, ax

mov bx, 31 ; 設定字元偏移位址的起點,列

add bx, 384 ; 行

mov si, 0 ; 一行有80個字元,要顯示的有15個字元

mov di, 0 ; 要將字元放到中間,先設定中點為40,然後向兩間展開

; 也就是說,左邊是40 - 7 = 33, 33 - 1 = 31

; 減1原因,由零開始

mov cx, 15 ; 迴圈十五次

; 先將 'welcome to masm!' 這十五個字元放入到螢幕中間

putcharin:

mov al, ds:[si] ; 放入字元

mov es:[bx+di], al

inc di

; 開始設定字型顏色,但由於每個字串的顏色不同,所以這裡需要設定幾個迴圈跳點

cmp si, 7

jae near ptr c7 ; >=7時,跳到c7

c0:

mov al, 01000000b ; 綠色

jmp near ptr endloop

c7:cmp si, 11

jae near ptr c11

mov al, 00100100b ; 綠底紅色

jmp near ptr endloop

c11:

mov al, 01110001b ; 白底藍色

endloop:

mov es:[bx + di], al

inc si

inc di

loop putcharin

mov ax, 4c00h

int 21h

code ends

end start

王爽彙編5 6

bx 表示乙個記憶體單元,它的偏移位址在bx中。只有bx可以這樣寫,ax,cx,dx不可以。在masm中,mov al,0 會解釋為mov al,0,為了要表達從記憶體中讀取資料,則要寫成mov al,ds 0 cpu執行loop指令的時候,要進行兩步操作 1.cx cx 1 2.判斷cx中的值,不...

王爽彙編7 8

1.在8086cpu中,只有4個暫存器可以用在 中來進行記憶體單元的定址 bx,si,di,bp。2.在 中,這4個暫存器可以單個出現,或只能以4種組合出現 bx和si,bx和di,bp和si,bp和di。3.只要在 中使用暫存器bp,而指令中沒有顯性地給出段位址,段位址就預設在ss中。在沒有暫存器...

王爽彙編9 10

轉移指令 可以修改ip,或同時修改cs和ip的指令統稱為轉移指令。8086cpu的轉移行為有以下幾類 1.只修改ip時,稱為段內轉移,比如 jmp ax。2.同時修改cs和ip時,稱為段間轉移,比如 jmp 1000 0.由於轉移指令對ip的修改範圍不同,段內轉移又分為 短轉移和近轉移。短轉移ip的...