4.1 伪指令

4.1 伪指令
4.1 伪指令

MJ/JW-JL-11(15) 5年

三明市高级技工学校

教案用纸

教案用纸附页

教案用纸附页

教案用纸附页

汇编常用伪指令

一、基本段定义格式常用结构STACK SEGMENT PARA 'STACK; DB 100 DUP('STACK') STACK ENDS DATA SEGMENT DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,data MOV DS,AX MOV ES,AX MOV AL,4CH INT 21H CODE ENDS END START ------------------------------------------------------------------------------------------------------------------------ 段名segment[定位][组合][段字][‘类别’] ... 段名ends (1)定位 段定位(align)属性——指定逻辑段在主存储器中的边界: BYTE:段开始为下一个可用的字节地址(xxxx xxxxb),属性值为1 WORD:段开始为下一个可用的偶数地址(xxxx xxx0b),属性值为2 DWORD:段开始为下一个可用的4倍数地址(xxxx xx00b),属性值为4 PARA:段开始为下一个可用的节地址(xxxx 0000b),属性值为16 PAGE:段开始为下一个可用的页地址(0000 0000b),属性值为256 简化段定义伪指令的代码和数据段默认采用WORD定位,堆栈段默认采用PARA定位。完整段定义伪指令的默认定位属性是PARA。(2)组合 PUBLIC: 所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中。 COMMON : 所有此类型的同名段具有相同的起始地址(覆盖),共享相同的存储区域。 AT <数值表达式> : 按绝对地址定位,段地址就是表达式的值。

IA-32中常见的伪指令

TITLE 伪指令将整行标为注释 INCLUDE伪指令后跟文件名,指定从某一文件中拷贝必需的信息 .code伪指令用来标记代码段的开始,程序中所有可执行语句都放于此处 PROC伪指令允许声明一个过程并且附带参数列表,其使用格式为 label PROC { [,parameter_1] } 每个参数的格式为参数名:类型 ENDP伪指令标识子程序的结束 END伪指令标明该行是汇编程序的最后一行,编译器将忽略该行后面的所有内容 .386伪指令指出了程序要求的最低CPU(Intel386) .MODEL伪指令指示编译器哪种模式程序生成代码 STDCALL伪指令允许程序调用MS-Windows函数 PROTO伪指令声明了程序使用的子程序 INVOKE是一个用于调用过程或函数的汇编伪指令 BYTE,SBYTE等类似的,用于定义数据的伪指令。早期还是用DB,但DB无法区分是否有符号DUP操作使用一个常量表达式作为计数器来重复分配存储空间。即使用DUP可以一次分配多个空间,并且决定对此空间进行全部初始化或全部都不初始化 .DAT A伪指令可用于声明未初始化数据,它在定义大块的未初始化数据时非常有用,因为它可以缩小编译后的程序尺寸 =(等号伪指令)将符号名和整数表达式联系起来。以=定义的符号可重定义任意多次EQU伪指令将符号名和整数表达式或任意文本联系起来。三种使用格式 name EQU expression 有效的整数表达式 name EQU symbol 已被=或EQU定义的符号 name EQU 用EQU定义的符号不能在同一源代码文件中重复定义 TEXTEQU伪指令可用来创建文本宏(text macro) OFFSET操作符返回一个变量相对于其所在段开始的偏移,即返回数据标号的偏移地址PTR操作符允许重载变量的默认尺寸 TYPE操作符返回数组中每个元素的大小(以字节计算) LENGTHOF操作符返回数组内元素的数目。注意对在DUP的嵌套使用和换行的情况SIZEOF操作符返回数组初始化时占用的字节数。即返回LENGTHOF和TYPE返回值的乘积ALLIGN伪指令将变量的位置按字节、字、双字边界对齐ALLIGN 1|2|4。数据对齐可能会浪费一部分存储空间,但CPU处理存储在偶数地址的数据比处理存储在奇数地址的 数据要快 LABEL伪指令允许插入一个标号并赋予其尺寸属性而无需分配任何实际的存储空间 JMP指令导致向代码段内的目标地址做无条件转移 LOOP指令提供了一种将程序块重复执行特定次数的简单方法。ECX被自动用作计数器。并且注意LOOP指令的执行是分两步:首先,ECX减1,接着与0比较。根据比较的 结果来决定是否发生跳转 .NOLIST伪指令禁止编译器在创建的列表文件中显示这些源文件行。 .LIST伪指令允许显示后面文件行 USES与PROC伪指令配套使用的USES操作符允许列出被过程修改的所有寄存器,它只是编译器做两件事情:首先,在过程的开始出生成PUSH指令在堆栈上保存寄存器;其 次,在过程的结束处生成POP指令恢复这些寄存器的值。 LOCAL伪指令在过程内声明一个或多个命名局部变量,语句必须紧跟在PROC伪指令所在行

