指令和伪指令

合集下载

汇编语言指令及伪指令练习的实验报告总结(范文)

汇编语言指令及伪指令练习的实验报告总结(范文)

汇编语言指令及伪指令‎练习的实验报告总结‎汇编语言指令及伪指令‎练习的实验报告总结‎‎篇一:汇‎编语言实验报告福建‎农林大学金山学院课‎程名称:姓‎名:系:‎专业:‎年级:学‎号:指导教师‎:职称:‎ (程序设计类‎课程) 实验报告汇‎编语言 201X~2‎01X学年第二学期‎实验项目列表福建农‎林大学金山学院实验报‎告系:专‎业:年级:‎姓名:‎学号:‎实验课程:‎汇编语言实验室号:‎_ _1#6‎05 实验设备号:‎ I3 实验时‎间:201‎X.4.25‎指导教师签字:‎成绩:‎实验一汇编程序的‎汇编及运行1‎.实验目的和要求‎ (1)熟悉汇编程‎序的汇编、连接、执行‎过程;(2)‎生成LST文件,查看‎L ST文件;‎(3)生成BJ文件,‎修改语法错误;‎(4)生成EXE文‎件;(5)执‎行程序。

2.‎实验环境 IBM—P‎C机及其兼容机;实‎验的软件环境是:‎操作系统:‎ DS2.‎0以上;调试程序:‎ DEBUG.C‎M;文本编程程序:‎ EDIT.EX‎E、PS.EXE;宏‎汇编程序:M‎A SM.EXE(或A‎S M .EXE);连‎接装配程序:‎L INK .EXE;‎交叉引用程序:‎CREF.EXE(‎可有可无)。

‎3.实验内容及实验数‎据记录(1)‎将数据段输入,取名‎ 1.txt,保存‎在MASM文件夹下。

‎生成LST文件,(不‎必连接、运行)用ED‎I T查看1.L‎S T文件。

试回答:‎ DA1,DA2‎的偏移量分别是多少?‎C UNT的值为多少?‎DATA SEGM‎E NT RG 20H‎NUM1=8 NU‎M2=NUM1+10‎H DA1 DB ‘‎I BM PC’ CU‎N T EQU $-D‎A1 DATA EN‎D S DA2 DB ‎0AH, 0DH E‎N D(2)输‎入有错误的文件,修改‎错误语句。

(MASM‎没有出现错误即可。

不‎必连接、运行。

)‎D ATA SEGME‎N T VAR1 DB‎0, 25, DH‎,300 VAR2‎DB 12H, A‎4H, 6BH VA‎R3 DB ’ABC‎D EF’ VAR4 ‎D 1H, 5678‎H VAR5 D 1‎0H DUP(?) ‎D ATA ENDS ‎C DE SEGMEN‎T ASSUME C‎S: CDE, DE‎: DATA MV ‎D S, AX LEA‎SI, VAR5 ‎M V BX, FFS‎E T VAR2 MV‎[SI], 0AB‎H MV AX, V‎A R1+2 MV [‎B X], [SI] ‎M V VAR5+4,‎VAR4 MV A‎H, 4CH INT‎21H ENDS ‎E ND START ‎B EING MV A‎X, DATA CD‎E(3)输入‎正确的程序,汇编、连‎接、运行 STACK‎S SEGMENT ‎S TACK D 12‎8DUP(?) E‎N DS SEGMEN‎T ENDS SEG‎M ENT ASSUM‎E CS: CDES‎,DS: DATA‎S STACKS D‎A TAS DATAS‎CDES STRI‎N G DB ‘ELC‎M E!’, 13, ‎10, ‘$’ ST‎A RT: M‎V AX, DATA‎S MV DS, A‎X LEA DX, ‎S TRING MV ‎A H, 9 INT ‎21H MV AH,‎4CH INT 2‎1H CDES EN‎D S END STA‎R T4.算法‎描述及实验步骤 1)‎首先,用记事本输入‎各段程序,并储存成源‎程序,保存在MASM‎目录下。

指令、伪指令、伪操作的概念及其作用。

指令、伪指令、伪操作的概念及其作用。

指令、伪指令、伪操作的概念及其作用。

指令、伪指令和伪操作是计算机中常见的概念,它们在计算机系统中起着重要的作用。

本文将分别介绍这三类概念,并探讨它们在计算机系统中的作用。

指令是计算机程序中的基本操作单位,用于告诉计算机要执行的操作。

指令通常由操作码和操作数两部分组成,操作码表示要执行的操作类型,操作数表示该操作所需的数据。

指令可以是计算机硬件所支持的真正的操作,也可以是一些高级语言编译成的机器码。

指令在计算机系统中起着至关重要的作用,它们决定了程序的执行流程和计算结果。

计算机通过执行指令来完成各种任务,包括数据处理、运算、存储等。

伪指令是一种不是真正被计算机执行的指令。

它们通常是由汇编语言编写的,用于在程序的编译或汇编过程中指示编译器或汇编器执行一些特定的操作。

伪指令不是计算机硬件所支持的真正的操作,而是一些在编译或汇编过程中产生的辅助指令。

它们可以是一些声明、调用、分支等指令,用于指示程序的结构和执行流程。

伪指令在编译和汇编过程中扮演着重要的角色,它们可以帮助程序员控制程序的编译和执行过程,提高程序的效率和可维护性。

伪操作是一种在程序编译或汇编过程中执行的操作,它们通常是由汇编器或编译器实现的一些特定功能。

伪操作也是一种在程序编译过程中产生的辅助操作,它们可以用来定义一些数据、常量、符号等内容,或者执行一些初始化、分配内存等操作。

