dnf幽游白书剑魂十4:求助!一个嵌套汇编的C语言程序!急~~~~~~

来源:百度文库 编辑:中科新闻网 时间:2024/05/05 02:40:25
我要编一个程序,其中要调用几个用汇编写的程序,但我不知道怎么弄,是不是要设什么端口地址的?请大家帮帮我,最好详细点,因为我不太懂~~~问题解决了追加100分~~~

现以Microsoft 的quick c和MASM来加以说明:

一、直接插入法:一般只用于需插入的汇编语句比较简短的情况。
如显示一行字符的程序:
char const *message="the planet earth.\n$";
main()
{
_asm
{
mov ah,9
mov dx, message /*注意offset伪操作C编译器不能识别*/
int 21h
}
}
二、C语言程序调用汇编语言过程法:C语言程序经编译后产生.OBJ文件,汇编程序经汇编后也产生.OBJ文件,然后由连接程序把他们连接起来而形成.EXE可执行文件。应注意以下几个问题:
1.控制传送问题:
既然汇编语言程序是C语言程序的子过程,在汇编语言程序中应把过程名作为外部符号来处理,所以应在程序中声明PUBLIC 过程名。C语言程序中把此过程名定义为外部符号(extern)。且汇编语言中的过程名前应加下划线。
2.参数传送问题:
高级语言通过堆栈把参数传送给汇编语言程序。 C语言规定参数入栈的次序一程序中见到它们的次序相反,或者说C语言按从右到左的次序使参数入栈。如函数:sub(x,y,z)先使z入栈,然后是y,最后是x.调用汇编语言过程时,同样要把返回点保存入栈。如果过程为FAR属性,则CS和IP将先后入栈;如果过程为NEAR,则只保存IP。
如:
.MODEL MEDIUM
.CODE
PUBLIC _SUB
_SUB PROC FAR
PUSH BP
MOV BP, SP
MOV AX, [BP+6] ;[BP+2]为IP,[BP+4]为CS(远调用)
MOV BX, [BP+8] ; [BP+6]为第一个参数,[BP+8]为第二个参数...
.
.
.
pop BP
RET
_SUB ENDP
END
以上说明的是C语言程序给汇编语言子过程传达室送参数的方法,如果汇编语言子过程有参数要回送给C语言程序,则应通过累加器回送。
3.还应该说明的是,汇编程序子过程中可以任意使用AX、BX、CX、DX、ES,如需要使用BP、SP、DI、SI、CS、DS、SS寄存器时,则应先把它们的原始内容保存入栈,并在子程序结束前恢复它们的原始内容。

下面举例说明:
使用C语言调用汇编语言子过程dif.asm计算二数之差并在C语言中显示其结果。
C语言程序:
extern unsigned long dif(int,int);
main()
{
printf("The difference is equal to %u,dif(8400,125));
}
汇编程序子过程dif.asm
.model small
.code
public _dif

_dif proc near
push bp
mov bp,sp
sub dx,dx
mov ax,[bp+4] ;因为NEAR过程,调用时只压入了IP。
sub ax,[bp+6]
sbb dx,0
pop bp
ret
_dif endp
end