汇编程序设计实验报告--完整段定义程序实现

《汇编语言程序设计》 实验报告

实验四完整段定义程序的实现实验目的 1、掌握完整段格式定义的程序设计方法; 2、掌握伪指令:SEGMENT、ENDS、ASSUME、END、OFFSET、DUP; 3、掌握汇编语言程序中指名程序入口的方法; 4、了解用INT 21H 的4C号功能调用返回系统的方法; 5、掌握用MASM、LINK工具进行汇编和链接的过程。 实验内容 要求程序中实现对键盘输入的字符作如下处理: ●如果输入的是小写字母则转换成对应的大写字母并显示在屏幕上; ●如果输入的是大写字母则转换成对应的小写字母并显示在屏幕上; ●如果输入的是键盘上的Esc键则退出程序执行; ●按其它任意可显示键,则不作处理,直接显示输出。 实验步骤 1、编辑下列程序: DATA SEGMENT ;数据段定义 MESSAGE DB 'Please input your key!',0DH,0AH,'$' DATA ENDS STACK SEGMENT PARA STACK 'STACK' ;堆栈段定义 DB 50 DUP(?) STACK ENDS CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA,SS:STACK ;分配段寄存器START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET MESSAGE MOV AH,9 INT 21H ;显示提示信息 AGAIN: MOV AH,1 INT 21H ;读入一个键盘按键 CMP AL,1BH ;按的是ESC键(ASCII码为1BH)则退出程序 JE EXIT CMP AL,61H JB NEXT CMP AL,7AH

实验二 常用伪指令 2010214228

实验二常用伪指令的使用 一.实验目的: 进一步熟悉变量定义伪指令及各种运算符的使用。 二.实验内容: 调试实验指导中给出的程序,查看数据区的内容,回答相关问题。三.操作步骤 1.建立源程序文件如图3-1所示。 DATA SEGMENT ARRY1 DB 12,-18,32,68,-9 COUNT EQU $-ARRY1 ORG 08H ARRY2 DW 15,26,38 STR1 DB 'ABCD' DATA1 DW ARRY2 DATA2 DD ARRY2 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,STR1 MOV BL,COUNT MOV DX,OFFSET ARRY2 MOV AX,SEG ARRY2 MOV BL, BYTE PTR DATA1+1 MOV BL,BYTE PTR DATA2 MOV CX,WORD PTR DATA2 MOV AH,4CH ; 调用21H号中断的4CH号功能,返回DOS INT 21H CODE ENDS END START 图2-1 2. 根据数据区定义画出数据区的存储示意图 地址内容变量名 0710:0000 0CH ARRY1 0710:0001 EEH 0710:0002 20H

0710:0003 44H 0710:0004 F7H 0710:0008 0FH ARRY2 0710:0009 00H 0710:000A 1AH 0710:000B 00H 0710:000C 26H 0710:000D 00H 0710:000E 41H STR1 0710:000F 42H 0710:0010 43H 0710:0011 44H 0710:0012 00H DA TA1 0710:0013 00H 0710:0014 08H DA TA2 0710:0015 00H 0710:0016 10H 0710:0017 07H 3.回答以下问题: 1)DATA段中DA TA1和DATA2里存放的数据的物理意义是什么? 答:DATA1中存放ARRY1的偏移地址,占一个字,低位字节占用第一个字节地址,高位字节占用第二个字节地址。DATA2存放ARRY2的段基址和偏移地址,偏移地址占用低位字,段基址占用高位字。 2)COUNT所表示的值是多少?其物理意义是什么? 答:COUNT用来计算ARRY1占用的字节数,其值是5 3)将STR1 DB'ABCD' 改为STR1 DW'ABCD' ,则STR1数据区的内容会发生 什么变化? 答:由DB改为DW后STR1数据区的内容为0041H,0042H,0043H,0044H 4. 单步运行程序中带下划线的语句,查看每一条语句运行后寄存器的变化,用准确的语言描述该指令所执行的操作。如:指令MOV AX,[BX] 执行的操作是将寄存器BX中的内容作为有效地址,将其所指向的连续两个字节的存储单元的内容送到AX 中。 答: 注:本次实验无须提交源程序文件,只提交实验报告即可。

