望麓自卑—湖南大学最具潜力的校园传媒

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 930|回复: 0

Inline-assembly[zz]

[复制链接]
发表于 2004-12-19 11:09:06 | 显示全部楼层 |阅读模式
发信人: 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函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

每日推荐上一条 /1 下一条

小黑屋|手机版|湖南大学望麓自卑校园传媒 ( 湘ICP备14014987号 )

GMT+8, 2024-11-24 04:22 , Processed in 0.226923 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表