如何在c语言中使用汇编语言

时间:2022-01-05 01:05:55
最好详细点,32位的汇编和8086/8088汇编使用时有什么区别?

13 个解决方案

#1


32位的汇编即使用32位的寄存器。EAX,EBX,ECX,EDX...
而8086是16位的。ax,bx,cx,dx.....

#2


最显著的区别就是32位模式下,存取一个32位数据只要一个指令就够了,
而8086下需要两个指令。效率?
32位下,段内偏移采用32位,段的大小最多达4GB,而16位下,段64K。
另外,就是32位下支持保护模式编程,Win95是第一个完全符合32位标准的。

#3


8086~80286的指令是16位模式的指令。
80386以上按实模式操作时,默认所有指令为16位模式,但是指令长度比对应的8086~80286长。
32位和16位寄存器都可以分别应用在16位指令模式和32位指令模式下。

#4


__asm
{
....
}

#5


还有,32asm 跟系统联系比较紧 ,可以直接调用api函数
有控件

#6


我见过别人再c里面钳汇编
不过那时 c88,那汇编也是epson的8位汇编
不知道对妳有什么帮助

#7


可以搞到原理和源程序

#8


原码能给我看看吗?我的邮箱:afallenangel@sohu.com

#9


记错了,是再汇编里套 c程序

1.如何在汇编程序中调用c模块。
问题来源:主控程序是由汇编写成,而科学计算器由于需要使用c语言函数库中的 数学函数,以及浮点数的处理,并且这两部分如果用汇编实现的话工作量太大。
解决办法:c88在编译c文件时,是将它直接编译成汇编文件,然后再由汇编编译器编译成目标文件。考虑到上述过程,我们在编译时,加上参数-tmp,查看中间输出文件,即可看到后缀为.src的中间汇编文件。通过测试,得知c的命名规则:在c程序中的函数
int dd(){return 0;}
 
编译后的结果如下:

; E0C88 compiler v1.2 r3                  SN00000000-069 (c) 2000 TASKING, Inc.
; options: -e -g -Ms
$CASE ON
$MODEL S

NAME "FILE0"
SYMB TOOL, "E0C88 compiler v1.2", 1
SYMB TYPE, 256, "bit", 'g', 0, 1
SYMB FILE, "..\\src\\file0.c"
DEFSECT ".text", CODE
SECT ".text"
SYMB LINE, 2
GLOBAL _dd
_dd:
SYMB TYPE, 257, 'X', 8, #16, 2, -1
SYMB GFUN, "dd", _dd, #257, 0, 0, 0
SYMB ALAB, _dd, #257
SYMB LINE, 3
LD ba,#00h
SYMB LINE, 4
RET
SYMB EFUN
SYMB ENDF

EXTERN (DATA) __lc_ub_xvwbuffer
EXTERN (DATA) __lc_ue_xvwbuffer
EXTERN (DATA) __lc_es
END 
可以看出,函数的名称,在编译完后,相当于汇编程序的标号,并且函数的作用范围也是全局的,在汇编中体现在GLOBAL伪指令上。
并且通过测试,以及查阅文档,我们也搞清楚了它的参数传递机制:
c88编译器总是尽可能充分的利用寄存器,并且c88使用一种灵活的寄存器分配策略,也就是说对于c代码的任意改动,都可能会产生不同的寄存器分配方式。
但是对于传递参数使用的策略是固定的,这也就为我们从汇编调用c模块带来了很大方便。参数是通过一下的寄存器传送的,A,B,L,H,YP,XP,BA,HL,IX,IY。

#10


可能对妳没多大用

#11


低级语言调用高级语言,新鲜。

#12


原来有一本书专门谈到了多种语言的相互调用问题,找找,图书馆里一定有的。

#13


32为速度快

#1


32位的汇编即使用32位的寄存器。EAX,EBX,ECX,EDX...
而8086是16位的。ax,bx,cx,dx.....

#2


最显著的区别就是32位模式下,存取一个32位数据只要一个指令就够了,
而8086下需要两个指令。效率?
32位下,段内偏移采用32位,段的大小最多达4GB,而16位下,段64K。
另外,就是32位下支持保护模式编程,Win95是第一个完全符合32位标准的。

#3


8086~80286的指令是16位模式的指令。
80386以上按实模式操作时,默认所有指令为16位模式,但是指令长度比对应的8086~80286长。
32位和16位寄存器都可以分别应用在16位指令模式和32位指令模式下。

#4


__asm
{
....
}

#5


还有,32asm 跟系统联系比较紧 ,可以直接调用api函数
有控件

#6


我见过别人再c里面钳汇编
不过那时 c88,那汇编也是epson的8位汇编
不知道对妳有什么帮助

#7


可以搞到原理和源程序

#8


原码能给我看看吗?我的邮箱:afallenangel@sohu.com

#9


记错了,是再汇编里套 c程序

1.如何在汇编程序中调用c模块。
问题来源:主控程序是由汇编写成,而科学计算器由于需要使用c语言函数库中的 数学函数,以及浮点数的处理,并且这两部分如果用汇编实现的话工作量太大。
解决办法:c88在编译c文件时,是将它直接编译成汇编文件,然后再由汇编编译器编译成目标文件。考虑到上述过程,我们在编译时,加上参数-tmp,查看中间输出文件,即可看到后缀为.src的中间汇编文件。通过测试,得知c的命名规则:在c程序中的函数
int dd(){return 0;}
 
编译后的结果如下:

; E0C88 compiler v1.2 r3                  SN00000000-069 (c) 2000 TASKING, Inc.
; options: -e -g -Ms
$CASE ON
$MODEL S

NAME "FILE0"
SYMB TOOL, "E0C88 compiler v1.2", 1
SYMB TYPE, 256, "bit", 'g', 0, 1
SYMB FILE, "..\\src\\file0.c"
DEFSECT ".text", CODE
SECT ".text"
SYMB LINE, 2
GLOBAL _dd
_dd:
SYMB TYPE, 257, 'X', 8, #16, 2, -1
SYMB GFUN, "dd", _dd, #257, 0, 0, 0
SYMB ALAB, _dd, #257
SYMB LINE, 3
LD ba,#00h
SYMB LINE, 4
RET
SYMB EFUN
SYMB ENDF

EXTERN (DATA) __lc_ub_xvwbuffer
EXTERN (DATA) __lc_ue_xvwbuffer
EXTERN (DATA) __lc_es
END 
可以看出,函数的名称,在编译完后,相当于汇编程序的标号,并且函数的作用范围也是全局的,在汇编中体现在GLOBAL伪指令上。
并且通过测试,以及查阅文档,我们也搞清楚了它的参数传递机制:
c88编译器总是尽可能充分的利用寄存器,并且c88使用一种灵活的寄存器分配策略,也就是说对于c代码的任意改动,都可能会产生不同的寄存器分配方式。
但是对于传递参数使用的策略是固定的,这也就为我们从汇编调用c模块带来了很大方便。参数是通过一下的寄存器传送的,A,B,L,H,YP,XP,BA,HL,IX,IY。

#10


可能对妳没多大用

#11


低级语言调用高级语言,新鲜。

#12


原来有一本书专门谈到了多种语言的相互调用问题,找找,图书馆里一定有的。

#13


32为速度快