STM 常用汇编指令

在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初始化,进出中断时的环境保护,恢复等对性能有要求的地方。 ARM指令集可以分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。 ARM指令使用的基本格式如下: 〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉} opcode操作码;指令助记符,如LDR、STR等。 cond可选的条件码;执行条件,如EQ、NE等。 S可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。 Rd目标寄存器。 Rn存放第1操作数的寄存器。 operand2第2个操作数 arm的寻址方式如下: 立即寻址 寄存器寻址 寄存器间接寻址 基址加偏址寻址 堆栈寻址 块拷贝寻址 相对寻址 这里不作详细描述,可以查阅相关文档。 数据处理指令 Load/Store指令 程序状态寄存器与通用寄存器之间的传送指令 转移指令 异常中断指令 协处理器指令 在S3C2410、S3C2440的数据手册中对各种汇编指令有详细的描述;这里只对较常见的作写介绍。 1、相对跳转指令:b、bl 这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。 这两条指令的可跳转范围是当前指令前后32M。 b funa .... funa: b funb ....

funb: .... 2、数据传送指令mov,地址读取伪指令ldr mov指令可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器。 mov r1,r2 mov r1,#1024 mov传送的常数必须能用立即数来表示。当不能用立即数表示时,可以用ldr命令来赋值。ldr是伪命令,不是真实存在的指令,编译器会把它扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。 ldr r1,=1024 3、内存访问指令ldr、str、ldm、stm ldr既可以指低至读取伪指令,也可以是内存访问指令。当他的第二个参数前面有'='时标伪指令,否则表内存访问指令。 ldr指令从内存中读取数据到寄存器,str指令把寄存器的指存储到内存中,他们的操作数都是32位的。 ldr r1,[r2,#4] ldr r1,[r2] ldr r1,[r2],#4 str r1,[r2,#4] str r1,[r2] str r1,[r2],#4 寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。多寄存器存取指令的汇编格式如下: LDM/STM{}Rn{!}, 4、加减指令add、sub add r1,r2,#1 sub r1,r2,#1 5、程序状态寄存器的访问指令msr,mrs ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。这两条指令分别是: 状态寄存器到通用寄存器的传送指令(MRS) 通用寄存器到状态寄存器的传送指令(MSR) 其汇编格式如下: MRS{}Rd,CPSR|SPSR 其汇编格式如下:

PLC常用指令(很全的)

一、顺控指令 1 触点指令 00 LD 逻辑操作开始 01 LDI 逻辑非操作开始 02 AND 逻辑乘 03 ANI 逻辑乘非 04 OR 逻辑加 05 ORI 逻辑加非 2 连接指令 06 ANB AND逻辑块与 07 ORB OR逻辑块或 08 MPS 存储操作结果 09 MRD 从MPS读取操作结果 10 MPP 从MPS读取操作结果并清除结果 3 输出指令 11 OUT 软元件输出 12 SET 软元件置位 13 RST 软元件复位14 PLS 在输入信号的上升沿 15 PLF 在输入信号的下降沿 16 CHK 软元件输出翻转 4 移位指令 17 SFT 元件移1位 18 SFTP 元件移1位 5 主控指令 19 MC 主控开始 20 MCR 主控复位 6 结束指令 21 FEND 结束主程序 22 END 总的程序末尾, 返回第0步 7 其它指令 23 STOP 停止 24 NOP 空操作 二基本指令 1 比较指令 16位数据比较 25 LD= 当S1=S2, 接通, 当S1≠S2, 断开 26 AND= 27 OR= 28 LD<> 当S1≠S2, 接通, 当S1=S2, 断开 29 AND<> 30 OR<> 31 LD> 当S1>S2, 接通, 当S1≤S2, 断开 32 AND> 33 OR> 34 LD<= 当S1≤S2, 接通, 当S1>S2, 断开 35 AND<= 36 OR<= 37 LD< 当S1= 当S1≥S2, 接通, 当S1= 42 OR>= 32位数据比较 43 LDD= 当(S1+1,S1)=(S2+1,S2), 接 通 44 ANDD= 45 ORD= 46 LDD<> 当(S1+1,S1)≠(S2+1,S2),接 通 47 ANDD<> 48 ORD<> 49 LDD> 当(S1+1,S1)>(S2+1,S2), 接 通 50 ANDD> 51 ORD> 52 LDD<= 当(S1+1,S1)≤(S2+1,S2),接 通 53 ANDD<= 54 ORD<=

