实验6 汇编程序语法和数据定义伪指令
新版汇编语言程序设计变量定义及常用伪指令

新版汇编语言程序设计变量定义及常用伪指令汇编语言是计算机底层的编程语言,具有高效、灵活的特点。
在进行汇编语言程序设计时,变量定义和常用伪指令是不可或缺的重要部分。
本文将详细介绍新版汇编语言程序设计中的变量定义和常用伪指令,并提供相应的示例和应用。
一、变量定义在汇编语言中,变量定义是用来存储数据的标识符和内存分配的过程。
变量可以是不同的数据类型,如整型、字符型、字符串型等。
变量定义的格式如下所示:变量名数据类型初始值其中,变量名是标识符,用来表示变量的名称;数据类型是变量的类型,包括BYTE、WORD、DWORD等;初始值是可选项,用来给变量赋初值。
下面是一个变量定义的示例:count DWORD 10这个例子定义了一个名为count的DWORD类型变量,初始值为10。
二、常用伪指令1. EQUEQU是汇编语言中常用的伪指令,用于给标识符赋值。
其格式如下:标识符 EQU 表达式其中,标识符是需要赋值的标识符,表达式是赋给标识符的值。
下面是一个EQU指令的示例:MAX_SIZE EQU 100这个例子给标识符MAX_SIZE赋值为100。
2. DB、DW、DDDB、DW和DD是用来定义字节、字和双字变量的伪指令。
它们分别代表Byte(字节)、Word(字)和Double Word(双字)。
其格式如下:标识符 DB/ DW/ DD 初始值下面是一个DB指令的示例:message DB "Hello, World!"这个例子定义了一个名为message的字节型变量,并给它赋值为"Hello, World!"。
3. RESB、RESW、RESDRESB、RESW和RESD是用来声明未初始化的字节、字和双字变量的伪指令。
其格式如下:标识符 RESB/ RESW/ RESD 数量其中,标识符是需要声明的变量名,数量是变量的个数。
下面是一个RESW指令的示例:numbers RESW 5这个例子声明了一个名为numbers的字型数组,包含5个元素。
汇编语言伪指令

汇编语言伪指令汇编语言作为一种低级编程语言,广泛应用于嵌入式系统、驱动程序开发和操作系统内核等领域。
在进行汇编语言编程时,我们常常会使用到一些伪指令。
本文将介绍一些常见的汇编语言伪指令及其用法。
1. 数据定义伪指令数据定义伪指令用于声明并初始化数据。
在汇编语言中,我们可以使用以下伪指令来定义不同类型的数据:1.1 DB(Define Byte):用于定义一个字节的数据。
例如:DB 10 ;定义一个字节的数据,值为101.2 DW(Define Word):用于定义一个字的数据。
例如:DW 100 ;定义一个字的数据,值为1001.3 DD(Define Doubleword):用于定义一个双字的数据。
例如:DD 1000 ;定义一个双字的数据,值为10001.4 DQ(Define Quadword):用于定义一个四字的数据。
例如:DQ 10000 ;定义一个四字的数据,值为100001.5 DT(Define Ten Bytes):用于定义一个十个字节的数据。
例如:DT 1234567890 ;定义一个十个字节的数据,值为12345678902. 代码段和数据段伪指令在汇编语言中,我们通常需要将代码和数据分开存放,以便于管理和执行。
以下是一些常用的代码段和数据段伪指令:2.1 CODE SEGMENT:用于定义代码段。
例如:CODE SEGMENT;代码段内容CODE ENDS2.2 DATA SEGMENT:用于定义数据段。
例如:DATA SEGMENT;数据段内容DATA ENDS2.3 STACK SEGMENT:用于定义堆栈段。
例如:STACK SEGMENT;堆栈段内容STACK ENDS3. 控制指令伪指令控制指令伪指令用于控制程序的执行流程。
以下是一些常见的控制指令伪指令:3.1 IF-ELSE-ENDIF:用于条件判断。
例如:IF 条件;条件为真时执行的代码ELSE;条件为假时执行的代码ENDIF3.2 REPEAT-UNTIL:用于循环执行一段代码直至满足条件。
汇编语言指令及伪指令练习的实验报告总结(范文)

