汇编语言程序与高级语言程序的连接 连接中要解决的问题: 1.存储器分配问题 两种语言之间的控制传送问题 3.变量传送问题 调用协议: 1.用于C/C++语言的C语言调用协议 2.用于 BASIC、 PASCAL、 FORTRAN语言的 PASCAL语言调用协议
1 汇编语言程序与高级语言程序的连接 连接中要解决的问题: 1. 存储器分配问题 2. 两种语言之间的控制传送问题 3. 变量传送问题 调用协议: 1. 用于C/C++语言的C语言调用协议 2. 用于BASIC、PASCAL、FORTRAN语言的 PASCAL语言调用协议
C语言和汇编语言混合编程 (一)C语言程序中直接嵌入汇编代码 内嵌汇编语言格式 asm<操作码〉<操作数〉<或换行符〉 例:test1.C #include <stdio. h maino t asm mov ah, 2 asm moy d.* asm int 21h: printf( test
2 C 语言和汇编语言混合编程 (一) C 语言程序中直接嵌入汇编代码 内嵌汇编语言格式: asm 例:test1.c #include main() { asm mov ah,2; asm mov dl,'*'; asm int 21h; printf("test\n"); }
二)在C程序中直接调用汇编子程序 例:cmax,C→ sm max.asm. model smal code pub_max_num #include max num proc near extern int maxnum (int count, i push p int vl, int v2. int v3 mov bp, sp mov CX, [bp+4] int v4, int v5, int v6) dec Cx main JCxZ exIt I int i; mov ax, [bp+6] Comp add bp. 2 i= max num(6,-35,17,0 cmp ax, [bp+6 63,-121,112); Jge gtest printf( "max is %d",1); mov ax, [bp+6] gtest: loop comp exi t. pop bp ret lax_num endp end
3 (二) 在C 程序中直接调用汇编子程序 .model small .code public _max_num _max_num proc near push bp mov bp,sp mov cx,[bp+4] dec cx jcxz exit mov ax,[bp+6] comp: add bp,2 cmp ax,[bp+6] jge gtest mov ax,[bp+6] gtest: loop comp exit: pop bp ret _max_num endp end #include extern int max_num(int count, int v1,int v2,int v3, int v4,int v5,int v6); main() { int i; i= max_num(6,-35,17,0, 63,-121,112); printf("max is %d",i); } 例:c_max.c asm_max.asm
参数传递: C程序调用汇编子程序时,参数是通过堆栈传递给汇编子程序的 并且参数入栈的顺序是从右到左 BP→ BP 低地址 返回地址 BP+4→ BP+6→ 6—v—vyv 1—2-3—4-5 v V6 高地址
4 参数传递: C 程序调用汇编子程序时,参数是通过堆栈传递给汇编子程序的, 并且参数入栈的顺序是从右到左 V6 高地址 v5 v4 v3 v2 BP+6 → v1 BP+4 → 6 返回地址 BP → BP 低地址
汇编语言子程序的返回值: 当被调用的汇编子程序有值返回给调用它的C程序时,这个值通过 AX和DX寄存器进行传递 数据类型 数据长度 (字节) C语言 汇编语言 char DB int DW long int /float DD double DQ 变量的数据类型 5
5 汇编语言子程序的返回值: 当被调用的汇编子程序有值返回给调用它的C 程序时,这个值通过 AX 和 DX 寄存器进行传递。 数 据 类 型 数据长度 (字节) C语言 汇编语言 char DB 1 int DW 2 long int / float DD 4 double DQ 8 变量的数据类型
汇编子程序框架: 只有严格按照C语言编译系统要求编制的汇编孑程序才能被 C程序正确调用。 C语言编译系统将不同类型的变量存放在不同的段中,并且把 DATA、 CONST、BSS和 STACK段组合成一个 DGROUP 段组 2.C语言编译系统对不同段的定位类型、组合类型及类别名规定 了统一的名称
6 汇编子程序框架: 只有严格按照C 语言编译系统要求编制的汇编子程序才能被 C程序正确调用。 1. C语言编译系统将不同类型的变量存放在不同的段中,并且把 _DATA、CONST、_BSS 和 STACK 段组合成一个 DGROUP 段组。 2. C语言编译系统对不同段的定位类型、组合类型及类别名规定 了统一的名称