匯編語言實驗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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM