您现在的位置是: 首页 > 高考调剂 高考调剂

2014高考函数汇编_2014高考数学卷

tamoadmin 2024-07-21 人已围观

简介1.编写一个汇编函数2.关于c调用汇编函数 汇编如何获得得到的参数呢3.汇编,三角函数算法4.汇编中用什么命令代码来获取函数的返回值?5.printf()函数调用对应的汇编代码如下,res为int变量,请详解各个汇编指令的意思。   * Delphi嵌入式汇编的使用方式   .在一般函数过程中使用汇编  汇编程序段可以嵌套于其它过程中 如 procedure TForm Button Cli

1.编写一个汇编函数

2.关于c调用汇编函数 汇编如何获得得到的参数呢

3.汇编,三角函数算法

4.汇编中用什么命令代码来获取函数的返回值?

5.printf()函数调用对应的汇编代码如下,res为int变量,请详解各个汇编指令的意思。

2014高考函数汇编_2014高考数学卷

  * Delphi嵌入式汇编的使用方式

  .在一般函数过程中使用汇编

 汇编程序段可以嵌套于其它过程中 如

procedure TForm Button Click(Sender: TObject);

 var i: *** allint;

 begin

  i:= ;

  a ***

  mov ax i

  sal ax

  mov &i ax

  end;

  showmessage(inttostr(i));

 end;

 这个程序段是把 位的变量I进行左移 然后把结果用Mov &I ax语句放入I变量所在地址返回值 最后显示I 的值是

  .独立的汇编程序段

 汇编程序段也可以单独写成函数或过程 这就涉及到参数的传递与结果的返回 首先Delphi对于函数的返回有一个约定

 即 整型数据 位的用AL返回 位的用AX返回 位的用EAX返回

 实型 用ST( )返回

 指针 用EAX返回

 长字符串 用EAX返回其所在地址

 变量 可用@Result返回

 例如 一个用汇编的求和函数

function _Sum(X Y: Integer): Integer;

  a ***

 MOV EAX X //把 位的数放入EAX

 ADD EAX Y //进行加法运算

 MOV @Result EAX //返回X+Y

  end;

lishixinzhi/Article/program/Delphi/201311/24898

编写一个汇编函数

我也是查找的,请别介意:

准备执行

在主程序中每次调用函数时,先依次把各参数以相反的顺序入栈;

然后call func_name, 这里call要做两件事: 一是把函数的返回地址入栈,二是让指令执行指针%eip指向函数开始处。

开始执行

现在函数要开始执行了,但它执行函数代码前还要做一点小事,首先把原来的基地址寄存器%ebp值入栈,因为在程序执行中%ebp要另作它用, 接着堆栈指针%esp的值复制给%ebp, 此后在函数执行中%ebp一直保持不变,可以由此寻址获得函数参数。

pushl %ebp

movl %esp, %ebp

下面开始执行函数代码了。函数先要把它的局部变量保存在栈中,这很简单。比如要保存一个long型数据,只要把%esp指针向下移动4个字节(因为栈增长方向是由高地址到低地址),再根据%esp把该数据移入. 下面是保存两个局部变量long后的堆栈内容:

Parameter #N <--- N*4+4(%ebp)

...

Parameter 2 <--- 12(%ebp)

Parameter 1 <--- 8(%ebp)

Return Address <--- 4(%ebp)

Old %ebp <--- (%ebp)

Local Variable 1 <--- -4(%ebp)

Local Variable 2 <--- -8(%ebp) and (%esp)

从上可以看出通过%ebp基地址寻址可以访问所有的函数参数和局部变量. 当然也可以不用

%ebp而用其它的寄存器进行同样的基地址寻址。但对于x86结构使用%ebp寄存器可能会更

快一点。

执行结束:

现在函数执行要结束了,在它返回之前,还要做下面几件事:

1. 把函数的返回值存放在通用寄存器%eax中,供外部使用

2. 把%esp指向函数开始执行的位置, 即movl %ebp,%esp

3. 在函数返回ret之前,要还原ebx, 即popl %ebp

movl %ebp, %esp

popl %ebp

ret

从上也可以看出,当%esp指向函数开始执行的位置后,局部变量也就没有意义了(因为此时

esp指向的栈地址高于那些局部变量的地址)。

函数执结束ret返回后,要把call时push的所有函数参数也pop出来(或者直接在%esp上加参数的个数的4倍,如果不需要再使用这些参数值的话)。

addl $8, %esp # 因为有两个参数8个字节

下面是一段代码power.s,计算2^3+5^2

# ==================== asm code begin ===================

#PURPOSE: Program to illustrate how functions work. This program will compute

#the value of 2^3+5^2

.section .data

.section .text

.global _start

_start:

pushl $3

pushl $2

call power # 调用power(2,3)函数

addl $8, %esp # 函数结束后,堆栈指针%esp要返回到参数之前,即加上4*2

pushl %eax # 把第一次计算的power(2,3)的结果(保存在%eax中),入栈保存

