|
发信人: shany (shany), 信区: Dos_Assembler
标 题: Inline_assembly
发信站: 华南网木棉站 (Fri Apr 27 23:31:23 2001), 转信
inline_assembly系列
在线汇编的优点
在线汇编比一般的汇编的优点在于不必进行masn和link。在线汇编可以直接用
c语言
中定义的变量、函数(但必须考虑函数的域),所以很容易在c语言中写入汇编。
由于汇
编和c和c++的结合,它具有很多优点。
在线汇编优点:
1.优化速度。
2.直接访问硬件。
发信人: shany (shany), 信区: Dos_Assembler
标 题: Inline_assembly(2)
发信站: 华南网木棉站 (Sat Apr 28 07:52:25 2001), 转信
关键字_asm
在c和c++中是通过关键字_asm来调用Inline_assembly的。它可以
在c和c++中是通过关键字_asm来调用Inline_assembly的。它可以
以几种形式书写,但必须带关键字_asm.
以下为一些代码段说明_asm的用法:
_asm
{
mov al , 2
mov dx , 0x007
out al , dx
}
同样你也可以以汇编的结构形式编写
_asm mov al ,2
_asm mov dx ,0x007
_asm out al ,dx
由于_asm 为申明隔离器(不知这样说明白了没:),所以你也可以在
一行中定义
_asm mov al , 2 _asm mov dx ,0x007 _asm out al ,dx
三种书写方式表达的意思都一样,但第一种具有一些优点:
1.把汇编从c和c++中独立出来,而且少写一些_asm
2.可以避免编译器报错,当你在同一行c申明定义时,必须用第一种,
否则编译器无法识别汇编的结束位置和c开始的位置。
3.第一种本身符合汇编的格式,利于从其它源文件中进行粘贴。
3.第一种本身符合汇编的格式,利于从其它源文件中进行粘贴。
--
发信人: shany (shany), 信区: Dos_Assembler
标 题: Inline assembly(3)
发信站: 华南网木棉站 (Sat Apr 28 08:49:10 2001), 转信
以下给出一些Inline assembly 与汇编的不同点和相同点
1. 在线汇编支持Intel486芯片的全部指令.虽然Inline assembly
可以调用c和c++中的数据,但不能用汇编指令进行定义数据,特别不
能用DB、DW、DD和DF,以及一写指令DUP、THIS,同样汇编中的结构
也不能用。
例如:Inline assembly 不支持STRUC 、RECORD、WIDTH、MASK
但可以用_emit 在当前段中来定义单个立即数,不过一次只能定义
一个。
例如:
#define randasm _asm _
emit 0x4A
_asm _emit 0x43
_asm _emit 0x4B
.
.
.
.
_asm {
randasm
}
2.Inline assembly 不是宏汇编,宏汇编的一些指令也不能用,
MACRO、 REPT、IRC、 IRP和 ENDM
3.LENGTH、 SIZE和TYPE指令有一些限制(不可以同DUP指令一起
运用)不过可以用来表示c和c++中变量的大小和类型
a. LENGTH 指令返回数组中元素的个数,如果数组为空则返回1
b. SIZE指令返回c和c++变量的大小,变量大小有它的LENGTH和
TYPE决定
c. TYPE指令返回c和c++类型和变量的大小,如果变量是数组则
返回数组元素的大小
例如定义有8个元素的数组 int arr[8];
以下为c语言和汇编中返回数组和元素大小的方法比较:
__asm C Size
LENGTH arr sizeof(arr)/sizeof(arr[0]) 8
SIZE arr sizeof(arr) 16
TYPE arr sizeof(arr[0]) 2
4.可以在Inline assembly中用“;”来加注解。
先写到这里下次继续
--
发信人: shany (shany), 信区: Dos_Assembler
标 题: Inline assembly(4)
发信站: 华南网木棉站 (Sat Apr 28 22:00:32 2001), 转信
上次说了一些Inline assembly 与普通汇编用法上的不同,这次介绍
Inline assembly 中用c语言和引用变量
在_asm{}中可以用c语言中的元素:
1.标志符,包括数组名、变量名和函数名
2.常量,包括符号常量以及用enum定义的常量
3.宏和预处理指令
4.注解(用/* */和//)
5.用typedef定义的类型
以下为一些在 _asm中引用c语言的例子
1.引用c中的变量。
如果var为c中的变量,且在变量的生命期包括_asm结构
如果var为c中的变量,且在变量的生命期包括_asm结构
则:
_asm mov eax, var
把var的值移入eax中
2.引用c中的结构和类中的变量
如果结构或类中的变量有唯一的标志符,则可以用“.”操作
直接引用,而不必在“.”前加结构名或类名,否则如果标志
符不唯一则应加上结构名或类名
例如以下两个结构元素中有相同的变量名:
struct first_type
{
char *weasel;
int same_name;
};
struct second_type
{
int wonton;
long same_name;
};
然后申明两个结构
struct first_type hal;
struct second_type oat;
则在_asm{}结构中引用same_name 时,必须加结构名,
则在_asm{}结构中引用same_name 时,必须加结构名,
而引用weasel就不必了:
_asm
{
mov ebx, OFFSET hal
mov ecx, [ebx]hal.same_name;必须用'hal'
mov esi, [ebx].weasel ;可以省略'hal'
}
下次讲一些例子。
--
发信人: shany (shany), 信区: Dos_Assembler
标 题: Inline assembly(5)
发信站: 华南网木棉站 (Sat Apr 28 22:25:30 2001), 转信
这次讲一个实例,分别用Inline assembly和assembly写一个,
来比较Inline assembly和assembly语法的不同和一些特性
函数power2传递两个参数num和power,返回num*(2^power)
以下为用assembly:
; POWER.ASM
; Compute the power of an integer
;
;
PUBLIC _power2
_TEXT SEGMENT WORD PUBLIC 'CODE'
_power2 PROC
push ebp ; Save EBP
mov ebp, esp ; Move ESP into EBP so we can
; refer to arguments on the stack
mov eax, [ebp+4] ; Get first argument
mov ecx, [ebp+6] ; Get second argument
shl eax, cl ; EAX = EAX * ( 2 ^ CL )
pop ebp ; Restore EBP
ret ; Return with sum in EAX
_power2 ENDP
_TEXT ENDS
END
以下为用Inline assembly写:
/* POWER2.C */
#include <stdio.h>
int power2( int num, int power );
void main( void )
{
printf( \"3 times 2 to the power of 5 is %d\\n\", \\
power2( 3, 5) );
power2( 3, 5) );
}
int power2( int num, int power )
{
__asm
{
mov eax, num ; Get first argument
mov ecx, power ; Get second argument
shl eax, cl ; EAX = EAX * ( 2 to the power of CL )
}
/* Return with result in EAX */
}
由于power2没有实行c的return语句,所以用level2或更高级别进行
编译时,编译器不能区分有否返回,而会产生警告,则可以用
#pragram warning禁止产生警告。(#pragram warning用法查msdn)
下次讲在_asm{}中调用c中的函数
--
发信人: shany (shany), 信区: Dos_Assembler
标 题: Inline assembly(6)
发信站: 华南网木棉站 (Sat Apr 28 22:46:30 2001), 转信
这次讲在_asm 中调用c函数,包括自定义函数和c函数库
以下为调用c函数库中的函数printf
#include <stdio.h>
char format[] = \"%s %s\\n\";
char hello[] = \"Hello\";
char world[] = \"world\";
void main( void )
{
__asm
{
mov eax, offset world
push eax
mov eax, offset hello
push eax
mov eax, offset format
push eax
call printf
//clean up the stack so that main can exit cleanly
//use the unused register ebx to do the cleanup
pop ebx
pop ebx
pop ebx
mov eax, offset format
pop ebx
pop ebx
}
}
注意这里补充一些c语言调用的知识:c语言中参数的传递是通过
堆栈传递的。所以在_asm {}中调用函数时也通过堆栈传递,只要把
所需的参数压栈,然后调用 就可以,但别忘了出栈
下次看看在c++中调用函数,由于msdn中没有c++的例子
所以自己编了一个自定义函数,参考后试一试写一个调用自定义
的c函数。 |
|