汇编语言指令及伪指令练习的实验报告总结汇编语言指令及伪指令练习的实验报告总结篇一:汇编语言实验报告福建农林大学金山学院课程名称:姓名:系:专业:年级:学号:指导教师:职称: (程序设计类课程) 实验报告汇编语言 201X~201X学年第二学期实验项目列表福建农林大学金山学院实验报告系:专业:年级:姓名:学号:实验课程:汇编语言实验室号:_ _1#605 实验设备号: I3 实验时间:201X.4.25指导教师签字:成绩:实验一汇编程序的汇编及运行1.实验目的和要求 (1)熟悉汇编程序的汇编、连接、执行过程;(2)生成LST文件,查看L ST文件;(3)生成BJ文件,修改语法错误;(4)生成EXE文件;(5)执行程序。
2.实验环境 IBM—PC机及其兼容机;实验的软件环境是:操作系统: DS2.0以上;调试程序: DEBUG.CM;文本编程程序: EDIT.EXE、PS.EXE;宏汇编程序:MA SM.EXE(或AS M .EXE);连接装配程序:L INK .EXE;交叉引用程序:CREF.EXE(可有可无)。
3.实验内容及实验数据记录(1)将数据段输入,取名 1.txt,保存在MASM文件夹下。
生成LST文件,(不必连接、运行)用EDI T查看1.LS T文件。
试回答: DA1,DA2的偏移量分别是多少?C UNT的值为多少?DATA SEGME NT RG 20HNUM1=8 NUM2=NUM1+10H DA1 DB ‘I BM PC’ CUN T EQU $-DA1 DATA END S DA2 DB 0AH, 0DH EN D(2)输入有错误的文件,修改错误语句。
(MASM没有出现错误即可。
不必连接、运行。
)D ATA SEGMEN T VAR1 DB0, 25, DH,300 VAR2DB 12H, A4H, 6BH VAR3 DB ’ABCD EF’ VAR4 D 1H, 5678H VAR5 D 10H DUP(?) D ATA ENDS C DE SEGMENT ASSUME CS: CDE, DE: DATA MV D S, AX LEASI, VAR5 M V BX, FFSE T VAR2 MV[SI], 0ABH MV AX, VA R1+2 MV [B X], [SI] M V VAR5+4,VAR4 MV AH, 4CH INT21H ENDS E ND START B EING MV AX, DATA CDE(3)输入正确的程序,汇编、连接、运行 STACKS SEGMENT S TACK D 128DUP(?) EN DS SEGMENT ENDS SEGM ENT ASSUME CS: CDES,DS: DATAS STACKS DA TAS DATASCDES STRIN G DB ‘ELCM E!’, 13, 10, ‘$’ STA RT: MV AX, DATAS MV DS, AX LEA DX, S TRING MV A H, 9 INT 21H MV AH,4CH INT 21H CDES END S END STAR T4.算法描述及实验步骤 1)首先,用记事本输入各段程序,并储存成源程序,保存在MASM目录下。
伪指令和汇编语言

从指定单元开始,定义若干个字(双字节数)。
例如:
ORG 8000H
HETAB:
DW 7234H,8AH,10
汇编后则:
(8000H)=72H (8001H)=34H (8002H)=00H (8003H)=8AH (8004H)=00H (8005H)=0AH
03 常用旳伪指令
DS:定义空间命令
“DS <体现式>定义空间命令 格式: 标号: DS 数据或字符体现式 从指定单元开始,由数据或体现式 拟定保存若干个字节内存空间备用。 例如: ORG 8000H DS 08H DB 30H,8AH 即8000H~8007H单元保存备用 (8008H)=30H (8009H)=8AH
DATA和EQU旳区别在于DATA定义旳字符名称
作为标号登记在符号表中,故可先使用后定义;
而用EQU定义旳字符名称必须先定义后使用,其
原因是EQU不定义在符号表中。
03 常用旳伪指令
BIT:位地址符号命令
“
BIT<体现式>位地址符号命令
格式:
字符名称:
BIT 位地址
该命令把地址赋予标号段要求旳字符名称。
地址,位地址或立即数。
例如:
ORG 8000H
AA: EQU R6
;AA与R6等值
MOV A,AA
;A(R6)
…
03 常用旳伪指令
DATA:数据地址赋值命令
“ DATA<体现式>数据地址赋值命令 格式:
字符名称:
DATA 数据或体现式
此命令把数据地址或代码地址赋予标号段要求旳字符名称。
例如:INDEXJ DATA 8389H
定义了INDEXJ这个字符名称旳地址为8389H,主要用于
《汇编语言》学习笔记6——伪指令

《汇编语⾔》学习笔记6——伪指令1.伪指令⼜称伪操作,即不能像汇编指令⼀样⽣成可执⾏的⼆进制机器代码,⽽是在汇编程序对汇编语⾔源程序进⾏汇编(编译)期间,由汇编程序执⾏。
它与C中的说明性语⾔的含义类似,起到说明作⽤,⽤来指出程序分段、数据定义、存储分配、程序开始和结束等信息,这些信息在汇编(编译)完成后就不⽤了。
但程序中没伪指令,则系统就⽆法完成编译。
2.段定义伪指令:⽤来定义各种类型的段 1.格式:段名 SEGMENT [类型参数] ...... 段名 ENDS 1.其中SEGMENT和ENDS必须成对出现,表⽰段的开始和结束。
⼀般的,段名和段的意义⼀致,便于识别。
2.段名实际就是段地址,在汇编过程中,系统给出具体的地址值,⼀个段必须有⼀个名字来标识。
3.参数是可选项(可有可⽆),⽤于指出段的边界、段的组合、类别标识,⼀般⽤于多模块程序设计中。
2.类型参数 1.定位类型 PARA 该段的起始地址必须为⼩段的⾸地址,即起始地址的16进制数最低位为0 BYTE 该段可以从任意地址开始 WORD 该段必须从字边界开始,即起始地址为偶数 DWORD 该段必须从双字边界开始,即起始地址的16进制数为最低应为4的倍数 PAGE 该段必须从页边界开始,即起始地址的16进制数最低两位为00(能被256整除) 若不指定定位类型,系统默认为PARA 2.组合类型 PRIVATE 该段为私有段,连接时不与其他同名段合并 PUBLIC 连接时可与其他模块中的同名段按顺序连接成⼀个段 COMMON 表⽰该段与其他模块中的同名段有相同的起始地址,如果连接将产⽣覆盖,连接后段的长度为同名段中的最长者 STACK 表⽰该段为堆栈段 AT 表达式 该段直接定位在表达式指出的位置上 若不指定组合类型,默认为PRIVATE 3.类型标识:在引号中给出段的类型名。
在连接时,类别标识相同的段放在连续的存储区中。
(如:"STACK"⽤啦标识该段为堆栈段) 4.END:结束标记,若碰到伪指令END则停⽌编译3.ASSUME伪指令:⽤于指明段寄存器与段的对应关系 1.格式:ASSUME 段寄存器:段名,[段寄存器:段名,段寄存器:.....]【[]中标识可选项】 2.除了代码段寄存器CS不能⽤MOV指令赋值外,其他段寄存器都可⽤MOV指令进⾏初始化。
汇编指令、伪指令大全

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器.MOV DST , SRC // Byte / Word执行操作: dst = src1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器).2.立即数不能直接送段寄存器3.不允许在两个存储单元直接传送数据4.不允许在两个段寄存器间直接传送信息PUSH入栈指令及POP出栈指令: 堆栈操作是以"后进先出"的方式进行数据操作.PUSH SRC //Word入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.入栈时高位字节先入栈,低位字节后入栈.POP DST //Word出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.执行POP SS指令后,堆栈区在存储区的位置要改变.执行POP SP 指令后,栈顶的位置要改变.XCHG(eXCHanG)交换指令: 将两操作数值交换.XCHG OPR1, OPR2 //Byte/Word执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp1.必须有一个操作数是在寄存器中2.不能与段寄存器交换数据3.存储器与存储器之间不能交换数据.XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码.XLAT (OPR 可选) //Byte执行操作: AL=(BX+AL)指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.LEA(Load Effective Address) 有效地址传送寄存器指令LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中.执行操作: REG = EAsrc注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器MOV BX , OFFSET OPER_ONE 等价于 LEA BX , OPER_ONEMOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中LDS(Load DS with pointer)指针送寄存器和DS指令LDS REG , SRC //常指定SI寄存器。
8086汇编语言伪指令