实验二 伪指令实验

实验二伪指令实验 一、实验目的 1.掌握数据定义伪指令的使用方法; 2.掌握符号定义伪指令的使用方法; 3.掌握段定义伪指令的使用方法 4.掌握各种数据在内存中的存放形式。 二、实验要求 1.学会使用数据定义伪指令定义字节数据、字数据、双字数据、四字数据及十字数据; 2.学会使用DEBUG中的D命令观察字节数据、字数据、双字数据等在内存中的存放格式; 3.学会使用DEBUG中的D命令观察带符号数据和不带符号数据在内存中的存放形式; 4.学会使用DEBUG中的D命令观察实数在内存中的存放形式。 三、实验举例 【例3.2】 编辑、汇编、连接下列程序段,然后在DEBUG下观察数据的存储格式。 【步骤一】 启动EDIT编辑器,编辑源程序。 程序清单如下: CSEG SEGMENT X1 DB 0AH,0BH,0CH,0DH,31H,32H,33H,34H X2 DB 10,11,12,13,14,15,16,17,18 X3 DB -1,-2,-3,-4,-5,-6,-7,-8 Y1 DB 25+25,78-34,15*4,90/3 Y2 DB 80 MOD 9,3 DUP(50) Y3 DB ‘ABCDEFGH’ Z1 DW 1234H,5678H,0ABCDH,0ABEFH Z2 DW -1,-2,-3,-4,-5,-6,-7,-8 Z3 DW OFFSET Y3,3 DUP(0),OFFSET Z2,3 DUP(?) CSEG ENDS END 程序输入完毕,以EXAM2.ASM为文件名存入磁盘,进行下一步操作。 【步骤二】 对源程序EXAM2.ASM进行汇编,生成目标程序EXAM2.OBJ。 操作如下: C:>\MASM EXAM2;↙ 屏幕显示如下信息: Microsoft (R) Macro Assembler Version 5.00 Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved. 50554 + 449926 Bytes symbol space free 0 Warning Errors 0 Severe Errors 汇编通过,没有错误信息产生,进行下一步操作。 【步骤三】 对目标程序EXAM2.OBJ进行连接,生成执行程序EXAM2.EXE。 操作如下: C:>\LINK EXAM2;↙ 屏幕显示如下信息:

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 ; 定义数据段 . .

第4章 伪指令与源程序格式

第4章伪指令与源程序格式 汇编语言程序的语句有三种,即指令、伪指令,还可以有宏指令。关于宏指令将在第7章介绍,本章介绍部分常用的伪指令(又称伪操作)。这些伪指令在程序中是必不可少的,主要用来定义数据变量和程序结构。本章还介绍指令中的操作数和运算符,通过本章的学习,可以学会使用简便而有效率的指令格式,正确定义数据变量,熟知源程序的格式,编写完整的汇编语言程序。 4.1 伪指令 伪指令和指令不同的是,指令是在程序运行期间由计算机的CPU来执行的,而伪指令是在汇编程序对源程序进行汇编期间由汇编程序处理的操作。它们可以完成如定义数据、定义程序模式、分配存储区、指示程序结束、处理器选择等功能。这里只介绍一些常用的伪指令。有些和宏汇编有关的伪指令在介绍宏汇编时再作说明。 4.1.1 处理机选择伪指令 由于80x86的所有处理器都支持8086指令系统,但每一种高档的机型又都增加了一些新的指令。为了能使用这些新增指令,在编写程序时要用处理机选择伪指令对所用的处理机作出选择,也就是说,要告诉汇编程序应该选择哪一种指令系统。 处理机选择伪指令有以下几种: .8086 选择8086指令系统 .286 选择8O286指令系统 .286P 选择保护方式下的80286指令系统 .386 选择80386指令系统 .386P 选择保护方式下的8O386指令系统 .486 选择80486指令系统 .486P 选择保护方式下的8O486指令系统 .586 选择Pentium指令系统 .586P 选择保护方式下的Pentium指令系统 指令中的点‘.’是需要的。这类伪指令一般放在整个程序的最前面。如不给出,则汇编程序认为其默认选择是8086指令系统。 4.1.2 段定义伪指令 我们结合第2章已介绍的程序实例2来看段定义,注意有分号的注释行,程序如下:例4.1 data segment ;定义数据段data string db ‘hello,world!$’ data ends code segment ;定义代码段code assume cs:code,ds:data ;指定段寄存器和段的关系 start:mov ax,data ;对ds赋data段基地址 mov ds,ax mov dx,offset string mov ah,9 int 21h mov ah,4ch

