恢復內容開始 DB\DW\DD說明: db定義位元組類型變數,一個位元組數據占1個位元組單元,讀完一個,偏移量加1; dw定義字類型變數,一個字數據占2個位元組單元,讀完一個,偏移量加2; dd一個雙字數據占4個位元組單元,讀完一個,偏移量加4。 彙編偽指令ORG n作用是定義程式或數據塊的起始地址,指示此語 ...
------------恢復內容開始------------
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