一、伪指令详解伪指令在百度百科中的定义为:伪指令(Pseudo Instruction)是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有机器代码,只用于汇编过程中为汇编程序提供汇编信息。
例如,提供如下信息:哪些是指令、哪些是数据及数据的字长、程序的起始地址和结束地址等。
伪指令有2个特点:1.由于是伪“指令”,因而它只存在于汇编语言中。
高级语言中不叫指令,叫语句;2.由于是“伪”指令,也即“假”指令,因而不是可执行指令,不会产生机器代码,不会占用ROM空间,只用于汇编过程中为汇编程序提供汇编信息。
与指令的区别::1.指令是在执行阶段发挥作用的,由CPU(Intel、AMD等)来执行。
2.伪指令是在编译阶段发挥作用的,由汇编器(MASM、TASM等)来解释。
二、数据定义伪指令为源程序中的数据和堆栈区分配数据存储单时,使用最多的伪指令。
数据定义伪指令格式如下:常用的数据定义伪指令类型有:∙DB(定义字节,常用)一个字节数据占1个字节单元,读完一个,偏移量加1∙DW(定义字,常用)一个字数据占2个字节单元,读完一个,偏移量加2∙DD(定义双字)一个双字数据占4个字节单元,读完一个,偏移量加4∙DQ(定义四字)一个四字数据占8个字节单元,读完一个,偏移量加8∙DT(定义十字节,用于BCD码)数据定义伪指令后面的初值表可以是常数、表达式、字符串。
例如:D2DW110*230;为D2分配1个字,存放表达式的值D3DB‘GOOD!’;为D3分配5字节,用来存放字符串‘GOOD!’D4DD2.4E+3;为D4分配2个字,存放一个浮点数D5DB‘AB’;为D5分配2字节,字符A在低字节,B在高字节D6DW‘AB’;为D6分配1个字,字符A在高字节,B在低字节S1DB5DUP(?);为S1预留5字节的存储空间S2DW3DUP(0);为S2分配3个字,初值设为0语句1相当于C语言中的DW D2=110*230,只不过是语法结构不太一样注意:通过变量名操作时,变量名代表存储区的第一个数据的地址。
完整版汇编语言中常用的伪指令档

完整版汇编语言中常用的伪指令档汇编语言是一种低级的程序设计语言,它用于编写底层计算机程序。
在汇编语言中,伪指令是一类特殊的指令,它们在程序运行时不会被计算机执行,而是在编译或汇编时被处理器或汇编器解释和展开。
伪指令在汇编语言中起到辅助编程、优化代码和声明常量等作用。
本文将介绍完整版汇编语言中常用的伪指令档。
一、伪指令的定义和作用伪指令是汇编语言中的一类特殊指令,它们不是真正的指令,不会被计算机执行,而是在编译或汇编的过程中被汇编器或处理器解释和处理。
伪指令主要用于辅助编程、优化代码和声明常量等作用。
伪指令的格式一般与真正的指令相似,但一般不包含操作码。
在一些汇编语言中,伪指令以特殊的标记或符号来区分,比如以“.”开头的指令。
二、常用的伪指令档1. ORG指令ORG指令用于指定程序的起始地址。
在汇编程序中,使用ORG指令可以将程序的代码段或数据段放置在指定的内存地址处。
其格式一般为:ORG 地址其中,地址为16进制数或表示内存单元的符号。
2. EQU指令EQU指令用于定义符号常量或符号变量。
它将一个符号与一个数值或地址进行关联,使得在程序中使用该符号时可以被汇编器或处理器替换为对应的数值或地址。
其格式一般为:符号 EQU 数值或地址其中,符号为一个标识符,数值或地址可以是16进制数、10进制数或表示内存单元的符号。
3. DB指令DB指令用于定义字节型数据。
它可以用于声明字符、整数等字节型数据,并将这些数据存储在指定的内存地址中。
其格式一般为:标号 DB 表达式其中,表达式可以是一个字节常量、字符常量或表示内存单元的符号。
4. DW指令DW指令用于定义字型数据。
它可以用于声明无符号整数等字型数据,并将这些数据存储在指定的内存地址中。
其格式一般为:标号 DW 表达式其中,表达式可以是一个字常量或表示内存单元的符号。
5. DD指令DD指令用于定义双字型数据。
它可以用于声明无符号双字整数等双字型数据,并将这些数据存储在指定的内存地址中。
实验6汇编程序语法和数据定义伪指令

