`

编程范式之汇编语言

 
阅读更多

       学习,了解汇编语言的工作机制和编写流程,有助于我们对程序的执行有一个比较清晰的认识。

       主要的过程就是寻找能够存放数据的内存地址,将数据存放至这个地址之上,取出内存中数据至寄存器,寄存器经过计算后写回内存。

       需要清楚的是,调用者知道被调用的函数有几个参数,调用者分配内存空间,而只有被调用的函数知道其内部有几个局部变量,函数分配内存空间。

       还需要清楚的是,局部变量的入栈顺序依次为由高到低,而函数参数在内存中的分配(第一个参数总是在最低地址处),即由低至高分配,这样做的好处是,当参数为变长参数时,其栈指针总能指向函数的第一个参数。

       以下面的代码为例,我们写出相应的汇编语句,注意,在这里我们假设每一条汇编指令的大小均为4个字节。最终,根据指令集,将汇编语句翻译成计算机能够识别的机器码。

int main() {
	int i = 4;
	foo(i, &i);
	return 0;
}

 

void foo(int bar, int *baz) {
	char snink[4];
	short * why;
	why = (short *) (snink + 2);
	*why = 50;
}

 

SP: STACK POINTER

 

SP = SP - 4;       // 内存是 由高向低进行扩展的,故需要减去4,来存放int 4,(设定能够存放4 的内存位置)

M[SP] = 4;          // 将其内存位置赋值

 

SP = SP - 8;       // i, &i, 一共8个字节

R1 = M[SP + 8];  // 取出i 值

R2 = SP + 8;       // 取出i 地址

M[SP] = R1;        // 给相应的内存赋值

M[SP + 4] = R2;

 

CALL <foo>;

SP = SP + 8;   // 栈指针返回

RV = 0;   // 返回0

 

<foo> : SP = SP - 8; // 两个局部变量

R1 = SP + 6;     // char char char char 4bytes   short *  4bytes     snink + 2 =  short * + 2 个char 的位置(6)                    

M[SP] = R1;       // why 的地址改变

 

R1 = M[SP];       // 取地址     

M[R1] = .2  50;    // 解引用  .2表示2个字节(short), 相应的地址 赋相应的值

SP = SP + 8;     // 回收局部变量

RET;   // 返回

 

附:一个递归函数的递归写法:

int fact(int a) {
	if (n == 0) return 1;
	return n * fact(n - 1);
}

 

SP 的位置为当前函数在栈中的位置,取得参数故需向高地址寻找,(总能从第一个参数开始寻找)

<fact>:

R1 = M[SP + 4];

BNE R1,0, PC + 12;   //  12 跳跃三条汇编指令(每条汇编指令假设为4个字节)

RV = 1;

RET;

R1 = M[SP + 4];

R1 = R1 - 1;

SP = SP - 4;

M[SP] = R1;

CALL <fact>;    // 使得SP向下延伸4个字节,将这个指令存储至saved PC中

SP = SP + 4;

R1 = M[SP + 4];

RV = RV * R1;

RET;

 

0
0
分享到:
评论

相关推荐

    《计算机语言发展历史2》

    这个词在中国大陆的程序员圈子中通常被读做...C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。

    面向语言编程介绍

    人们使用计算机描述世界的方式一直在不断地变化,从早期的汇编语言,到函数式言语,比如Lisp,再到面向过程、面向对象语言,和今天无限风光的动态语言等等。语言的变更表现了计算机需要理解的现实世界正正快速地走向...

    AA:高级汇编是一种编程语言,可以将任何位序列解释为有效程序

    但是,与标准汇编语言不同,Advanced Assembly 并非设计为在特定处理器上运行。 相反,它被设计成任何系列的位——“1”和“0”的任何组合——都是一个有效的程序。 Advanced Assembly 摒弃了传统的将八位组合成一...

    gemhunter:Ruby到MIPS汇编语言的交叉编译器,用Python编写

    Ruby 是一种强大的语言,支持各种编程范式和大量语法糖。 在gemhunter 中,我们消除了 Ruby 的许多额外功能,以提供一个干净的实现,支持我们自己的 Ruby 品牌,并对原始版本进行了细微的调整。 gemhunter完全用 ...

    Python函数式编程实例详解

    函数式编程就是一种抽象程度很高的编程范式,从计算机硬件-&gt;汇编语言-&gt;C语言-&gt;Python抽象程度越高、越贴近于计算,但执行效率也越低。纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定...

    C语言进行文件读写操作的示例代码.pdf

    C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔实验室的D.M.Ritchie于1972年推出,并在此后广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理...

    从汇编层面深度剖析C++基本对象布局

     尽管C++社区近十年兴起元编程范式和模板技术,面向对象编程仍是C++语言基础,也是重要的一种编程范式(paradigms)。C++的对象,将过程式的数据结构,以及操作在它们之上的函数,绑定到一个单一的语法单元,那是...

    编程新手真言......

    3.1 学编程之初,语言之争 71 3.2 语言与应用与人(1) 72 3.2 语言与应用与人(2) 73 3.3 C与Ruby 74 3.4 你为什么需要Ruby 75 3.5 C++还是Ruby 76 3.6 C++与Java 76 3.7 .NET与JVM 77 3.8 你为什么需要Ruby 78 3.9 ...

    matlab集成c代码-Outline-of-computer-programming:“我确定宇宙充满了智能生命。它太聪明了,无法来到这里。

    编程语言可用于创建程序以控制机器的行为或表达算法。 编程语言的类型 流行语言 截至2016年3月,排名前20位的最受欢迎的编程语言: / 编程语言剖析 (也称为函数) 编程语言的比较 个别语言的比较 汇编 软件 (用于...

    SQL.Server.2008编程入门经典(第3版).part2.rar

    他从1 980年开始深入学习计算技术,从构建和修复计算机软件包,到通过Z80、Basic以及6502汇编语言进行编程。1 983年,Robert开始攻读计算机信息系统的学位,随后转而研究“PC故障”并开始使用数据库语言(从dBase到...

    SQL.Server.2008编程入门经典(第3版).part1.rar

    他从1 980年开始深入学习计算技术,从构建和修复计算机软件包,到通过Z80、Basic以及6502汇编语言进行编程。1 983年,Robert开始攻读计算机信息系统的学位,随后转而研究“PC故障”并开始使用数据库语言(从dBase到...

    2005-2009软件设计师历年真题

     4.3 掌握C程序设计语言,以及C++、Java、Visual、Basic、Visual C++中任一种程序设计语言,以便能指导程序员进行编程和测试,并进行必要的优化  4.4 系统测试  • 指导程序员进行模块测试,并进行验收  • 准备...

    软件设计师重点考点

    1.2 汇编语言: 42 1.3 解释程序: 42 1.4 编译程序: 43 2.重点与难点 45 2.1文法及语言形式描述: 45 2.2 词法分析 46 2.3 语法分析 47 2.4代码优化 48 专题三:操作系统知识 53 1、操作系统知识: 53 1.1基本...

    matlab的素描代码-ReVision:修订

    范式的 势在必行非常直观和高效的代码编写方式。 转到样式结构 功能编程(可选功能纯度) 确保更清洁/更节省代码。 使程序员对代码的感觉更好。 内联汇编授予低级别的控制权。 快速的运行时间。 首先编译为c并利用...

Global site tag (gtag.js) - Google Analytics