------------恢復內容開始------------
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 10000000B 3 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