实验6汇编程序语法和数据定义伪指令实验六汇编程序语法和数据定义伪指令姓名:付⽟伟学号: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 16HCOUNT2 DW 16H要求:编程实现该题⽬,并注意在代码段定义中,⼀定要有对数据段的初始化设置。
3.阅读下⾯程序,分析该程序所实现的功能,并对程序中的所有语句给出注释,说明各语句在程序中的作⽤。
DA TA SEGMENT ;初始化时:记住DA TA的段地址、记住SUM的内存单元、到堆栈⾥看看SUM DW 0DA TA ENDSSTACK SEGMENTDB 20 DUP(33H)STACK ENDSCODE SEGMENTASSUME DS:DA TA,SS:STACK,CS:CODESTART: MOV AX,DA TA ;看看AX⾥是否为DATA段地址MOV DS,AXMOV CX,50MOV AX,0MOV BX,2NEXT1: ADD AX,BXINC BXINC BXLOOP NEXT1MOV SUM,AX ;到SUM⾥看看是否有结果MOV BX,SUMMOV AH,4CHINT 21HCODE ENDSEND START实验源程序:1.DATA SEGMENTSTR DB 'INTERNET'A DB 30HB DB 10C DB 01010101BD DW 10 DUP(2009)DATA ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATAMOV DS,AXMOV AH,4CHINT 21HCODE ENDSEND START2.DATA SEGMENTCOUNT1 EQU 16HCOUNT2 DW 16HDATA ENDSSTACK SEGMENT STACKSTACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATAMOV DS,AXMOV AX,COUNT1MOV AX,COUNT2MOV AX,[COUNT2]MOV AH,4CHINT 21HCODE ENDSEND START3. DA TA SEGMENT ;初始化时:记住DA TA的段地址、记住SUM的内存单元、到堆栈⾥看看SUM DW 0DA TA ENDSSTACK SEGMENTDB 20 DUP(33H)STACK ENDSCODE SEGMENTASSUME DS:DA TA,SS:STACK,CS:CODESTART: MOV AX,DA TA ;看看AX⾥是否为DATA段地址MOV DS,AXMOV CX,50MOV AX,0MOV BX,2NEXT1: ADD AX,BXINC BXINC BXLOOP NEXT1MOV SUM,AX ;到SUM⾥看看是否有结果MOV BX,SUMMOV AH,4CHINT 21HCODE ENDSEND START实验步骤及结果分析:1.2.说明定义的COUNT1是⽤EQU伪指令三条指令分别执⾏后,结果相同解析:MOV AX,COUNT1 的作⽤是将COUNT1所代表的⽴即数送给寄存器中AX;MOV AX,COUNT2的作⽤是将变量COUNT2存放在内存中得值送给寄存器AX;MOV AX,[COUNT2]的作⽤是将变量COUNT2存放在内存单元中字数据送给寄存器AX3.DATA SEGMENT ;初始化时:记住DATA的段地址、记住SUM的内存单元、;到堆栈⾥看看SUM DW 0 ;由符号(变量名)SUM指定的内存单元类型定义为⼀个字,;初值为0DATA 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累加器清0MOV BX,2 ;BX置常量1NEXT1: ADD AX,BX;累加偶数和,计50次INC BX;求下⼀个偶数,BX加1INC BX ;BX加1LOOP NEXT1 ;循环且计数器CX减1MOV SUM,AX;累加和送⼊SUM单元,到SUM⾥看看是否有结果MOV BX,SUM;将累加和送⼊BXMOV AH,4CH;DOS功能调⽤语句,机器将结束本程序的运⾏,INT 21H ;并返回DOS状态CODE ENDS;代码段结束END START ;整个程序汇编结束解析:改程序实现的是求从2开始连续50个偶数的和,然后将结果存放在定义为SUM的字存储单元中,再将结果送⼊寄存器BX中。
汇编语言实验报告_6