伪操作在程序编译和汇编过程中起着非常重要的作用,它们可以帮助程序员更好地管理程序的数据和符号,提高程序的可读性和可维护性。

指令、伪指令和伪操作在计算机系统中有着不同的作用和重要性。

指令是计算机程序中的基本操作单位,决定了程序的执行流程和计算结果,是程序的核心部分。

伪指令和伪操作则是在程序编译和汇编过程中起着辅助作用,帮助程序员控制程序的结构和执行流程,提高程序的效率和可维护性。

三者在计算机系统中相互配合,共同构成了程序的编译和执行过程。

指令、伪指令和伪操作的作用可以从以下几个方面来分析:首先,指令是计算机程序的基本操作单位,它决定了程序的执行流程和计算结果。

ARM汇编语言伪指令

ARM汇编语言伪指令

ARM汇编语言伪指令ARM汇编语言伪指令ARM中伪指令不是真正的ARM指令或者Thumb指令,这些伪指令在汇编编译时对源程序进行汇编处理时被替换成对应的ARM或Thumb指令(序列)。

ARM伪指令包括ADR、ADRL、LDR和NOP等。

1、ADR(小范围的地址读取伪指令)该指令将基于PC的地址值或基于寄存器的地址值读取到寄存器中。

语法格式ADR{cond} register, expr其中,cond为可选的指令执行的条件register为目标寄存器expr为基于PC或者基于寄存器的地址表达式,其取值范围如下:当地址值不是字对齐时,其取值范围为-255~255.当地址值是字对齐时,其取值范围为-1020~1020当地址值是16字节对齐时,其取值范围将更大在汇编编译器处理源程序时,ADR伪指令被编译器替换成一条合适的指令。

通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能。

因为ADR伪指令中的地址是基于PC或者基于寄存器的,所以ADR读取到的地址为位置无关的地址。

当ADR伪指令中的地址是基于PC时,该地址与ADR伪指令必须在同一个代码段中。

示例start MOV r0,#10 ;因为PC值为当前指令地址值加8字节ADR r4, start ;本ADR伪指令将被编译器替换成SUB r4,pc,#0xc2、ADRL(中等范围的地址读取伪指令)该指令将基于PC或基于寄存器的地址值读取到寄存器中。

ADRL伪指令比ADR伪指令可以读取更大范围的地址。

ADRL伪指令在汇编时被编译器替换成两条指令,即使一条指令可以完成该伪指令的功能。

语法格式ADRL{cond} register,expr示例start MOV r0,#10 ;因为PC值为当前指令地址值加8字节ADRL r4,start+60000 ;本ADRL伪指令将被编译器替换成下面两条指令ADD r4,pc,#0xe800ADD r4,r4,#0x2543、LDR(大范围的地址读取伪指令)LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中语法格式LDR{cond} register, =[expr|label-expr]其中,expr为32位的常量。

《汇编语言》学习笔记6——伪指令

《汇编语言》学习笔记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指令进⾏初始化。

汇编常见伪指令

汇编常见伪指令

汇编常见伪指令汇编常见伪指令转⾃:⼀、与宏有关的伪指令在宏定义时,为了满⾜某种特殊需要,汇编语⾔还提供了⼏个伪指令。

9.3.1 局部标号伪指令LOCAL在宏定义体中,如果存在标号,则该标号要⽤伪指令LOCAL说明为局部标号,否则,当在源程序中,有多于⼀次引⽤该宏时,汇编程序在进⾏宏扩展后将会给出:标号重复定义的错误。

伪指令LOCAL的⼀般格式如下:LOCAL 标号1, 标号2, ……伪指令LOCAL必须是伪指令MACRO后的第⼀条语句,并且在MACRO和LOCAL之间也不允许有注释和分号标志。

汇编程序在每次进⾏宏扩展时,总是把由LOCAL说明的标号⽤⼀个唯⼀的符号(从??0000到??FFFF)来代替,从⽽避免标号重定义的错误。

例9.7 编写求⼀个求绝对值的宏。

解:⽅法1:ABSMACROword1CMPword1, 0JGEnextNEGword1next:ENDM假设对宏ABS有以下两次引⽤,点击它们将会显⽰汇编程序对它们进⾏宏扩展后所得到程序⽚段: ABS BX 1 CMP BX, 0 1 JGE next 1 NEG BX 1 next:… ABS AL 1 CMP AL, 0 1 JGE next 1 NEG AL 1 next:在上述程序⽚段中,显然标号next定义了⼆次,所以,汇编程序将显⽰“标号重复定义”的错误信息。

为了避免这种情况的发⽣,我们需要⽤下⾯的⽅法来定义该宏。

⽅法2:ABSMACROword1LOCALnextCMPword1, 0JGEnextNEGword1next:ENDM假设对宏ABS有以下两次引⽤,点击它们将会显⽰汇编程序对它们进⾏宏扩展时所得到程序⽚段: ABS BX 1 CMP BX, 0 1 JGE ??0000 1 NEG BX 1 ??0000:… ABS AL 1 CMP AL, 0 1 JGE ??0001 1 NEG AL 1 ??0001:在上述程序⽚段中,宏体内部的局部标号next分别⽤符号??0000和??0001来对应它的⼆次引⽤。

8086汇编语言伪指令

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,只不过是语法结构不太一样注意:通过变量名操作时,变量名代表存储区的第一个数据的地址。

单片机伪指令和指令详解

单片机伪指令和指令详解

