- 34
- 0
- 约2.03万字
- 约 81页
- 2017-01-01 发布于重庆
- 举报
printf (“﹨n This is a program with inline assembly statement”); return 0 ; } 例 6.16 从键盘接收并显示1~9中的一个字符,忽略其他所有字符。设C程序名为inout.c。 C程序如下: /* The program name: inout.c */ main ( ) { asm { mov ah , 7; /* 7号DOS功能调用:键盘输入(无回显) */ int 21h cmp al , ‘0’ jb exit cmp al ,‘9’ ja exit mov dl , al mov ah , 2; /* 2号DOS功能调用:显示输出 */ int 21 h } exit:{; } return 0 ; } 2. 在C程序中直接调用汇编子程序 混合编程时,如果需要用汇编语言完成较多的工作,一种更有效的方法是把需要用汇编语言实现的工作设计成汇编子程序,然后由C程序调用。 采用这种方法进行混合编程时,需注意以下几方面的问题。 ⑴ 正确使用Public和Extern 编写汇编子程序时,对于C程序调用的汇编子程序或变量,应在汇编语言程序中用Public进行声明,且子程序名和变量名前应带有下划线,如下所示: Public _子程序名 Public _变量名 在C语言程序中则应将其声明为extern,如下所示: extern 子程序名 extern 变量名 注意这里不能在子程序名或变量名前加下划线。 ⑵ 参数的传递 C程序调用汇编子程序时,参数是通过堆栈传递给汇编子程序的,要注意C语言程序参数入栈的顺序是从右至左;另外,在C程序执行调用汇编子程序操作时还要将返回地址压入堆栈。由于堆栈是向下生长的,所以每做一次入栈操作,栈指针都相应减小,出栈时则刚好相反。要特别注意栈操作过程中栈指针SP值的变化情况。 当汇编子程序要使用堆栈中的参数时,应通过BP寄存器作为基址寄存器,并加上相应的位移量来对栈中的数据进行存取。在汇编子程序开始处应先将BP寄存器原来的值压栈保存,然后把堆栈指针SP的值传送给BP,如下所示 PUSH BP MOV BP,SP 之后就可用BP作为基址寄存器,并根据相应参数在栈中的位置以“MOV REG,[BP+X ]”的形式来获取参数,其中X是相应参数距BP所指处的位移(以字节计),REG为某一个通用寄存器,通常为AX寄存器。 在返回C程序之前,还应正确恢复BP寄存器原先的值,然后执行RET指令返回C程序,做法如下: POP BP RET ⑶ 汇编子程序的返回值 当C程序调用汇编子程序后,如果汇编子程序有返回值给C程序,则是通过寄存器AX和DX进行传递的。 若返回值是16位二进制值,则放于寄存器AX中;若返回值为32位值,则高16位在寄存器DX中,低16位在寄存器AX中。 如果返回值大于32位,则存放于变量存储区中,该存储区的指针存放于寄存器DX和AX中,其中DX存放指针的段基值,AX存放偏移量。 ⑷ C 程序执行现场的保护和恢复 如同一般的子程序调用一样,用C程序调用汇编子程序,也需特别注意对C程序执行现场的保护和恢复。 所谓现场的保护,就是对汇编子程序中可能用到的寄存器(如BP寄存器)必须在使用它之前将其内容压栈保护,并在返回C程序之前弹出到原来的寄存器中。 ⑸ 编译和连接 以工程(PROJECT)的方法进行 第一步:在DOS 环境下,用汇编程序(如MASM.EXE)将汇编语言子程序汇编成相应的.OBJ文件; 第二步:在工程文件中(如xx.prj)中加入将要编译连接的C语言源程序及其调用的汇编语言子程序的目标文件名; 第三步:对工程文件进行编译连接,生成一个.exe可执行文件。 以命令行的方式进行编译连接 采用这种方法,首先要对C源程序和汇编语言子程序分别进行编译和汇编,使各自生成相应的.obj文件,然后用LINK程序把这些.obj文件连接起来生成一个.exe可执行文件。 例6.17 检测内存单元中“1”的个数并显示输出。要求检测“1”个数的功能由汇编子程序testnum . asm来完成。 C程序如下: /* The program name: testnum1.c */ # include stdio.h int extern testnum2 ( int var ) mai
您可能关注的文档
最近下载
- 学会欣赏艺术养成对美的感知习惯.pptx VIP
- 二手书微信小程序的设计与实现.docx VIP
- 2025年及未来5年中国超硬石膏粉市场数据分析及竞争策略研究报告.docx
- 技术进步与社会生活的变化 教学设计 高二历史统编版(2019)选择性必修2+经济与社会生活.docx VIP
- 专题12.27 全等三角形几何模型分类专题(全章专项练习)(学生版) 2024-2025学年八年级数学上册基础知识专项突破讲与练(人教版).pdf VIP
- 梗阻性黄疸患者护理查房.pptx VIP
- 梗阻性黄疸患者护理查房.pptx VIP
- 2025-2026学年八年级上册数学 人教版 期末综合复习试题(含答案).pdf VIP
- 2025年湖南有色金属职业技术学院单招职业技能考试题库及答案.docx VIP
- 加油站安全专项整治工作方案范文集合5篇.doc VIP
原创力文档

文档评论(0)