实验 六 汇编程序语法和数据定义伪指令
姓名: 付玉伟 学号: 10538057 日期: 10.31 成绩:
实验目标:
1. 定义一数据段,依次定义以下数据: (1)STR 为字符串INTERNET (2)A为十六进制字节数据30H (3)B为十进制字节数据10
(4)C为二进制字节数01010101B
(5)D为包含10个字的数据,初值为2009(要求使用DUP重复因子)
要求:编程实现该题目。在所建文件中,包含一个数据段和一个代码段,代码段中可填入最基本的对数据段的初始化设置及退出系统的指令即可,数据段中将题目要求变量进行定义。并在汇编完成后,通过【查看】/【变量】命令,查看相应变量的初值情况。
2. (参考P140)对下面数据定义,指令“MOV AX,COUNT1”,“MOV AX,COUNT2”,“MOV AX,[COUNT2]”执行后有何异同? COUNT1 EQU 16H COUNT2 DW 16H
要求:编程实现该题目,并注意在代码段定义中,一定要有对数据段的初始化设置。
3.阅读下面程序,分析该程序所实现的功能,并对程序中的所有语句给出注释,说明各语句在程序中的作用。 DATA SEGMENT ;初始化时:记住DATA的段地址、记住SUM的内存单元、到堆栈里看看 SUM DW 0 DATA ENDS STACK SEGMENT DB 20 DUP(33H) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA ;看看AX里是否为DATA段地址 MOV DS,AX MOV CX,50 MOV AX,0 MOV BX,2 NEXT1: ADD AX,BX
CODE INC BX INC BX
LOOP NEXT1
MOV SUM,AX ;到SUM里看看是否有结果 MOV BX,SUM MOV AH,4CH INT 21H ENDS
END START
实验源程序: 1. DATA SEGMENT
STR DB 'INTERNET' A DB 30H B DB 10
C DB 01010101B D DW 10 DUP(2009) DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START: MOV AX,DATA
MOV DS,AX
MOV AH,4CH INT 21H
CODE ENDS
END START
2.DATA SEGMENT
COUNT1 EQU 16H COUNT2 DW 16H DATA ENDS
STACK SEGMENT STACK STACK ENDS CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX
MOV AX,COUNT1
MOV AX,COUNT2 MOV AX,[COUNT2] MOV AH,4CH INT 21H CODE ENDS
END START
3. DATA
栈里看看 SUM DATA STACK
STACK CODE
START:
NEXT1:
CODE
SEGMENT ;初始化时:记住DATA的段地址、记住SUM的内存单元、到堆
DW 0 ENDS
SEGMENT
DB 20 DUP(33H) ENDS
SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
MOV AX,DATA ;看看AX里是否为DATA段地址 MOV DS,AX MOV CX,50 MOV AX,0 MOV BX,2 ADD AX,BX INC BX INC BX
LOOP NEXT1
MOV SUM,AX ;到SUM里看看是否有结果 MOV BX,SUM MOV AH,4CH INT 21H ENDS
END START
实验步骤及结果分析:
1.
2. 说明定义的COUNT1是用EQU伪指令
三条指令分别执行后,结果相同
解析:MOV AX,COUNT1 的作用是将COUNT1所代表的立即数送给寄存器
中AX;
MOV AX,COUNT2的作用是将变量COUNT2存放在内存中得值送给寄存器AX;
MOV AX,[COUNT2]的作用是将变量COUNT2存放在内存单元中字数据送给寄
存器AX
3. DATA SEGMENT ;初始化时:记住DATA的段地址、记住SUM的内存单
元、
;到堆栈里看看
SUM DW 0 ;由符号(变量名)SUM指定的内存单元类型定义为一个字,
;初值为0
DATA ENDS ;定义数据段结束 STACK SEGMENT ;定义堆栈段
DB 20 DUP(33H) ;定义堆栈段为20个字节的连续存储区,且每个字节的值为33H STACK ENDS ;定义堆栈段结束 CODE SEGMENT ;定义代码段
ASSUME DS:DATA,SS:STACK,CS:CODE ;由ASSUME伪指令定义各段
;寄存器的内容
START: MOV AX,DATA ;看看AX里是否为DATA段地址
;由DS初始化为数据段首地址的16位段值DATA
MOV DS,AX ;将AX中的值作为数据段的首地址 MOV CX,50 ;CX置入循环次数 MOV AX,0 ;将AX累加器清0 MOV BX,2 ;BX置常量1
NEXT1: ADD AX,BX ;累加偶数和,计50次
INC BX ;求下一个偶数,BX加1 INC BX ;BX加1
LOOP NEXT1 ;循环且计数器CX减1
MOV SUM,AX ;累加和送入SUM单元,到SUM里看看是否有结果 MOV BX,SUM ;将累加和送入BX
MOV AH,4CH ;DOS功能调用语句,机器将结束本程序的运行, INT 21H ;并返回DOS状态 CODE ENDS ;代码段结束
END START ;整个程序汇编结束
解析:改程序实现的是求从2开始连续50个偶数的和,然后将结果存放在
定义为SUM的字存储单元中,再将结果送入寄存器BX中。
重要命令集锦:MOV,LOOP, INT,INC,ADD
实验小结:通过这次实验,我学会了自我编程的相关定义,以及注
意的细节,并对跳转指令loop的作用以及使用有了进一步的了解,并且可以对已编的程序语句进行一定的注释分析,为以后的进一步学