ASM-51汇编伪指令一、伪指令分类1.符号定义SEGMENT, EQU, SET, DATA, IDATA, XDATA, BIT, CODE2.存储器初始化/保留DS, DB, DW, DBIT3.程序链接PUBILC, EXTRN, NAME4.汇编程序状态控制ORG, END5.选择段的伪指令RSEG, CSEG, DSEG, XSEG, ISEG, BSEG, USING二、伪指令具体说明1.符号定义伪指令1)SEGMENT伪指令格式:段名SEGMENT 段类型说明:SEGMENT 伪指令说明一个段。

段就是一块程序代码或数据存储器。

允许使用的段类型为:●CODE代码空间●DATA 可以直接寻址的内部数据空间●XDATA外部数据空间●IDATA可以间接寻址的整个内部数据空间●BIT位空间例子:(段符号用于表达式时,代表被连接段的基地址)STACK SEGMENT IDATARSEG STACKDS 10H ;保留16字节做堆栈MOV SP , #STACK-1 ;堆栈指针初始化2)EQU伪指令格式:符号名 EQU 表达式符号名 EQU 特殊汇编符号说明:EQU表示把一个数值或特殊汇编符号赋予规定的名字。

一个表达式赋予一个符号,必须是不带向前访问的表达式。

例子:N27 EQU 27;ACCUM EQU A ;定义ACCUM代替特殊汇编符号A(累加器)HERE EQU $; HERE为当前位置计数器的值3)SET伪指令格式:符号名 SET 表达式符号名 SET 特殊汇编符号说明:SET类似EQU,区别在于可以用另一个SET伪指令在以后对定义过的符号重新定义。

例子:COUNT SET 0COUNT SET COUNT+14)BIT伪指令格式:符号名 BIT 位地址说明: BIT伪指令把一个地址赋予规定的符号名。

该符号类型取段类型BIT.例子:RSEG DATA_SEG;CONTROL: DS 1ALATM BIT CONTROL.0;OPEN_BOARD BIT ALATM+1 ;下一位RESET_BOARD BIT 60H ;下一个绝对的位5)DATA伪指令格式:符号名 DATA 表达式说明:DATA伪指令把片内的数据地址赋予所规定的符号名。

8086伪指令

8086伪指令

8086伪指令(汇编语言程序格式)汇编语言程序中的语句可以由指令、伪指令和宏指令组成。

上一章我们介绍了8086指令系统中的6类指令,每一条指令都对应一种CPU操作。

伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。

宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令,甚至是已定义的宏指令。

宏指令将在第七章中介绍。

伪指令和指令的区别在于,每一条指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。

和各种指令一样,伪指令也是程序设计不可缺少的工具。

下面介绍一些常用的伪指令。

4.2.1 段定义伪指令段定义伪指令是表示一个段开始和结束的命令,80x86有两种段定义的方式:完整段定义和简化段定义,分别使用不同的段定义伪指令来表示各种段。

4.2.1.1 完整的段定义伪指令完整段定义伪指令的格式如下:段名 SEGMENT...段名 ENDS段名由用户命名。

对于数据段、附加段和堆栈段来说,段内一般是存储单元的定义、分配等伪指令语句;对于代码段中则主要是指令及伪指令语句。

定义了段还必须说明哪个段是代码段,哪个段是数据段。

ASSUME伪指令就是建立段和段寄存器关系的伪指令,其格式为:ASSUME 段寄存器名: 段名,…段寄存器名必须是CS、DS、ES和SS中的一个,而段名必须是由SEGMENT定义的段名。

·定位类型:说明段的起始边界值(物理地址)。

·组合类型:说明程序连接时的段组合方法。

·类别:在单引号中给出连接时组成段组的类型名。

连接程序可把相同类别的段的位置靠在一起。

例4.1; * * * * * * * * * * * * * * * * * * * * * * *data_seg1 segment ; 定义数据段...data_seg1 ends; * * * * * * * * * * * * * * * * * * * * * * *data_seg2 segment ; 定义附加段...data_seg2 ends; * * * * * * * * * * * * * * * * * * * * * * *code_seg segment ; 定义代码段assume cs:code_seg, ds:data_seg1, es:data_seg2start: ; 程序执行的起始地址; set DS register to current data segmentmov ax, data_seg1 ; 数据段地址mov ds, ax ; 存入DS寄存器; set ES register to current extra segmentmov ax, data_seg2 ; 附加段地址mov es, ax ; 存入ES寄存器...code_seg ends ; 代码段结束; * * * * * * * * * * * * * * * * * * * * * * * * * *end start由于ASSUME伪指令只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中:MOV AX,DATA_SEG1 ; 数据段地址MOV DS,AX ; 存入DS寄存器MOV AX,DATA_SEG2 ; 附加段地址MOV ES,AX ; 存入ES寄存器如果程序中还定义了堆栈段STACK_SEG,也需要把段地址装入SS中:MOV AX,STACK_SEG ; 堆栈段地址MOV SS,AX ; 存入ES寄存器注意,在程序中不需要用指令装入代码段的段地址,因为在程序初始化时,装入程序已将代码段的段地址装入CS寄存器了。

指令、伪指令、伪操作的概念及其作用。

指令、伪指令、伪操作的概念及其作用。

指令、伪指令、伪操作的概念及其作用。

指令、伪指令和伪操作是计算机操作中的重要概念,它们在程序的开发和执行过程中起到了关键作用。

指令(Instruction)是计算机程序中最基本的执行单位。

它是对计算机硬件发出的一个命令,指示计算机执行某种特定的操作。

在计算机的执行过程中,指令被送入处理器中进行解码和执行。

指令通常包括操作码和操作数两个部分。