PIC16系列_单片机常用伪指令(汇编)

PIC 单片机端口电平变化中断使用必须注意的问题 PICC18使用说明 PIC 单片机常用伪指令 PIC单片机2009-02-19 11:16:40 阅读8 评论0 字号:大中小订阅 3.2.3 MPASM 的伪指令 我们在第一章中已经详细介绍了中档PIC 单片机的35 条指令,源程序的编写主要就是用这些基本的指令实现你的控制任务。但为了增加源程序的可读性和可维护性,我们引入了伪指令的概念。伪指令本身不会产生可执行的汇编指令,但它们可以帮组“管理”你编写的程序,其实用性和必要性绝不亚于35 条正真的汇编指令。我们在此着重介绍最常用的几种 伪指令。 #include 或include #include 伪指令的作用是把另外一个文件的内容全部包含复制到本伪指令所在的位置。 被包含复制的文件可以是任何形式的文本文件,当然文件中的内容和语法结构必须是MPASM 能够识别的。最经常被“include”的是针对PIC 单片机内部特殊功能寄存器定义的包含头文件,在MPLAB 安装后它们全部放在路径“ C:\Program Files\MPLAB IDE\MCHIP_Tools”下,每一个型号的PIC 单片机都有一个对应的预定义包含头文件,扩展名是“.inc”。除了一些符号预定义文件,你也可以把现有的其它程序文件作为一个代码模块直接“包含”进来作为自己程序的一部分。见例3-01。 #include ;把预定义的PIC16F877A 寄存器符号包含到此处 #include ”math.asm” ;把现有的程序文件包含进来作为自己代码的一部分 例3-01 请注意被包含文件的引用方式。一种是<>尖括号引用,这种引用意味着让编译器去默认的路径下寻找该文件,MPASM 默认的寄存器预定义文件存放路径即为上面提及的MPLAB 安装后的目录;另一种是””双引号引用,这种引用方式的意思是指示编译器从引号中指定的全程文件路径下寻找该文件。例3-01 中”math.asm”没有指定路径,即意味着在当前项目路径下寻找math.asm 文件。如果编译器找不到被包含的文件,将会有错误信息告 知。 请在你的源程序中尽量用MPLAB 标准头文件定义的寄存器符号。一来这些被定义的寄存器符号和芯片数据手册上的描述一一对应,理解起来即直观又容易;二来如果用你自己定义符号就缺乏一个大家能一起交流的标准平台,其他人要解读你的代码时将费时费力。故例3-01 中的首行#include 包含引用伪指令可以说是PIC 单片机程序编写时的标准必备。

指令周期机器周期等各种周期介绍

时钟周期: 时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。 在一个时钟周期内,CPU仅完成一个最基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250us。由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来)。显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快。 8051单片机把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。 机器周期: 在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。 8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。 例如外接24M晶振的单片机,他的一个机器周期=12/24M 秒; 指令周期: 执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期也不同。 对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。 通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。 总线周期: 由于存贮器和I/O端口是挂接在总线上的,CPU对存贮器和I/O接口的访问,是通过总线实现的。通常把CPU通过总线对微处理器外部(存贮器或I/O接口)进行一次访问所需时间称为一个总线周期。 总结一下,时钟周期是最小单位,机器周期需要1个或多个时钟周期,指令周期需要1个或多个机器周期;机器周期指的是完成一个基本操作的时间,这个基本操作有时可能包含总线读写,因而包含总线周期,但是有时可能与总线读写无关,所以,并无明确的相互包含的关系。