青岛理工大学课程实验报告
课程名称汇编语言程序设计班级实验日期
2013.11.3
姓名学号实验成绩
实验
名称
子程序
实验目的及要求1.掌握子程序设计相关指令和伪指令的使用方法
2.掌握子程序设计方法, 特别是参数传递方法
3.掌握主程序和子程序之间的调用关系和调用方法
4.熟悉循环和子程序结合应用解答问题的思路
实验环境1.命令行方式
2.MASM.EXE LINK.EXE DEBUG.EXE
实验内容1.设DATA1开始的内存单元中, 存放着一串带符号字数据, 要求采用冒泡排序算法(Bubble Sort)按照从小到大的顺序排序并将排好序的数据存在DATA1开始的单元。
然后在显示器输出排好序的数据, 中间用’,’隔开。
2.输出数据使用子程序方式。
算法描述及实验步骤步骤:
(1)设置数据段地址
(2)设置堆栈段地址
(3)设置堆栈指针
(4)调用9号功能, 输出一个提示性字符串。
(5)循环进入子程序, 输出原始数据。
(6)在子程序内循环输出每一位的十进制数字。
(7)主程序进行内外循环, 进行冒泡排序。
(8)再一次调用子程序输出排序后的结果。
调试过程及实验结果调试过程:
(2)(1)在输出时, 调用DOS 9号功能, 并不是只要语句MOV AH,09H
(3)它是存在入口条件的, 入口条件:DS:DX=输出字符缓冲区首地址。
所以前面必须加上MOV DX,OFFSET NOTE1。
(4)汇编语言是不会再输出汉字的。
(5)子程序结束时一定要有RET
(6)冒泡排序也遇到一些困难。
调试结果:。
汇编语言程序格式、伪指令

第4章 汇编语言程序设计
主要内容:
汇编语言源程序的结构 汇编语言语句格式 伪指令 功能调用 汇编语言程序设计
1
微机与接口技术
4.1 汇编语言源程序
1.机器语言(Machine Language)
用二进制表示指令和数据。 优点:执行速度快,占有内存少。 缺点:不直观,不易编写、阅读和理解,面向硬件,不 能移植。
MASM
汇编程序
PRODR.OBJ 文件
Link
连接程序
PRODR.EXE 文件
汇编语言程序的建立及汇编过程
4
微机与接口技术
上机过程: 1.调用编辑程序(例如:记事本)建立源文件。 以×××.asm命名文件。 2.用汇编程序masm(或asm)对源文件汇编产生目标文件 ×××.obj。 如果汇编出错则需重新调用编辑程序修改错误,直至汇编 通过为止。
2.汇编语言(Assembly Language)
用助记符书写指令,地址和数据也可用符号表示。 优点:编写、阅读和修改较方便,不易出错,执行速度与机 器语言相近。 缺点:面向硬件,不能移植。
2
微机与接口技术 汇编:把汇编语言源程序翻译成机器语言目标程序的过程。 汇编程序:完成汇编工作的系统软件。 •小汇编(ASM):需要64K内存支持 •宏汇编(MASM):需要96K以上的内存支持,功能更强。 汇编程序的主要功能: 1)检测源程序。 2)测出源程序中的语法错误,并给出出错信息。 3)产生源程序的目标程序,并给出列表文件。 4)展开宏指令。
24
微机与接口技术
(2) 逻辑运算符 AND、OR、XOR、NOT:只用于数值表达式 注:逻辑运算符和逻辑指令的区别:前者在汇编时 进行,后者在程序执行时由CPU执行 例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指令与 AND AX, 3F00H等价。
汇编语言的伪指令语句