操作码(Opcode)指明将要执行的操作的类型,操作数(Operand)则表示执行该操作需要的数据或操作的地址。

伪指令(Pseudoinstruction)是一类特殊的指令,它在高级语言编译器或汇编器中扮演了重要的角色。

伪指令看起来像是指令,但在硬件层面并不对应特定的操作。

伪指令主要用于控制程序的编译和链接过程,以及为程序员提供方便的程序设计功能。

它们和普通指令一样出现在源代码中,但在编译器的处理中会被转化为真正的指令或伪操作。

伪操作(Pseudo-operation),也称为汇编器指示符或汇编器伪指令,是在汇编语言中使用的一种特殊语法。

伪操作不是用来执行特定的计算或操作,而是在编译、链接、调试和优化等过程中对程序进行管理和控制的指令。

伪操作通常用于定义常量、申明变量、分配存储空间、定义代码的起点和终点等。

它们在编译过程中起到了更高层次的控制和调度作用,用于生成目标代码时提供相关指示。

举例来说,伪操作可以用于定义常量,如:```.DATAPI EQU 3.14159```上述代码将在目标代码的数据段中定义一个名为PI的常量,并将其值设置为3.14159。

另一个例子是用于声明变量并分配存储空间,如:```.DATACount DW 100```上述代码声明了一个名为Count的变量,并分配了一个字(16位)的存储空间。

伪操作还可以用于定义代码的起始点和终止点,如:```.CODESTART:......END:```上述代码定义了一个名为START的标签,表示程序的起始点;同时,定义了一个名为END的标签,表示程序的终止点。

第四章 伪指令

第四章  伪指令

数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT) 表达式1,表达式2,… 表达式1,表达式2……是给变量或指定的存储单元赋予初值,它们有以下几种形式: (a)数值表达式 数据定义伪指令可以为一个或连续的存储单元设置数值初值。 (b)字符串表达式 对于DB伪指令,字符串的长度允许超过2个字符,但不能超过255个字符,字符 串必须用单引号括起来,它可为字符串中的每个字符分配1字节单元,字符串 从左至右以字符的ASCII码形式按地址递增的顺序依次存放。 (c)?表达式 不带引号的?,用于为变量预留内存单元,暂时不存入数据,即表示所定义的 变量无确定的初值。 例如:A DW ?,?为变量A预留2个字单元。 (d)地址表达式 操作数为地址表达式时,只适用于DW和DD这两种数据定义伪指令。如果地址表 达式为一变量(标号)名,用DW伪指令则是取它的偏移地址来初始化变量;用 DD伪指令则是取它的段首地址和偏移地址来初始化变量。 (e)带DUP的表达式 格式为:n DUP (表达式),其中n为重复因子,只能取正整数,它表示定义了 n个相同的数据存储单元。
在8086汇编语言中,运算符分为:算术运算符、逻辑运算符、关系运算
符、数值返回运算符、属性运算符和字节分离运算符。
(一)、表达式
(1)数值表达式 数值表达式是由常量与算术运算符、逻辑运算符或关系运算符构成的有意 义的式子。数值表达式在汇编期间进行运算,运算结果为一数值常量,它 只有大小而没有属性。
数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT)
Байду номын сангаас
表达式1,表达式2,„
其中:变量名是可选项,它仅代表所定义数据存储区第一个单元的地址; DB、DW、DD、DQ和DT是伪指令符,具体一条数据定义伪指令取5种之一。 DB定义的是字节类型的变量,每个表达式被分配1个字节单元。 DW定义的是字类型的变量,每一个表达式被分配1个字单元(2个字节)。 DD定义的是双字类型的变量,每一个表达式被分配2个字单元(4个字节)。 DQ定义的是四字类型的变量,每一个表达式被分配4个字单元(8个字节)。 DT定义的是十字节类型的变量,每一个表达式被分配10个字节单元。

51汇编伪指令详解

51汇编伪指令详解

51汇编伪指令伪指令是对汇编起某种操纵作用的特殊命令,其格式与通常的操作指令一样,并可加在汇编程序的任何地址,但它们并非产生机械指令。

许多伪指令要求带参数,这在概念伪指令时由“表达式”域指出,任何数值与表达式匀能够作为参数。

不同汇编程序许诺的伪指令并非相同,以下所述的伪指令仅适用于MASM51系统,但一些大体的伪指令在大部份汇编程序中都能利用,当利用其它的汇编程序版本时,只要注意一下它们之间的区别就能够够了。

MASM51中可用的伪指令有:ORG 设置程序起始地址END 标志源代码终止EQU 概念常数SET 概念整型数DATA 给字节类型符号定值BYTE 给字节类型符号定值WROD 给字类型符号定值BIT 给位地址取名ALTNAME 用自概念名取代保留字DB 给一块持续的存储区装载字节型数据DW 给一块持续的存储区装载字型数据DS 预留一个持续的存储区或装入指定字节。

INCLUDE 将一个源文件插入程序中TITLE 列表文件中加入题目行NOLIST 汇编时不产生列表文件NOCODE 条件汇编时,条件为假的不产生清单一、ORG伪指令ORG用于为在它以后的程序设置地址值,它有一个参数,其格式为:ORG 表达式表达式能够是一个具体的数值,也能够包括变量名,若是包括变量名,那么必需保证,当第一次碰到这条伪指令时,其中的变量必需已有概念(已有具体的数值),不然,无概念的值将由0替换,这将会造成错误。

在列表文件中,由ORG概念的指令地址会被打印出来。

