- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
课题_第6讲 由机器语言到高级语言---程序编写编译研讨
第6讲 由机器语言到高级语言---程序编写编译
6.1混合编程
6.2 C/C++的嵌入式汇编
6.3 用C/C++调用汇编
6.1混合编程
混合编程即由高级语言来调用或嵌入汇编语言子程序,或用汇编语言调用或嵌入高级语言子程序。汇编程序常以过程的形式同高级语言(如C/C++、BASIC、PASCAL、DELPHI等)一起使用。
6.1混合编程
高级语言和汇编语言连接很容易,因为在高级语言编译后生产的编译程序是一个.OBJ的文件,这与汇编程序输出的目标文件一样都是机器语言程序。那么我们就可以利用link将高级语言程序产生的.OBJ程序与汇编程序产生的.OBJ程序连接起来,形成一个.EXE的可执行文件。
6.1混合编程
高级语言与汇编语言的连接应注意下面几个问题:
1、两种语言之间的控制传输问题
2、参数的传递
3、存储分配问题
6.2 C/C++的嵌入式汇编
在C/C++与汇编语言的混合编程过程中,C/C++调用汇编代码常有两种方法:
一、直接在C/C++程序中嵌入汇编语句;
二、C/C++调用汇编语言子程序。
6.2 C/C++的嵌入式汇编
在C或者C++中进行嵌入式汇编需要注意以下要点:
嵌入式汇编语言代码支持INTEL 80X86 CPU的全部32位指令系统,但是不能使用伪指令与宏指令语句,也不能使用结构(STRUCT)和记录(RECORD);
嵌入式汇编语言可以使用C++程序中标识符,包括标号、变量、函数名、常量、宏、类型名、结构和联合的成员以及类对象的公有(PUBLIC)成员变量等;
嵌入式汇编语言代码中可以使用汇编语言格式的常数(131AH),也可以使用C++格式的常数(0X131A);
嵌入式汇编语言不能使用C++语言的运算符;
嵌入式汇编语言代码中的转移指令和C++中的GOTO语句都能跳转到汇编语言或者C++定义的标号;
嵌入式汇编语言定义的函数返回值的传递方法与预模块调用汇编中汇编语言程序返回值的传递方法相同,在C++程序编译时会产生“ NO RETURN VALUE”警告,可以使用#PRAGMA WARNING(DISABLE:4035)预编译语句禁止该警告。
7.2 C/C++的嵌入式汇编
7.2.1在C/C++程序中嵌入汇编语句
7.2.2在嵌入式汇编中访问C/C++的数据
7.2.3汇编语言程序段编写C函数
7.2.4汇编程序调用C/C++函数
7.2.1在C/C++程序中嵌入汇编语句
第一种方式
7.2.1在C/C++程序中嵌入汇编语句
_ASM 操作码 操作数 ;或换行
操作码是处理器指令或若干伪指令;操作数是操作码可接受的数据。内嵌的汇编语句可以用分号“;”结束,也可以用换行符结束;一行中可以有多个汇编语句,相互间用分号分隔,但不能跨行书写。嵌入汇编语句的分号不是注释的开始;要对语句注释,应使用C的注释,如 / * … * /。
7.2.1在C/C++程序中嵌入汇编语句
第二种方式,_ASM{汇编程序段}采用花括号的汇编语言程序段形式。
_ASM {汇编程序段} 如下所示:
_ASM {
MOV AX, 15H
MOV CX, 9H
ADD AX, CX
}
7.2.1在C/C++程序中嵌入汇编语句
包含在括号中的汇编代码必须按照特定的格式:
1)指令必须括在引号里。
2)如果包含的指令超过一条,那么必须使用新行字符分隔汇编语言代码的每一行。通常,还包含制表符帮助缩进汇编语言代码,使代码行更容易阅读。
例:显示1 到1000 中任一个数的二进制到十六进制数。
# INCLUDE IOSTREAM. H
CHAR * BUFFER= ENTER A NUMBER BETWEEN 0 AND 1000: ;
CHAR * BUFFER1= BASE;
INT B=0;
CHAR A;
VOID DISP S ( INT BASE, INT DATA)
{
INT TEMP;
_ASM {
MOV AX, DATA
MOV BX, BASE
PUSH BX
TOP1:
MOVE DEX, 0
DIV BX
PUSH DX
CMP AX, 0
JNZ TOP1
TOP2:
POP DX
CMP DX, BX
JE TOP4
ADD DX, 30H
CMP DX, 39H
JBE TOP3
ADD DX, 7
TOP3:
MOV TEMP, EX
}
COUT (CHAR) TEMP;
_ASM{JMP TOP2}
TOP4:;
}
VOID MAIN (VOID) {
INT I;
COUT BUFFER;
CIN. GET (A) ;
WHILE A= ’0’ A= ’9’) {
_ASM {SUB A, 30H}
B=
文档评论(0)