┇
TABLE1
01H
02H
03H
04H
TABLE2
05H
06H
LENGTH1
04H
LENGTH2
02H
┇
说明: 数据定义语句定义了变量的数据类型,汇编程序可以利用这种隐含的 类型属性来确定某些指令是字指令、还是字节指令。 例如:
OPER1 DB ?,? OPER2 DW ?,?
┇ MOV OPER1 + 1,0 ;字节指令 MOV OPER2 + 2,0 ;字指令
① 操作数是一个数值常量
例如:
X DB 25H
;定义一个名为 X、初值为25H的字节变量
Y DW 4142H
;定义一个名为 Y、初值为4142H的字变量
Z DD 12345678H ;定义一个名为 Z、初值为12345678H的双字变量
┇
X
25H
Y
42H
41H
Z
78H
56H
34H
12H
┇
汇编时,汇编程序将完成以下工作:
MOV OPER1 + 1,AL ;字节指令 MOV OPER2 + 1,AX ;字指令
(3)分析运算符(SEG、OFFSET、TYPE、SIZE、LENGTH)
分析运算符作用于变量或标号,运算结果为变量或标号的属性值, 其使用格式为:
运算符 变量/标号
① SEG和OFFSET运算符
SEG和OFFSET运算分别返回变量或标号的段地址和偏移地址。
例如:
ALPHA EQU 7
;给数值7 赋以符号名ALPHA
BETA EQU ALPHA-2
;给7-2=5赋以符号名BETA
汇编程序结构及伪指令

END start
D:\masm>DEBUG hello.exe -U :查看代码段 129F:0000 FC CLD 129F:0001 B89D12 MOV AX , 129D 129F:0004 8ED8 MOV DS , AX 129F:0006 8D360000 LEA SI , [0000] 129F:000A B89E12 MOV AX , 129E 129F:000D 8EC0 MOV ES , AX 129F:000F BF0000 MOV DI , 0000 129F:0012 B90600 MOV CX , 0006 129F:0015 F3 REPZ 129F:0016 A4 MOVSB 129F:0017 B44C MOV AH , 4C 129F:0019 CD21 INT 21 、、、 -D 129d:0 l10 ;查看数据段1的内容 129D:0000 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.......... -D 129e:0 l10 ;查看数据段2的内容 129E:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 8
汇编编程_伪指令

10、 INCLUDE <file specification> a> 文件名必须有引号包围(?) b> 包含文件查找顺序:先找当前工作目录,后找GENPATH环境变量指定的位 置。 c> 例: INCLUDE “..\LIBRARY\macros.inc”
汇编管理指令-伪指令汇总
11、
LIST …… NOLIST a> 影响紧随其后的语句是否出现在list和 debug文件中; b> 最终是否有效,还依赖环境变量-L: Generate a listing file
MLIST [ON/OFF] 决定macro是否被展开出现在list和debug文件中
Directive
12、
13、
ORG <expression> 其中expression不能包含任何未定义、以后会定义以及外部references
汇编管理指令-伪指令汇总
14、 MEXIT XDEF entry storage: EQU $00FF save: MACRO LDX LDA STA LDA STA IFC ENDC LDA STA
Directive
;重新定义一个段 1 1 1 * ;offset是如何辅助访问struct的
DataSec: SECTION 000000 Struct: DS.B SIZE CodeSec: SECTION entry: 000003 CE xxxx LDX #Struct 000006 8600 LDA #0 000008 6A00 STA ID, X 00000A 6201 INC COUNT, X 00000C 42 INCA 00000D 6A03 STA VALUE, X
汇编语言伪指令