ORG指令有什么用途呢?指令被翻译成机械码后,将被存入系统的ROM中,一样情形下,机械码老是一个接一个地放在存储器中,但有一些代码,其位置有特殊要求,典型的是五个中断入口,它们必需被放在0003H,000BH,0013H,001BH和0023H的位置,不然就会犯错,若是咱们编程时不作特殊处置,让机械代码一个接一个地生成,不能保证这些代码正益处于这些规定的位置,执行就会犯错,这时就要用到ORG伪指令了。

DSP汇编伪指令集讲解

DSP汇编伪指令集讲解



4 .copy, .include .copy, .include告诉编译器从其他文件中读入源语句。 区别在于:.copy读入的源语句将在列表文件中列出, 而.include伪指令读入的不在列表文件中列出。 当汇编器遇到.copy和 .include伪指令时,将停止汇 编当前的源文件语句,而去编译.copy和 .include文件中 的语句,然后继续汇编.copy和 .include后开始的源文件 语句。 5 .data , .text .data是数据段定义伪指令。它告诉汇编器把源代码汇 编到.data段中,且.data成为当前段。该段通常用来存放 数据表或初始化前的变量。 .text:定义.text段中的代码部分,该部分为可执行代 码。.text段是默认段,若汇编开始不指定其他段,就自动 汇编到该段。



4. 当编写具体的应用程序的时候, 用.copy或.include伪指令将I/O寄存器头文 件合中断矢量头文件复制到应用程序中, 形成一个汇编源程序(如delay.asm),再 由汇编器进行汇编后生成一个目标文件 (如delay.obj),最后连接器把该目标文 件和命令文件相连接,生成可执行文件 (如delay.out).

本例中用.usect伪指令定义两个未初始化的命名 段var1和var2。符号ptr和array分别指向var1段和 var2段的第一个字。 dflag指向var1段中50个字块 中的第一个字。
SPC 0000 0000 0000 0001 0001 0065 0002 0000 0003 目标代码 源程序 .text 2003 LACC ptr .usect array .usect 0037 ADD dflag .usect 0065 ADD vec .usect 0000 ADD .global ;汇编到.text段 03h “var1”,1 ;在var1段保留一个字 “var1”,100 ;在var1段保留100个字 037h “var1”,50 dflag ;还在.text段 “var2”,100 ; 在var2段保留100个字 vec ;还在.text段 array ;将array定义为外部符号名

伪指令的使用与心得

伪指令的使用与心得

伪指令的使⽤与⼼得伪指令的使⽤与⼼得1 伪指令的定义所谓指令(instruction),针对汇编程序⽽⾔,就是将CPU直接识别的指令——⼆进制指令通过查表的⽅式转换为asmmebly 指令⽽⽅便程序⼈员来编制程序,⼆进制指令就是我们所常说的机器指令。

这个转换过程是编译器的⼯作,不⽤程序员来⼲涉。

汇编语⾔指令的形式是以助记符的形式出现的, 所以⽐较容易理解和记忆。

⽤汇编指令编制的汇编语⾔源程序, 可长可短,这是由程序员根据系统的要求, 或是根据程序的难易程序决定的。

单⽚机与其它计算机⼀样, 在汇编源程序时需要向汇编程序提供某些必要的信息, 诸如源程序的⽬的程序从存储器的哪⼀个单元开始装⼈? 源程序是否结束? 程序中所⽤的数据存放在什么地址? 某⼀个标号的地址是哪⾥? 某⼀个可位寻址的代名字是什么?等等。

这些信息要和源程序⼀起出现, 成为源程序的⼀部分, 这⼀类信息也可以指令的形式出现, 汇编语⾔把它们称为伪指令。

所以伪指令是⼀些特殊的符号集合, 它们不是⼀个单⽚机系统指令集中的指令(在指令集中找不到)。

我们可以通过以上的过程描述发现,通过以上从⼆进制到汇编指令的转换过程发现,这⽅便了程序⼈员进⾏程序的编制。

但是,⽤汇编程序代码和⾼级语⾔的代码进⾏⽐较,汇编程序还是很复杂。

⽐如说,⼀个简单⽐较过程,需要使⽤CMP、JMP、JNZ、JZ等⼀系列的指令来实现,不仅复杂⽽且容易出错,很⼤的影响了效率。

正是因为这个⽅⾯的原因,MASM 就出现了.if.endif.elseif等伪指令,这些伪指令为我们在汇编程序中使⽤和⾼级语⾔⼗分接近的的控制⽅式来进⾏⽐较、循环等结构控制。

⾄于,这些伪指令到真正的指令之间的转换⼯作,交给汇编器来完成就好了。

总结起来,伪指令最终⾯对的是CPU 指令的指令。

伪指令⼜称汇编程序控制译码指令。

“伪”字体现在汇编时伪指令不产⽣机器指令代码,不影响程序的执⾏, 仅产⽣供汇编⽤的某些命令, 在汇编时执⾏某些特殊操作。

伪指令

伪指令