微机常用指令伪指令_2012

常用指令、常用伪指令 一、常用指令: (一)数据传送指令 MOV d,s PUSH s POP d LEA d,s IN 累加器,端口 OUT 端口,累加器 (二)算术运算指令 ADD d,s ADC d,s INC d SUB d,s SBB d,s DEC d CMP d,s MUL s IMUL s DIV s IDIV s (三)逻辑运算和移位循环指令 AND d,s OR d,s XOR d,s NOT d TEST d,s SAL d,count SAR d,count SHL d,count SHR d,count ROL d,count ROR d,count RCL d,count RCR d,count (四)串操作指令 MOVSB / MOVSW CMPSB /CMPSW SCASB / SCASW

LODSB / LODSW STOSB / STOSW 重复前缀:REP,REPE/REPZ,REPNE/REPNZ (五)程序控制指令 JMP 目标标号 CALL 过程名 RET JA 目标标号 JAE 目标标号 JB 目标标号 JBE 目标标号 JG 目标标号 JGE 目标标号 JL 目标标号 JLE 目标标号 JC 目标标号 JNC 目标标号 JE/JZ 目标标号 JNE/JNZ 目标标号 LOOP 目标标号 INT 中断类型 IRET (六)处理器控制指令 CLD STD CLI STI HLT NOP 二、常用伪指令 1、数据定义 DB(定义字节);DW(定义字);DD(定义双字); 重复算符DUP; DB ’字符串’ DW <地址表达式>、DD <地址表达式> (教材P139例4.25)2、符号定义 名字EQU <表达式> 3、段定义 段名SEGMENT ……

伪指令

1、ASSERT :DEF:ENDIAN_CHANGE ASSERT 是断言伪指令,语法是:ASSERT +逻辑表达式 def 是逻辑伪操作符,格式为::DEF:label,作用是:判断label是否定义过ARM 伪指令 ARM 汇编程序的由机器指令,伪指令和宏指令组成。伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处理。在前面的指令集章节中,我们已经接触了几条常用到的伪指令,如ADR 、ADRL、LDR、NOP 等,把它们和指令集一起介绍是因为它们在汇编时会被合适的机器指令代替,实现真正机器指令操作。宏是一段独立的程序代码,它是通过伪指令定义的,在程序中使用宏指令即可调用宏。 当程序被汇编时,汇编程序将对每个调用进行展开,用宏定义取代源程序中的宏指令。 1 符号定义伪指令 符号定义伪指令用于定义ARM 汇编程序的变量,对变量进行赋值以及定义寄存器名称,该类伪指令如下: 全局变量声明:GBLA、GBLL 和GBLS。 局部变量声明:LCLA、LCLL 和LCLS。 变量赋值: SETA、SETL 和SETS。 为一个通用寄存器列表定义名称:RLIST。 为一个协处理器的寄存器定义名称:CN。 为一个协处理定义名称: CP。 为一个VFP 寄存器定义名称:DN 和SN。 为一个FPA 浮点寄存器定义名称:FN。 GBLA、GBLL、GBLS 全局变量声明伪指令。 GBLA 伪指令用于声明一个全局的算术变量,并将其初始化为0。 GBLL 伪指令用于声明一个全局的逻辑变量,并将其初始化为{FALSE}。

GBLS 伪指令用于声明一个全局的字符串变量,并将其初始化为空字符串“”。 伪指令格式: GBLA variable GBLL variable GBLS variable 其中:variable 定义的全局变量名,在其作用范围内必须惟一。全局变量的作用范围为包含该变量的源程序。 伪指令应用举例如下: GBLL codedbg ;声明一个全局逻辑变量 codebg SETL {TRUE} ;设置变量为{TRUE} … LCLA、LCLL、LCLS 局部变量声明伪指令,用于宏定义的体中。 LCLA 伪指令用于声明一个局部的算术变量,并将其初始化为0。 LCLL 伪指令用于声明一个局部的逻辑变量,并将其初始化为{FALSE}。 LCLS 伪指令用于声明一个局部的字符串变量,并将其初始化为空字符串“”。 伪指令格式: LCLA variable LCLL variable LCLS variable 其中:variable 定义的局部变量名。在其作用范围内必须惟一。局部变量的作用范围为包含该局部变量只能在宏中进行声明及使用。 伪指令应用举例如下: MACRO ;声明一个宏 SENDDAT $dat ;宏的原型 LCLA bitno ;声明一个局部算术变量 … bitno SETA 8 ;设置变量值为8 … MEND

