1. 程式人生 > 其它 >組合語言實驗2—彙編程式設計入門

組合語言實驗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 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