方括号中为可选项,规定了逻辑段的一些其他特性
例:
DATA1 A DATA1 DATA2 DATA2 DATA3 C DATA3
DB
DB
DB
SEGMENT 1,2,3 ENDS SEGMENT 200 DUP(0) ENDS SEGMENT ?,?,? ENDS
STACK
CODE
SEGMENT
ASSUME DS:DATA1,ES:DATA3 CS:CODE,SS:DATA2 START: MOV AX,DATA1 MOV DS,AX MOV AX,DATA3 MOV ES,AX ┆ Q1: MOV AL,A Q2: MOV C,AL
A C8H
STR1 ‘H’
SUM
- -
‘I’
20H ‘O’ ‘K’ ‘!’
TABLE
3 3 3 7 3
0DH
0AH
‘$’ DATA1 0 0 0 0
3
3 7
……
为 0, 1,
10, 14
2. 段定义伪指令
因8086/8088 CPU的存储器是分段的,这就需要有段 定义语句。 与段有关的伪指令主要有: SEGMENT、ENDS、ASSUME 段定义伪指令的格式如下: 段名 SEGMENT [定位类型] [组合类型] [’类别’] ┇ 段名 ENDS
在前缀开始处安排了一条 INT 20H, 在过程结束时通过RET返回DOS。
AX,DATA DS,AX ;DATA → DS ES,AX ;DATA → ES ┇ ;具体程序 RET ;返回指令 MAIN ENDP ;过程结束 CODE ENDS ;代码段结束 END START ;源程序结束
MOV MOV MOV
字节变量的应用 X

汇编语言伪指令

汇编语言伪指令

汇编语言伪指令在汇编语言程序里,有一些特殊的助记符,这些助记符与指令系统的助记符不同,它们没有对应的机器码。

这些助记符在源程序中的作用是完成汇编程序的各种准备工作,包括定义变量、分配数据存储空间、控制汇编过程、定义程序入口等。

它们仅仅在汇编的过程中起作用,一旦汇编过程结束,它们的使命也就完成了。

这些助记符称为伪指令,它们所完成的操作称为伪操作。

不同汇编器的伪指令可能存在少量的区别,并非所有的伪指令在任何编译器上都能被识别。

一、符号定义伪指令符号定义(Symbol Definition)伪指令用于定义ARM汇编程序中的变量,对变量赋值和定义寄存器别名等,如表1所列。

表1 符号定义伪指令实例:GBLL P_ON ; 定义全局逻辑变量P_ON P_ON SETL {TRUE} ; 给全局逻辑变量P_ON赋值为真LCLA NUM ; 定义局部数字变量NUM NUM SETA 100 ; 给全局数字变量NUM赋值为100RegList RLIST {R0-R5,R8,R10} ; 定义一个寄存器列表RegList,可用微处理器系统结构与嵌入式系统设计(第3版)2; LDM/STM指令访问该列表二、数据定义伪指令数据定义(Data Denfinition)伪指令一般用于为特定的数据分配存储单元,同时完成对已分配存储单元的初始化工作。

数据定义伪指令如表2所示。

表2 数据定义伪指令从使用方法上来讲,数据定义伪指令可以分为以下3类。

1.SPACE伪指令SPACE用于分配一片连续的存储区,并初始化为0。

其中表达式中的数字表示分配的字节数。

SPACE也可以用%代替。

实例:DataSpace SPACE 100 ; 分配连续100字节的存储单元并初始化为0 2.MAP和FIELD伪指令MAP和伪指令FIELD经常结合在一起使用。

MAP用于定义一个结构化的内存表的首地址,可以用“^”替代。

FIELD用于定义一个结构化的内存表中的数据域,可以用“#”代替。

指令语句和伪指令语句的格式-详细解释说明

指令语句和伪指令语句的格式-详细解释说明

指令语句和伪指令语句的格式-范文模板及概述示例1:标题:指令语句与伪指令语句的格式解析及其在编程中的应用指令语句和伪指令语句是程序设计语言中两种关键的构成元素,它们在编程过程中发挥着不同的作用,并具有特定的格式规范。

一、指令语句指令语句,也称机器指令,是计算机硬件可以直接执行的命令。

其格式通常包括操作码(opcode)和操作数(operand)。

操作码代表要执行的操作类型,如加法、减法、移动等;操作数则是该操作的对象,可以是寄存器、内存地址或立即数。

例如,在x86汇编语言中,"ADD AX, BX"是一个指令语句,其中"ADD"是操作码,指示进行加法操作,"AX"和"BX"是操作数。

二、伪指令语句相比之下,伪指令语句并非由计算机硬件直接执行,而是由汇编程序在汇编阶段处理并转化为实际的机器指令。

伪指令主要用于定义数据、分配存储空间、设置程序流程控制以及提供程序说明等。

例如,在汇编语言中,".DATA"、".WORD"、"EQU"、"ORG"等都是常见的伪指令。

".DATA"用于定义数据段,".WORD"用于分配指定大小的存储空间,"EQU"用于定义符号常量,"ORG"则用于设定程序的起始地址。

具体而言,一个伪指令语句的格式可能如下所示:assemblyLABEL EQU 100 ; 定义符号常量LABEL为100在这个例子中,“LABEL”是符号名,“EQU”是伪指令关键字,而“100”则是赋给该符号的值。

总结来说,指令语句和伪指令语句虽然都属于编程语句,但前者直接影响程序的运行过程,后者则主要参与程序的构建和组织,对源代码进行预处理,共同构建出可被计算机理解和执行的程序结构。

伪指令和宏指令

伪指令和宏指令

