ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-04-09 12:31:51  阅读:302  来源: 互联网

标签:入门 汇编语言 AL DB MOV 汇编程序 AX DATA DS


------------恢复内容开始------------

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

 

 

标签:入门,汇编语言,AL,DB,MOV,汇编程序,AX,DATA,DS
来源: https://www.cnblogs.com/jayson2814/p/16121511.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有