組合語言實驗2—彙編程式設計入門
------------恢復內容開始------------
DB\DW\DD說明:
db定義位元組型別變數,一個位元組資料佔1個位元組單元,讀完一個,偏移量加1;
dw定義字型別變數,一個字資料佔2個位元組單元,讀完一個,偏移量加2;
dd一個雙字資料佔4個位元組單元,讀完一個,偏移量加4。
彙編偽指令ORG n作用是定義程式或資料塊的起始地址,指示此語句後面的程式或資料塊以n為起始地址連續存放在程式儲存器中。
(1) 對於下面的資料定義,各條MOV指令單獨執行後,有關暫存器的內容是什麼?
表1 運算子使用說明
運算子 |
使用說明 |
SEG |
返回變數/標號的段值 |
OFFSET |
取變數/標號的偏移地址 |
TYPE |
返回變數型別:位元組=1,字=2,雙字=4; 取標號型別:NEAR= -1,FAR= -2 |
LENGTH |
返回變數的元素個數 返回外層DUP數值,其他為1 |
SIZE |
返回變數的位元組數 SIZE=TYPE*LENGTH |
FLDB DB ?
TABLEA DW 20 DUP(?)
TABLEB DB ‘ABCD’
1) MOV AX, TYPE FLDB
2) MOV AX, TYPE TABLEA
3) MOV CX, LENGTH TABLEA
4) MOV DX, SIZE TABLEA
5) MOV CX, LENGTH TABLEB
結果
|
彙編指令 |
除錯所得暫存器值 |
(1) |
MOV AX,TYPE FLDB |
(AX) = 0001H |
(2) |
MOV AX, TYPE TABLEA |
(AX) = 0002H |
(3) |
MOV CX, LENGTH TABLEA |
(CX) = 0014H |
(4) |
MOV DX, SIZE TABLEA |
(DX) = 0028H |
(5) |
MOV CX, LENGTH TABLEB |
(CX) = 0001H |
實驗原始檔,程式碼如下
1 ;定義資料段(放變數)------------------ 2 DATA SEGMENT ;定義CNT=80H;CNT DB 10000000B3 MSG DB 'This is an example.$' 4 ;1. 5 FLDB DB ? 6 TABLEA DW 20 DUP(?) 7 TABLEB DB 'ABCD' 8 9 10 DATA ENDS 11 12 ;程式碼段------------------ 13 CODE SEGMENT 14 ASSUME CS:CODE,DS:DATA 15 16 17 ;程式碼段首條指令偏移地址0100H 18 ORG 0100H 19 20 START:MOV AX,DATA ;資料段段地址送AX(不能刪) 21 MOV DS,AX ;資料段段地址存入資料段暫存器DS(不能刪) 22 23 ;從下面開始編輯自己的程式碼(Start) 24 ;1. 25 MOV AX,TYPE FLDB 26 MOV AX,TYPE TABLEA 27 MOV CX,LENGTH TABLEA 28 MOV DX,SIZE TABLEA 29 MOV CX,LENGTH TABLEB 30 CODE ENDS 31 END START
我的理解是第一個T獲得資料段的地址,依次執行T指令完成各個MOV指令
ARY DB
0,0,3,4 是定義一個叫ary的char型的陣列變數,它有4個成員,{0,0,3,4}
用C語言理解的話,就是 char ary[4] = {0,0,3,4};
CNT:操作次數
LEN EQU $-ARRAY
$代表當前地址
$ - ARRAY 代表當前地址與Label之間的距離, 單位byte
整體意思就是將這個差距儲存到LEN中
(2) 先自己手工計算,再借助程式除錯驗證,這裡EQU是等值命令。
已知:
ORG 100H
ARY DW 3, 4, 5, 6
CNT EQU $-ARY
DB 7, 8, CNT, 9
則執行指令“MOV AX, ARY+2”和“MOV BX, ARY+10”後,AX=?, BX=?。
與你手工計算結果一致否?
結果
(AX) =0004H |
(BX) =0908H |
實驗原始檔,程式碼如下
1 ;定義資料段(放變數)------------------
2 DATA SEGMENT ;定義CNT=80H;CNT DB 10000000B
3 MSG DB 'This is an example.$'
4 ;2.
5 ORG 100H
6 ARY DW 3, 4, 5, 6
7 CNT EQU $-ARY
8 DB 7, 8, CNT, 9
9
10 DATA ENDS
11
12 ;程式碼段------------------
13 CODE SEGMENT
14 ASSUME CS:CODE,DS:DATA
15
16
17 ;程式碼段首條指令偏移地址0100H
18 ORG 0100H
19
20 START:MOV AX,DATA ;資料段段地址送AX(不能刪)
21 MOV DS,AX ;資料段段地址存入資料段暫存器DS(不能刪)
22
23 ;從下面開始編輯自己的程式碼(Start)
24 ;2.
25 MOV AX, ARY+2
26 MOV BX, ARY+10
27 END START
思路圖解
ENTRY ; 指定應用程式的入口點
(3) 先手工計算,再借助程式除錯驗證。
根據下面的指令和偽指令序列:
TAB DW 1, 2, 3, 4, 5, 6
ENTRY EQU 6
MOV BX, OFFSET TAB
ADD BX, ENTRY
MOV AX, [BX]
結果
記錄1:(AX) = 0004H
實驗原始檔,程式碼如下
1 ;定義資料段(放變數)------------------ 2 DATA SEGMENT ;定義CNT=80H;CNT DB 10000000B 3 MSG DB 'This is an example.$' 4 ;2. 5 ORG 100H 6 TAB DW 1, 2, 3, 4, 5, 6 7 ENTRY EQU 6 8 9 10 DATA ENDS 11 12 ;程式碼段------------------ 13 CODE SEGMENT 14 ASSUME CS:CODE,DS:DATA 15 16 17 ;程式碼段首條指令偏移地址0100H 18 ORG 0100H 19 20 START:MOV AX,DATA ;資料段段地址送AX(不能刪) 21 MOV DS,AX ;資料段段地址存入資料段暫存器DS(不能刪) 22 23 ;從下面開始編輯自己的程式碼(Start) 24 ;3. 25 MOV BX, OFFSET TAB 26 ADD BX, ENTRY 27 MOV AX, [BX]
28 END START
思路圖解
(4) 閱讀以下示例程式並答題:
請嘗試修改以上程式,實現如下所述功能:
1) 在‘Welcome to Masm!’前新增自己的“姓名全拼+學號”顯示,如:SunZhiHai209050111 Welcome to Masm!;
2) 顯示共4行,前3行與示例程式效果相同,第4行要求效果:紅字高亮藍底閃爍。
實驗原始檔,程式碼如下
1 ;定義堆疊段------------------ 2 STACK SEGMENT STACK 3 DB 200 DUP(0) 4 STACK ENDS 5 ;程式碼段------------------ 6 ASSUME CS:CODE, DS:DATA 7 CODE SEGMENT 8 ;定義資料段(放變數)------------------ 9 DATA SEGMENT 10 DB 'SunJie219350128 Welcome to Masm!' 11 DATA ENDS 12 13 START: MOV AX, DATA ;資料段段地址送AX(不能刪) 14 MOV DS, AX ;資料段段地址存入資料段暫存器DS(不能刪) 15 16 ;從下面開始編輯自己的程式碼(Start) 17 18 MOV AX, 0B872H 19 MOV ES, AX 20 21 MOV SI, 0 22 MOV DI, 0 23 MOV CX, 31 ;字元數 24 A: 25 MOV AL, DS:[SI] 26 MOV ES:[DI], AL 27 MOV ES:[DI+160], AL ;一行有160位元組 28 MOV ES:[DI+320], AL 29 MOV ES:[DI+480], AL 30 31 MOV AL, 2H ;設定前景和背景顏色 綠字黑底 00000010 32 MOV ES:[DI+1], AL 33 MOV AL, 24H ;設定前景和背景顏色 紅字綠底 00100100 34 MOV ES:[DI+161], AL 35 MOV AL, 71H ;設定前景和背景顏色 藍字白底 01110001 36 MOV ES:[DI+321], AL 37 MOV AL, 9CH ;設定前景和背景顏色 紅字高亮藍底閃爍 10011100 38 MOV ES:[DI+481], AL 39 40 INC DI 41 INC DI 42 INC SI 43 44 LOOP A 45 46 ;顯示字串 47 MOV AH, 4CH 48 INT 21H 49 CODE ENDS 50 END START