即“A”的ASCII码。
二、 输入输出指令
输入输出指令共两条,用于CPU和外设之间的数据传送 1. IN 2. OUT 输入指令用于CPU从外设端口接收数据(读), 输出指令用于CPU向外设端口发送数据(写)。 无论接受还是发送数据,必须通过累加器AX(字)或
AL(字节),又称累加器专用传送指令 。 输入、输出指令不影响标志位。
例:内存的数据段中有一张十六进制数字的ASCII码 表。
首地址为:Hex_table ,欲查出表中第10个元素 (‘A’)
执行指令序列:
MOV BX,OFFSET Hex_table MOV AL,0AH XLAT
Hex_table
Hex_table+1 Hex_table+2
假设:
30H
'0'
31H
④ 堆栈工作原则后进先出。 PUSH ,POP指令应该成对使用,保 持堆栈原有状态。
堆栈应用举例:
例 : 压入堆栈的内容 与弹出内容顺序相反
… PUSH AX PUSH BX PUSH CX
… POP CX POP BX POP AX
例:用BP的基址指令 代替POP指令 …
MOV BP,SP PUSH AX PUSH BX PUSH CX
1. MOV
MOV dest, src ; (dest) (src)
目的 源
目的 源
功能: (1)把一个字节(B)或一个字(W)操作数由源传送至 目的。 (2)实现:
寄存器寄存器/存储器 立即数寄存器/存储器 寄存器/存储器段寄存器
① CPU内部寄存器之间的数据的任意传送(除了代码 段寄存器CS和指令指针IP以外)。
偏移地址
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

①指令和伪指令。

答:汇编指令与机器指令原则上一一对应,在汇编过程中,汇编指令会被替换为机器指令,最终生成可执行的目标代码;指令的功能是由特定CPU的指令译码器确定的,因此,指令是一个硬件相关的概念;汇编过程仅将汇编指令替换为机器指令,而机器指令的执行是在可执行程序执行阶段完成的。

汇编语言伪指令在汇编过程中并不产生机器指令,它们的功能在于指示汇编程序按照指定的方式对汇编语言源程序做出解释,伪指令的功能是由汇编程序解释的,与硬件结构无关;伪指令的执行是在汇编过程中完成的,在程序执行阶段则不存在伪指令的概念。

1.逻辑地址:在CPU内部的存储单元地址表示形式,分为段基值和偏移量两个组成部分,它们都是16位的,在指令或源程序中只能使用逻辑地址来表达存储单元。

2.物理地址:CPU访问存储单元时向地址总线传送的地址表示形式,是20位的地址,由逻辑地址中段基值乘以16再加上偏移量得到,逻辑地址到物理地址的转换由CPU在执行访问存储单元的指令时自动完成。

3.标志寄存器:在CPU中由状态标志位与控制标志位组成的寄存器称为标志寄存器,其中状态标志位用于标识运算指令执行后运算结果的特征,控制标志位用于控制CPU的工作模式或改变CPU对某些事件的响应方式。

4.存储器寻址方式:即获得存储单元地址的方式,在8086/8088CPU中包括直接寻址、寄存器间接寻址、基址寻址、变址寻址、基址变址寻址这五种寻址方式。

5.立即数:以数值形式直接给出的操作数称为立即数,立即数不能作为目的操作数。

6.位移量:直接以数字形式出现的偏移量的分量之一。

7.伪指令:用于指示编译(汇编)程序如何进行编译的指令。

8.位操作指令:9.能精准到位对其进行读写的计算机指令,包括逻辑运算和移位及循环移位指令。

10.中断过程:中断请求、中断响应、中断处理、中断返回11..BCD码:一种十进制编码形式,(1分)限制4个连续二进制位的数值变化范围为0到9,用以表示一个十进制数位,(1分)是实现十进制算术运算调整的必要基础。

(1分)12.13.3.逻辑段:8086/8088CPU组织内存空间的基本方式,(1分)把数据、代码所占用的内存空间划分为一块块连续空间的形式,这样的一块地址连续的空间就称为段,(1分)段的最大长度由偏移量的变化范围决定,即64K。

9.编写一完整程序,该程序将数据段定义的字符串“Hello,World.”末尾的句号替换成感叹好“!”。

参考答案(不唯一)data segmentstr1 db ‘Hello, World.’len equ $-str1data endscode segmentassume ds:databegin: mov ax, datamov ds, axlea si, str1add si, len-1mov byte ptr [si], ‘!’mov ah, 4chint 21hcode endsend begin10.编写一完整程序,分别在两个数据段DSEG1和DSEG2中各定义一个字型变量X和Y并计算两数差的绝对值。

参考答案(不唯一); 此处假定运算结果保存在DSEG1段的Z变量中,由于要求求解绝对值,因此假定变量中; 的编码为补码; 说明,由于求绝对值涉及到条件转移指令,在本章还未介绍,因此可只要求同学们计算两; 数之差即可,或将X、Y大小关系指定为已知条件来求解绝对值。

DSEG1 SEGMENTX DW 4723HZ DW ?DSEG1 ENDSDSEG2 SEGMENTY DW 528AHDSEG2 ENDSCODE SEGMENTASSUME DS:DSEG1, ES:DSEG2BEGIN: MOV AX, DSEG1MOV DS, AXMOV AX, DSEG2MOV ES, AXMOV AX, XSUB AX, YMOV Z, AXMOV AH, 4CHINT 21HCODE ENDSEND BEGIN6.假设有一字符串STR,试编写一个程序查找STR字符串中第一个非空格字符的位置,如果找到则将字符位置保存在字节变量POS1中,如果没有找到则将0FFH保存至POS1中。

参考答案(不唯一)DA TA SEGMENTSTR DB ‘HELLO! ’LEN EQU $-STRPOS1 DW ?DA TA ENDSCODE SEGMENTASSUME DS: DA TABEGIN: MOV AX, DA TAMOV DS, AXMOV POS1, 0FFHLEA BX, STR1MOV CX, LENLOP1: CMP [BX], 20HJNZ L1JMP L2L1: MOV POS1, BXJMP L3L2: INC BXLOOP LOP1L3: MOV AH, 4CHINT 21HCODE ENDSEND BEGIN7.假设有一字类型的补码数组ARY1,试编写一个程序查找ARY1数组中的最大值,并将查找结果保存在字类型变量RES1中。