MPASM 的伪指令

MPASM 的伪指令 我们在第一章中已经详细介绍了中档PIC 单片机的35 条指令,源程序的编写主要就是 用这些基本的指令实现你的控制任务。但为了增加源程序的可读性和可维护性,我们引入了伪指令的概念。伪指令本身不会产生可执行的汇编指令,但它们可以帮组“管理”你编写的程序,其实用性和必要性绝不亚于35 条正真的汇编指令。我们在此着重介绍最常用的几种伪指令。 z #i nclude 或include #i nclude 伪指令的作用是把另外一个文件的内容全部包含复制到本伪指令所在的位置。被包含复制的文件可以是任何形式的文本文件,当然文件中的内容和语法结构必须是MPASM 能够识别的。最经常被“include”的是针对PIC 单片机内部特殊功能寄存器定义的 包含头文件,在MPLAB 安装后它们全部放在路径“C:\Program Files\MPLAB IDE\MCHIP_Tools”下,每一个型号的PIC 单片机都有一个对应的预定义包含头文件,扩展 名是“.inc”。除了一些符号预定义文件,你也可以把现有的其它程序文件作为一个代码模块 直接“包含”进来作为自己程序的一部分。见例3-01。 #i nclude ;把预定义的PIC16F877A 寄存器符号包含到此处 #i nclude ”math.asm”;把现有的程序文件包含进来作为自己代码的一部分 例3-01 请注意被包含文件的引用方式。一种是<>尖括号引用,这种引用意味着让编译器去默 认的路径下寻找该文件,MPASM 默认的寄存器预定义文件存放路径即为上面提及的MPLAB 安装后的目录;另一种是””双引号引用,这种引用方式的意思是指示编译器从引号 中指定的全程文件路径下寻找该文件。例3-01 中”math.asm”没有指定路径,即意味着在 当前项目路径下寻找math.asm 文件。如果编译器找不到被包含的文件,将会有错误信息告 知。 请在你的源程序中尽量用MPLAB 标准头文件定义的寄存器符号。一来这些被定义的寄 存器符号和芯片数据手册上的描述一一对应,理解起来即直观又容易;二来如果用你自己定义符号就缺乏一个大家能一起交流的标准平台,其他人要解读你的代码时将费时费力。故例3-01 中的首行#i nclude 包含引用伪指令可以说是PIC 单片机程序编写时的标准必备。z list list 伪指令可以设定程序编译时的一些信息,例如所选单片机的型号,编译时选择的缺 省数制等。例如: list p=16f877a, r=DEC ;单片机型号为PIC16F877A,无特别指明的数字为十进制数 例3-02 如果程序开发时使用项目管理的模式,则所有list 伪指令可以描述的参数项都可以在项 目的设定选项中通过对话框的形式设定并保存。在此只需对list 伪指令稍作了解即可。 z __config 此伪指令的重要作用是把芯片的配置字设定在源程序中,请参阅2.5 节的详细说明。建 议大家尽量用此伪指令把芯片的配置字写在程序中。 z __idlocs

ARM汇编指令 对比记忆 (整理)

