微机原理伪指令大全及在C语言中的结合应用举例
伪指令又称汇编程序控制译码指令。“伪”字体现在汇编时伪指令不产生机器指令代码,不影响程序的执行, 仅产生供汇编用的某些命令, 在汇编时执行某些特殊操作。但伪指令使用错误将直接使源程序无法汇编和产生语法错误及目的地址找不到等问题。所以正确理解单片机中的伪指令对于学习好、应用好单片机是十分重要的。伪指令按照其功能可以四类:目标文件伪指令,控制伪指令,列表伪指令,数据伪指令。以下是整理得出的常用伪指令及其用法:
1、EQU(Equate)
一般格式为: 标号: EQU 操作数
指令功能为将操作数赋予标号,两边的值完全相等。使用EQU伪指令给一个标号赋值后,此标号在整个源文件中值固定
AREA: EQU 1000H ;将标号AREA赋值为1000H
2、ORG(Origin)
一般格式为: ORG xxxxH(绝对地址或标号)
XxxxH决定此语句后第一条指令(或数据)的地址。该段源程序或数据被连续存放在此后的地址内,直到下一条ORG指令为止。
ORG 8000H ;此后目标代码存储在存储器中以0x8000h开始的地址空间中。
ADD R1, #1
MOV R2, #2
3、DB(Define Byte)
一般格式为: 标号: DB 字节常数或字符或表达式
标号字段可有可无,字节常数或字符是指一个字节数据。此伪指令的功能是把字节常数或字节串存放至内存连续的地址空间中。
ORG 8000H
DATA1: DB 43H,09H,08H
DATA2: DB 07H
伪指令DB指定了43H,09H,08H 顺序存放在8000H开始的存储单元中,DATA2中的07H紧挨着DATA1的地址空间存放,即07H存放在8003H单元中。
注:DW(Define Word)指令定义与DB类似,区别在于DW定义一个字,DB定义一个字节。
4、END
一般格式为: 标号: END 地址或标号
地址或标号可以忽略。此伪指令用于指示汇编语言程序段结束。因此一个源程序中仅有一个END,且一般放在程序最后。若END放在程序中间,则END后面的语句将不再被汇编。
5、AREA
一般格式为: 标号 sectionname{,attr}{,attr}……
Sectionname指定节的名称。节是不可分的已命名独立代码模块或数据模块,由连接器进行处理。
Attr则是一个或多个用逗号分隔的节的属性。属性有多种,比如:
ALIGN=expression。默认条件下节以四字节边界对齐。Expression取值范围为0-31.表征的对齐边界是2的expression平方。
CODE 包含机器指令。默认值为READONLY
DATA 包含数据但不包含指令。默认值为READWRITE
READONLY 指示此节只读。代码区域默认值。
READWRITE 指示此节可读可写。数据区域默认值。
AREA Example, DATA, READWRITE
;data
以上代码定义了名为Example的可读写数据节。
6、PUBLIC
一般格式为: PUBLIC 标识符1,标识符2……
在开发较为复杂的应用程序时,其执行文件的生成一般由多个目标文件链接而成。多个目标文件之间一般存在数据交互,汇编语言中通过伪指令PUBLIC及EXTRN来解决模块之间的联系。PUBLIC用来说明当前模块中可被其他模块所引用的公共标识符。
PUBLIC _STARTUP
声明标识符_STARTUP可被其他模块所引用。
7、EXTRN或EXTERN
一般格式为: EXTRN 标识符1:类型1,标识符2:类型2…….
表明标识符1、2是外部标识符,其已经在其他模块中被定义为类型1、类型2等。在一个模块中,可用多条EXTRN来说明本模块中所引用的外部标识符。实质为汇编器提供一个并未在当前汇编文件中定义的名称。
注:EXTRN所声明的标识符必须在其定义的模块中被PUBLIC声明为公共标识符,且声明的标识符类型需与该标识符定义类型一致。
类似:EXPORT或GLOBAL
声明一个符号,链接器可以使用此符号解析不同对象和库文件中的符号引用。即,可使其他文件中的代码能够访问当前文件中的符号。
8、PROC
一般格式为: <过程名> PROC [类型]
此指令为过程定义指令。过程即子程序,一个过程可以被其他程序调用(CALL指令)。
<过程名> PROC [类型]
ENDP
注:PROC和ENDP必须成对出现。
9、SPACE
一般格式为: 标号 SPACE 表达式
此指令用于分配一片连续的存储区域并初始化为0。表达式为要分配的字节数。SPACE可用“%”来代替。
DataSpace SPACE 1000 ;分配连续1000个字节的存储单元DataSpace并初始化为0。
10、ENTRY
此指令用于声明程序的入口点。一个程序至少有一个入口点。
AREA TEST, CODE, READONLY
ENTRY ;程序入口点。
11、PRESERVE8
一般格式为: PRESERVE8 {bool}
PRESERVE8指令指定当前文件需保持堆栈八字节对齐方式。其通过设置PRES8编译属性通知连接器。
PRESERVE8 ;保持代码堆栈八字节对齐。
PRESERVE8 {FALSE} ;不保持代码堆栈八字节对齐。
12、CODE16、CODE32
一般格式为: CODE16(或CODE32)
CODE16通知编译器,其后的指令序列为16位的Thumb指令。
CODE32通知编译器,其后的指令序列为32位的ARM指令。
在实用ARM指令和Thumb指令混合编程的代码里,可使用这两天指令进行切换。注:指令只能通知编译器其后的指令类型,并不能对处理器进行状态的切换。
13、IMPORT
此指令类似于EXTERN。用于通知编译器即将使用的标号在其他源文件中定义。无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。
一般格式为: IMPORT 标号 {[WEAK]}
标号在程序中区分大小写,[WEAK]表示当所有源文件中均找不到此标号时,编译器也不会显示错误信息。
AREA INIT, CODE, READONLY
IMPORT Main ;通知编译器当前文件要引用标号Main,但其定义在其他源文件中。
END
总结:
伪指令的应用十分广泛,并且使用起来并不复杂,简化了编程大任务,增加了程序的可阅读性,减小了检查程序的难度。
与C语言的结合实例:
C语言是目前非常流行的一种编程语言,除具有高级语言使用方便灵活、数据处理能力强、编程简单等优点外:还可实现汇编语言的大部分功能,如可直接对硬件进行操作、生成的目标代码质量较高等,而汇编语言没有高级语言要占用较大的存储空间和较长的运行时间等缺点,它的运行速度快是高级语言所不能比拟的,可以说高级语言与汇编语言各有千秋。目前c语言与汇编语言的混合编程在诸如对硬件的直接操作、中断处理、快速执行等场合有着广泛的应用。
C语言可以调用汇编子程序和汇编语言中定义的变量。编译后的目标文件自动地在函数名和变量名前加一个下划线,所以在汇编语言中调用C语言的函数和变量时,应在函数名和变量名前加一下划线。在汇编语言程序开始部分,应对调用的函数和变量用EXTERN加以说明。
#include<stdio.h>
#include<stdlib.h>
Short Add( short x, short y);
int multiply(short x, short y);
short substract(short x, short y);
void division(short x, short y);
short recycle(short x);
void main()
{//请注意:short int 短整型的格式控制符是%hdshort a = 0;short b = 0;short c = 0;printf("Please input 2 numbers:");scanf_s("%hd%hd",&a,&b);printf("%hd + %hd=%hd\n", a, b, Add(a, b));printf("%hd * %hd=%hd\n",a,b,multiply(a,b));printf("%d - %d=%d\n", a, b, substract(a, b));division(a,b);printf("Please input 1 numbers:");scanf_s("%hd", &c);printf("1+2+...+%hd=%hd\n", c,recycle(c));//recycle(100);
}
//实现一个循环,1+2+...100.形参是一个短整型,返回一个int整型
short recycle(short x)
{short sum = 0;_asm{mov ax, 0mov si, 0mov cx, x;//循环次数next:inc siadd ax,sidec cxjnz nextmov sum,ax }return sum;
}
//实现两数相除,要处理除0中断
void division(short x, short y)
{short shang = 0,yu=0;__asm{mov dx, 0mov ax, xcmp y,0jz next ;除数是0,转处理div y;//除以十六位数据mov shang, ax;//商在ax中mov yu, dx;//余数在dx}printf("%d / %d=%d...%d\n", x, y, shang, yu);return 0;
next:printf("warning!除数是0!\n");//;子函数返回}
//实现两数相减
short substract(short x, short y)
{short z = 0;__asm{mov ax,xsub ax,ymov z,ax}return z;
}
//实现两数相乘,16位short数据,返回值32位int
int multiply(short x, short y)
{int result = 0;__asm{mov cl, 16mov dx,0mov ax, xmul ypush ax; 保存低16位mov ax, dx;shl eax, cl; 低16位移到高16位pop ax;为低16位赋值mov result,eax}return result;
}
//下面是用汇编实现的子函数:两数相加
short Add( short x, short y)
{short sum = 0;__asm//注意是两个下划线{mov ax, x;add ax,y;mov sum, ax;}return sum;//返回值
}
微机原理伪指令大全及在C语言中的结合应用举例相关推荐
- 微机原理与接口技术模拟试题微型计算机中主要包括,合肥工业大学微机原理与接口技术模拟试题...
合肥工业大学微机原理与接口技术模拟试题 (48页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 合肥工业大学微机原理与接口技术模拟试题 微 ...
- C语言中函数的定义举例说明,C语言函数的定义与使用
<C语言函数的定义与使用>由会员分享,可在线阅读,更多相关<C语言函数的定义与使用(5页珍藏版)>请在人人文库网上搜索. 1.讲义十三 C语言函数的定义与使用一.函数的定义:1 ...
- linux汇编伪指令大全,ARM汇编伪指令
分类: LINUX 2009-10-21 16:39:09 ARM 汇编程序的由机器指令,伪指令和宏指令组成.伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处 ...
- C语言的变量和汇编中的伪指令,伪指令 尤其EQU DW DB(微机和单片机中的作用稍微不同,但是规则机制相同)微机原理中的汇编指令和伪指令是标准的,单片机的指令和伪指令是在微机标准版基础上修改的版
微机原理中表明 变量用伪指令DW,DB 单片机中的伪指令EQU C语言中的变量来源与汇编的伪指令(微机和单片机中的作用稍微不同,但是规则机制相同)微机原理中的汇编指令和伪指令是标准的,单片机的指令和伪 ...
- 用汇编语言与C语言实验其他排序,微机原理实验报告冒泡排序
微机原理实验报告冒泡排序 五.运行结果 (1)对300,250,280,240,260五个数进行冒泡排序,运行结果如下: (2)对-1,2,54,-38,43五个数进行冒泡排序,运行结果如下 (1)当 ...
- c语言p1口亮灯,单片机实验开发与微机原理接口技术综合实验装置,上海求育
原标题:单片机实验开发与微机原理接口技术综合实验装置,上海求育 上海求育QY-JXSY43单片机微机开发实验箱 上海求育QY-JXSY43单片机微机开发实验箱是集51.8088二大系列CPU于一体的二 ...
- 考研复试C语言微机原理,放福利,初试数模电,复试微机原理和C的进来看看
本帖最后由 99terry 于 2013-4-17 15:34 编辑 我10年毕业的,工作两年多,去年7月份辞职,8月份开始备考,本科学的焊接技术与工程,跨考电工理论,二本出生,好在年纪不大,90年的 ...
- 键盘与显示实验程序c语言,16位微机原理,32位微机原理接口教学实验系统,64位微机原理接口实训...
TW-X38 16.32位微机原理与接口教学实验系统 一.硬件概述 TW-X38现代32位微机原理与接口技术教学实验系统的升级换代产品,采用Intel i386EX嵌入式微处理器作为系统核心,全面支持 ...
- 冒泡排序法c语言实验报告,微机原理实验报告-冒泡排序
<微机原理实验报告-冒泡排序>由会员分享,可在线阅读,更多相关<微机原理实验报告-冒泡排序(12页珍藏版)>请在人人文库网上搜索. 1.一.实验目的(1)学习汇编语言循环结构语 ...
最新文章
- Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity
- vue踩坑- 报错npm ERR! cb() never called!
- [APP] Android 开发笔记 001-环境搭建与命令行创建项目
- 参加51CTO组织的2013云计算架构师大会
- 格式说明_ISO11784/85 FDX-B动物芯片格式写码说明
- 使用Flash Pro CC 输出动画--html5-canvas
- 「双11」哪些东西值得买?超值大礼包四舍五入等于不要钱
- 旧服务器如何虚拟化,4个步骤教你如何重复利用旧虚拟化主机
- Java NIO 下
- 各种数据库的分页查询
- 垃圾代码和优质代码的区别?
- 用 Bootstrap 进行参数估计
- (转载)file_get_contents(php://input)
- w7计算机无法管理员权限设置,win7管理员权限设置技巧:教你win7管理员权限设置是灰色的处理方法...
- Android中实现双指缩放的功能
- python lncrna_超简便的国产lncRNA预测工具LGC
- 用计算机数字技术制作的电影是,计算机数字技术为电影带来的空前发展.doc
- 如何利用PDF转换器将WPS转换成word
- angular的 #
- 智加助力解放完成“自动变道”国标验证,唯一量产自动驾驶重卡过考
热门文章
- cross-env解决跨平台设置NODE_ENV的问题
- arm linux 指纹识别,基于ARM—Linux指纹识别系统的设计.pdf
- 人脸识别门禁系统:基于Android的人脸识别门禁系统 毕业设计完整代码详细教程
- 手残转化了动态磁盘后如何转化回基本磁盘
- 华为机试牛客网,C语言实现
- 凯文凯利在武汉的演讲:你,已经被12个趋势包围
- AZ-104认证考试攻略
- 单片机好还是plc好?plc和单片机哪个工资高?
- 云之梦php免费教学视频下载_[PHP] 云知梦2017最新PHP工程师全套视频教程 laravel框架版...
- 什么是网络爬虫?它是如何工作的以及如何自动抓取