参考答案(不唯一)DA TA SEGMENTARY1 DB -53, 44, 75, 36, -2, 64, -27, -1, 9LEN EQU $-ARY1RES1 DB ?DA TA ENDSCODE SEGMENTBEGIN: MOV AX, DA TAMOV DS, AXLEA BX, ARY1MOV CX, LEN-1MOV AL, ARY1LOP1: CMP [BX], ALJGE L1JMP L2L1: MOV AL, [BX]L2: INC BXLOOP LOP1MOV RES1, ALMOV AH, 4CHINT 21HCODE ENDSEND BEGIN8.假设有一字节类型的补码数组DA T1,试编写一个程序统计数组DA T1中正数(包括0)和负数分别的数量,正数统计结果保存在字节变量RES1中,负数统计结果保存在字节变量RES2中。

参考答案(不唯一)DA TA SEGMENTDA T1 DB -34, -2, -1, 55, -3, 0, 94, 100, 7, -7LEN EQU $-DA T1RES1 DB ?RES2 DB ?DA TA ENDSCODE SEGMENTASSUME DS: DA TABEGIN: MOV AX, DA TAMOV DS, AXXOR AX, AXMOV CX, LENLEA BX, DA T1LOP1: CMP [BX], 0JS L1JMP L2L1: INC AHJMP L3L2: INC ALL3: INC BXLOOP LOP1MOV RES1, ALMOV RES2, AHMOV AH, 4CHINT 21HCODE ENDSEND BEGIN9.假设有两个长度为8个字的补码,分别保存在字类型数组DA1和DA2中,低地址保存低位,试设计一个程序实现两个长补码的减法,减法结果保存在字类型数组RES1中,是否溢出用OF标志反映。

参考答案(不唯一)DA TA SEGMENTDA1 DW 0143H, 435AH, FA1CH, 7754H, 6A11H, B2FFH, 1B2BH, 0FF1HDA2 DW E227H, A82BH, 33BAH, 72B6H, 1F21H, 2614H, 4FC1H, 2CBAHLEN EQU 8RES1 DW LEN DUP(?)DA TA ENDSCODE SEGMENTBEGIN: MOV AX, DA TAMOV DS, AXMOV CX, LENXOR BX, BXCLCLOP1: MOV AX, DA1[BX]SBB AX, DA2[BX]MOV RES1[BX], AXADD BX, 2LOOP LOP1MOV AH, 4CHINT 21HCODE ENDSEND BEGIN10.假设有一个长度为4个字的无符号数,保存在字类型数组DA1中,低地址保存低位,试设计一个程序实现这个长无符号数除以8的功能,运算结果仍然保存在数组DA1中。

参考答案(不唯一)DA TA SEGMENTDA1 DW 7B24H, F2BBH, 114FH, 6A82HLEN EQU $-DA1DA TA ENDSCODE SEGMENTBEGIN: MOV AX, DA TAMOV DS, AXMOV CH, 3LOP1: MOV CL, 3MOV BX, LEN-2SHR DA1[BX], 1LOP2: SUB BX, 2RCL DA1[BX], 1DEC CLJNZ LOP2DEC CHJNZ LOP1MOV AH, 4CHINT 21HCODE ENDSEND BEGIN六.程序设计题(本大题共2小题,第1小题8分,第2小题12分,共20分),每小题给出了一个程序设计要求,请按照要求写出源程序代码,如果源程序代码中出现语法错误或逻辑错误,则酌情扣分。

1.请设计一个子程序,其功能如下:(1)主程序向它提供一个字节类型的待处理数据,并指明要处理的二进制数位(2)该子程序将待处理数据的指定二进制位清0,并将处理结果返回给主程序。

例:如果主程序要求将11001001B的第3位清0,则处理后结果为11000001B仅要求写出与子程序相关的源程序代码,并用文字说明参数传递方式。

(8分)评分标准:按照如下示例给分,但是不要求解答与示例完全相同解:参数传递说明:入口参数共2个,待处理数据和要求处理的二进制位序号,通过堆栈传递,主程序按照先后顺序将它们压入堆栈;(0.5分)出口参数有一个,处理后的数据,通过堆栈传递,子程序用处理结果覆盖堆栈中的待处理数据,完成出口参数的传递。

(0.5分)CLEARBIT PROC ;子程序定义关键字,0.5分PUSH BP ;现场保护,0.5分MOV BP,SPPUSH AXPUSH CXMOV CX,[BP+4] ;取入口参数,0.5分MOV AX,[BP+6]MOV AH,0FEH ;子程序功能主体,3分JCXZ L1ROL AH,CLL1:AND AL,AHXOR AH,AHMOV [BP+6],AX ;保存出口参数,0.5分POP CX ;现场恢复,0.5分POP AXPOP BPRET 2 ;返回指令,1分CLEARBIT ENDP ;子程序定义关键字,0.5分上面标注的评分点,主要是评判源程序中有没有该要素,如果有则给分,如果有逻辑错误,则视其严重程度从该要素的相应分值中酌情扣除,语法错误按照下面的规则统一评判。

如果程序编写中出现了局部的语法错误,则每个错误扣0.5,如果累积扣满3分后仍有语法错误,则忽略后出现的语法错误。

2.请设计一个完整程序,该程序的功能如下:(1)从键盘接收一个字符串输入,把接收到的字符串存放于一个缓冲区中,最大允许输入20个字符,输入字符数不够20个时可以回车键结束字符串的输入。

相关文档
最新文档