参考资料: 1. Richard Blum,Professional Assembly Language 2. GNU ARM 汇编快速入门,https://www.360docs.net/doc/5c2929870.html,/u/31996/showart.php?id=326146 3. ARM GNU 汇编伪指令简介,https://www.360docs.net/doc/5c2929870.html,/jb8164/archive/2008/01/22/41661.aspx 4. GNU汇编使用经验,https://www.360docs.net/doc/5c2929870.html,/u1/37614/showart_39009 5.html 5. GNU的编译器和开发工具,https://www.360docs.net/doc/5c2929870.html,/blog-htm-do-showone-uid-34335-itemid-81387-type-blog.html 6. 用GNU工具开发基于ARM的嵌入式系统,https://www.360docs.net/doc/5c2929870.html,/liren0@126/blog/static/32897598200821211144696/ 7. objcopy命令介绍,https://www.360docs.net/doc/5c2929870.html,/junhua198310/archive/2007/06/27/1669545.aspx 从网上找到一些关于ARM伪指令的资料,现整理如下: 一. Linux汇编行结构 任何汇编行都是如下结构: [:] [} @ comment [:] [} @ 注释 Linux ARM 汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要在一行的开始。 【例1】定义一个"add"的函数,返回两个参数的和。 .section .text, “x” .global add @ give the symbol add external linkage add: ADD r0, r0, r1 @ add input arguments MOV pc, lr @ return from subroutine @ end of program 1. LDR LDR R0, =0X3FF5000 ;伪指令,把0X3FF5000这个地址送给R0 LDR R0, 0XFF ; 把立即数0xff送给R0 LDR R0, =&FF ; &相当于0X BIC R0, R0, #%1011 ;.#表示立即数,%表示二进制 LDR R1, =0x3ff5000 ;伪指令 R1=0X3FF5000 LDR R1, 0x3ff5000 ;存储器访问指令 R1= [0x3ff5000] 2. adr与ldr比较 adr r0, InitSystem ; ldr r1, =InitSystem ; 伪指令adr r0,InitSystem 编译时汇编成:sub r0,PC,#offset to InitSystem

汇编语言 计算机

汇编语言图册 汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言,作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如MASM,TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。现在的汇编环境已经如此高级,即使全部用汇编语言来编写windows的应用程序也是可行的,但这不是汇编语言的长处。汇编语言的长处在于编写高效且需要对机器硬件精确控制的程序。[1] 符号语言 在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。因此汇编语言亦称为符号语言。 汇编 使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编语言编译器把汇编程序翻译成机器语言的过程称为汇编。 不能通用

汇编语言比机器语言易于读写、调试和修改,同时具有机器语言全部优点。但在编写复杂程序时,相对高级语言代码量较大,而且汇编语言依赖于具体的处理器体系结构,不能通用,因此不能直接在不同处理器体系结构之间移植。 汇编语言是直接面向处理器(Processor)的程序设计语言。处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。 在电路中,每条机器指令都表现为一组电信号,通过一排导线进入处理器。这些电信号有的呈高电平,有的呈低电平,哪些为高,哪些为低,取决于不同的机器指令。如果把高电平记为“1”,低电平记为“0”,那么,不同的机器指令将表现为不同的二进制序列,由于它们的无规律性,这就使得机器指令难以理解、书写和记忆。 人类最容易接受自己每天都使用的自然语言。为了使机器指令的书写和理解变得容易,需要借鉴自然语言的优点,为此就引入了汇编语言。汇编语言使用符号来代表不同的机器指令,而这些符号非常接近于自然语言的要素。基本上,汇编语言里的每一条指令,都对应着处理器的一条机器指令。 汇编语言包括两个部分:语法部分和汇编器。语法部分提供与机器指令相对应的助记符,方便指令的书写和阅读。当然,汇编语言的符号可以被人类接受,但不能被处理器识别,为此,还要由汇编语言编译器将这些助记符转换成机器指令。 根据应用领域的不同,处理器的种类繁多,比如用于工业控制和嵌入式计算的Z80、MC6800 0和MCS-51、广泛应用于个人计算机的INTELx86系列,以及基于ARM体系结构的处理器,包括苹果公司在内的大企业都是ARM的客户。事实上,今天的ARM是最受欢迎的32位嵌入式处理器,而且,今天的ARM处理器比INTEL奔腾系列卖得还多,基本上是3:1的比例。不同的处理器有不同的指令集。正是因为这个原因,每一种处理器都会有自己专属的汇编语言语法规则和编译器。即使是同一种类型的处理器,也可能拥有不同的汇编语言编译器。一个明显的例子是INTEL x86系列的处理器,围绕它就开发出好多种编译器来,如MASM、NAS M、FASM、TASM、GAS和AT&T等。而且,每一种编译器,都使用不同的语法。 优点 汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:

常用汇编指令表

1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里) XLAT 字节查表转换. —— BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即 0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL ) 2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器) 输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时, 其范围是0-65535. 3. 目的地址传送指令. LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI.

相关文档
最新文档