- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第章程序开发
; 汇编语言与的混合编程通常有以下几种方式:
在代码中嵌入汇编指令;
在汇编程序和的程序之间进行变量的互访;
汇编程序、程序间的相互调用。;在程序中嵌入汇编程序,可以实现一些高级语言所没有的功能,提高程序执行效率。
编译器的内嵌汇编器支持指令集,编译器的内嵌汇编器支持指令集。
. 内嵌汇编的语法
{ 指令[;指令] /*注释*/
……
[指令]
} ; () 操作数
内嵌的汇编指令中作为操作数的寄存器和常量可以是表达式。
这些表达式可以是、或类型,而且这些表达式都是作为无符号数进行操作。
若需要有符号数,用户需要自己处理与符号有关的操作。
编译器将会计算这些表达式的值,并为其分配寄存器。 ;() 物理寄存器
内嵌汇编中使用物理寄存器有以下限制:
不能直接向寄存器赋值,程序跳转只能使用或指令实现。
使用物理寄存器的指令中,不要使用过于复杂的表达式。因为表达式过于复杂时,将会需要较多的物理寄存器。这些寄存器可能与指令中的物理寄存器在使用时发生冲突。
编译器可能会使用或存放编译的中间结果。在计算表达式的值时可能会将寄存器、和用于子程序调用。因此,在内嵌的汇编指令中,不要将这些寄存器同时指定为指令中的物理存储器。
通常内嵌的汇编指令中不要指定物理寄存器,因为这可能会影响编译器分配寄存器,进而影响代码的效率。;() 常量。在内嵌汇编指令中,常量前面的“”可以省略。
() 指令展开。内嵌的汇编指令中,如果包含常量操作数,则该指令有可能被内嵌汇编器展开成几条指令。
() 标号。程序中的标号可以被内嵌的汇编指令使用。但是只有指令可以使用程序中的标号,而指令则不能使用。
() 内存单元的分配。所有的内存分配均由编译器完成,分配的内存单元通过变量供内嵌汇编器使用。内嵌汇编器不支持内嵌汇编程序中用于内存分配的伪指令。 ; 内嵌汇编器与汇编器的差异;()必须小心使用物理寄存器.
如、、和中的、、和标志位,因为计算汇编代码中的表达式时,可能会使用这些物理寄存器,并会修改、、和 标志位。
例如:
{
,
,,
}
计算时会被修改。内嵌汇编器探测到隐含的寄存器冲突就会报错。;()不要使用寄存器代替变量。
尽管有时寄存器明显对应某个变量,但也不能直接使用寄存器代替变量。
例如:
( ) 存放在中
{
{
,, 发生寄存器冲
突,实际上的值并没有变化
}
();
} ;尽管根据编译器的编译规则似乎可以确定对应,但这样的代码会使内嵌汇编器认为发生了寄存器冲突。
用其它寄存器代替存放参数,使得该函数将原封不动地返回。
这段代码的正确写法如下:
( )
{
{
,,
}
();
};() 使用内嵌式汇编无需保存和恢复寄存器。
事实上,除了和寄存器,对物理寄存器先读后写都会引起汇编器报错。
例如:
( )
{
{
!,{} 保存。先读后写,汇
编出错
,,
,,
!,{}
}
();
} ;()和指令的寄存器列表中只允许使用物理寄存器。
内嵌汇编可以修改处理器模式、协处理器模式以及、、等寄存器。但是编译器在编译时并不???解这些变化,因此必须保证在执行代码前恢复相应被修改的处理器模式。;() 汇编语言中的“,”号作为操作数分隔符。
如果有表达式作为操作数,若表达式中包含有“,”,则必须使用符号“(”和“)”将其归约为一个汇编操作数。
例如:
{
,,((),) “(),”为一个带有“,”
的表达式
} ;例
()
{
( !\);
;
};例 使能/禁能中断
()
{
;
嵌入汇编代码
{
, 读取的值
}
};
文档评论(0)