pushl $2

pushl $5

call power #调用power(5,2)

addl $8, %esp # 函数结束后,堆栈指针%esp要返回到参数之前,即加上4*2

popl %ebx #从堆栈中取出第一次计算的power(2,3)结果,放在%ebx中

addl %eax, %ebx # 两者相加保存在%ebx中

movl $1,%eax

int $0x80

#系统调用结束,调用号保存在%eax中(为1),返回值保存在%ebx中(为计算结果33)

# function long power(long a,long b) =a^b

.type power, @function

power:

pushl %ebp # %ebp入栈

movl %esp, %ebp # %ebp中保存%esp值,用作下面的基地址寻址

subl $4, %esp

movl 8(%ebp) ,%ebx #把参数a的值赋给%ebx

movl 12(%ebp) ,%ecx #把参数b的值赋给%ecx

movl %ebx, -4(%ebp) #下面是对a做b次循环计算,把 中间结果存放在-4(%ebp) 中

power_loop_start:

cmpl $1, %ecx

je end_power

movl -4(%ebp),%eax

imull %ebx, %eax

movl %eax, -4(%ebp)

decl %ecx

jmp power_loop_start

end_power:

movl -4(%ebp), %eax # 返回值给%ebx

movl %ebp, %esp # %esp回到函数执行开始位置

popl %ebp # ret前要还原函数执行初的%ebp值

ret

#================= asm code end ====================

#as power.s -o power.o

#ld power.o -o power

#./power

#echo $?

33

关于c调用汇编函数 汇编如何获得得到的参数呢

#include <stdio.h>

int fun(int i)

{

int sum=0,n=0;

if(i==0)

for(int m=0;m>=0;m++)

{

if(i%2==0&&n<10)

{

sum=sum+m;

n=n+1;

}

}

else

for(int m=0;m>=0;m++)

{

if(m%5==0&&n<10)

{

sum=sum+m;

n=n+1;

}

}

return sum;

}

void main()

{

int a=0;

printf("input a number:\n");

scanf("%d",a);

fun(a);

}

汇编,三角函数算法

参数传递规则要根据函数遵循的调用约定而定,不同的调用约定(stdcall,C约定fast call,pascal等)其不同,也可以使用自己的约定(在你非常熟悉接口或底层做了什么的情况下),

一般esp+4是eip的值,如果不清楚所用约定,是尝试esp+2*4,esp+3*4等,还得注意在子程序的堆栈平衡,自己参考线调用约定的内容吧

汇编中用什么命令代码来获取函数的返回值?

首先把角度a转换为弧度x弧度 X = 角度 a/57.296cosX=1-(X*X)/2+(X*X)*(X*X)/24-(X*X)*(X*X)*(X*X)/720

printf()函数调用对应的汇编代码如下,res为int变量,请详解各个汇编指令的意思。

auto :声明自动变量 一般不使用 double :声明双精度变量或函数 int: 声明整型变量或函数 struct:声明结构体变量或函数 break:跳出当前循环 else :条件语句否定分支(与 if 连用) long :声明长整型变量或函数 switch :用于开关语句 case:开关语句分支 enum :声明枚举类型 register:声明积存器变量 typedef:用以给数据类型取别名(当然还有其他作用) char :声明字符型变量或函数 extern:声明变量是在其他文件正声明(也可以看做是引用变量) return :子程序返回语句(可以带参数,也看不带参数) union:声明联合数据类型 const :声明只读变量 float:声明浮点型变量或函数 short :声明短整型变量或函数 unsigned:声明无符号类型变量或函数 continue:结束当前循环,开始下一轮循环 for:一种循环语句(可意会不可言传) signed:生命有符号类型变量或函数 void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用) default:开关语句中的“其他”分支 goto:无条件跳转语句 sizeof:计算数据类型长度 volatile:说明变量在程序执行中可被隐含地改变 do :循环语句的循环体 while :循环语句的循环条件 static :声明静态变量 if:条件语句 1)auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。 (2)register 这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。 (3)static 常见的两种用途: 1>统计函数被调用的次数; 2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销. 详细说明: 1>、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2>、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。 使用注意: 1>若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; 2>若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度; 3>设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出) (4)const 被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。 作用: 1>修饰输入参数 a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。 b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。 2>用const修饰函数的返回值 a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。 如对于: const char * GetString(void); 如下语句将出现编译

000E145A mov esi,esp //esi=esp,保存esp

000E145C mov eax,dword ptr [res] //eax=res的指针

000E145F push eax //压栈eax,传递参数用

000E1460 push 0E5858h //压栈格式化字符串

000E1465 call dword ptr ds:[0E92C0h] //printf的调用

000E146B add esp,8 //2个参数+8,平衡堆栈

000E146E cmp esi,esp //对比esi和esp

000E1470 call __RTC_CheckEsp (0E1136h) //debug版的检查堆栈平衡

文章标签: # 函数 # 变量 # ebp