汇编语言伪指令在编写汇编语言程序时,会用到另一类指令,这类指令仅供汇编程序将源程序翻译成目标程序时使用,本身并不形成机器码,这类指令称为伪指令。
由此可知,指令有二类:(1)汇编指令:是编译后产生气器码的指令。
(2)伪指令:仅供汇编程序使用,编译后不产生气器码的指令。
下面简洁介绍5条伪指令。
1. 汇编起点指令ORG(Origin)指令格式:ORG nn作用:将ORG nn 后的程序机器码或数据存放以nn为首地址的存储单元中。
如在下面的例4-1中,伪指令ORG 2000H 将目标程序从地址2000H处开头存放。
2. 定义字节指令DB (Define Byte)指令格式:[LABEL] DB N1,N2,…,Nm作用:将DB后的8位字节数据N1,N2,…,Nm依次存入以标号LABEL为首地址的存储单元中。
若无标号,则N1,N2,…Nm依次存放在DB上一条指令之后的存储单元中。
如在例4-1中伪指令DB 将字节数据55,38依次存放到以标号LABEL3为首地址的存储单元2100H~2101H中。
3. 定义字指令DW (Define Word)指令格式:[LABEL] DW NN1,NN2,…,NNm作用:将DW后的16位字数据NN1,NN2,…,NNm依次存放到以标号LABEL为首地址的存储单元中,若无标号,则NN1,NN2,…,NNm依次存放在DW上一条指令之后的存储单元中。
在例4-1中,伪指令DW 同样可将字数据5538存放到以标号LABEL3为地址的存储单元2100H~2101H中。
4. 等值指令EQU (Equate)指令格式:LABEL EQU nn作用:将16位地址nn赋给标号LABEL,在例4-1中,伪指令LABEL0 EQU 2100H将地址2100H赋给标号LABEL0。
5. 结束汇编指令END作用:汇编程序编译源程序时,遇到伪指令END,不管END下面是否还有其它指令都将停止编译。
例1 将地址为2100H存储单元中内容55与地址为2101H存储单元内容38进行十进制数相加,运算结果93存放在地址为2102H的存储单元中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六汇编程序语法和数据定义伪指令
姓名:付玉伟学号: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.阅读下面程序,分析该程序所实现的功能,并对程序中的所有语句给出注释,说明各语句
在程序中的作用。
DA TA SEGMENT ;初始化时:记住DA TA的段地址、记住SUM
的内存单元、到堆栈里看看
SUM DW 0
DA TA ENDS
STACK SEGMENT
DB 20 DUP(33H)
STACK ENDS
CODE SEGMENT
ASSUME DS:DA TA,SS:STACK,CS:CODE
START: MOV AX,DA TA ;看看AX里是否为DATA段地址
MOV DS,AX
MOV CX,50
MOV AX,0
MOV BX,2
NEXT1: ADD AX,BX
INC BX
INC BX
LOOP NEXT1
MOV SUM,AX ;到SUM里看看是否有结果
MOV BX,SUM
MOV AH,4CH
INT 21H
CODE ENDS
END START
实验源程序:
1.DATA SEGMENT
STR DB 'INTERNET'
A D
B 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. DA TA SEGMENT ;初始化时:记住DA TA的段地址、记住SUM的内存单元、到堆栈里看看
SUM DW 0
DA TA ENDS
STACK SEGMENT
DB 20 DUP(33H)
STACK ENDS
CODE SEGMENT
ASSUME DS:DA TA,SS:STACK,CS:CODE
START: MOV AX,DA TA ;看看AX里是否为DATA段地址
MOV DS,AX
MOV CX,50
MOV AX,0
MOV BX,2
NEXT1: ADD AX,BX
INC BX
INC BX
LOOP NEXT1
MOV SUM,AX ;到SUM里看看是否有结果
MOV BX,SUM
MOV AH,4CH
INT 21H
CODE 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的作用以及使用有了进一步的了解,
并且可以对已编的程序语句进行一定的注释分析,为以后的进一步学
习奠定了相应的基础,受益匪浅。