当前位置 : 主页 > 编程语言 > 其它开发 >

汇编语言实验2—汇编程序设计入门

来源:互联网 收集:自由互联 发布时间:2022-05-30
------------恢复内容开始------------ DB\DW\DD 说明: db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1; dw定义字类型变量,一个字数据占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

 

 

上一篇:并发编程进阶
下一篇:没有了
网友评论