`

编程范式之汇编语言

 
阅读更多

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

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

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

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

       以下面的代码为例,我们写出相应的汇编语句,注意,在这里我们假设每一条汇编指令的大小均为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
分享到:
评论

相关推荐

    基于汇编语言的面向对象编程

    【基于汇编语言的面向对象编程】是...综上所述,基于汇编语言的面向对象编程结合了两种编程范式的优点,提供了更灵活和高效的编程模型,尤其在需要高度定制和优化的系统中,这种编程方式能够帮助开发者更好地实现目标。

    c语言和汇编语言混合编程实例详解.rar

    在计算机编程领域,C语言和汇编语言是两种截然不同的编程范式。C语言是一种高级编程语言,具有丰富的抽象和简洁的语法,适合编写复杂的系统软件和应用程序。而汇编语言则是与机器码直接对应的低级语言,它提供对硬件...

    计算机语言的发展简介,总的来说计算机语言可分成机器语言,汇编语言,高级语言三大类。

    让我们深入探讨这三大类计算机语言:机器语言、汇编语言以及高级语言。 **机器语言**是计算机能够直接理解和执行的语言,由二进制代码(0和1)组成。这种语言与硬件紧密相连,每个指令都对应着计算机内部特定的电路...

    C 语言和汇编语言混合编程

    在计算机编程领域,C语言和汇编语言是两种截然不同的编程范式,但它们各自拥有独特的优点。C语言是一种高级编程语言,以其强大的抽象能力和跨平台性而著名,而汇编语言则接近机器码,提供了对硬件的直接控制。在特定...

    用英文写一篇短文介绍计算机语言的发展历史和特点,要求简单介绍机器语言、汇编语言、高级语言的简单发展历程和各自的特点。

    这种编程范式强调将数据和操作数据的方法封装在一起,形成对象,增强了代码的复用性和模块化。C++和Java是典型的面向对象语言,而Python和Ruby等语言则在支持OOP的同时,提供了函数式和命令式编程等多种风格。 现代...

    IBM大型机汇编语言

    通过深入学习《IBM大型机汇编语言》,开发者不仅能掌握汇编语言的基本语法和技巧,还能了解IBM大型机的独特特性和编程范式,为开发高效、可靠的大型机应用打下坚实基础。这份资料将引导读者逐步探索这个专业领域的...

    汇编代码转易语言 4.0

    其语法简洁明了,采用汉字命名,易于理解,支持多种编程范式,如面向过程、面向对象和组件编程。易语言提供了丰富的内置函数和库,使得开发者能快速实现各种功能,特别适合初学者和快速开发应用。 三、汇编转易语言...

    ASM汇编语言编译器

    示例代码可以帮助初学者了解基本的汇编语言编程范式,例如数据定义、函数调用、循环和条件判断等。 总的来说,ASM汇编语言编译器是学习和开发8088汇编程序的重要工具,通过深入学习和实践,开发者可以掌握计算机...

    基于汇编语言的点阵(适合初学者)

    同时,理解汇编语言的指令集和编程范式也是必不可少的。通过学习和实践,不仅可以掌握点阵显示技术,还能进一步提升对51单片机及汇编语言的理解。 总结来说,基于51单片机的点阵显示是一个涉及硬件接口、数据传输、...

    汇编语言和C语言.pdf

    它支持多种编程范式,包括过程化编程、模块化编程等,并允许直接操作内存和硬件,这在嵌入式系统和系统软件开发中非常有用。 在给定的文件内容中,我们可以看到汇编语言与C语言的一些具体例子。例如,文件中提到了...

    asm.rar_c 调用asm_汇编语言

    在编程世界中,汇编语言和C语言是两种截然不同的编程范式,但它们之间可以通过特定的方法相互交互。汇编语言是一种低级语言,直接对应于机器指令,提供了对硬件资源的直接控制,而C语言则是一种中级语言,提供了一种...

    汇编语言与C语言的混合程序设计技术.pdf

    此外,因为混合编程往往涉及不同编程范式的融合,所以还需要考虑语言之间在调用、数据传递等方面的协同工作。 总结而言,汇编语言与C语言的混合程序设计技术,是一种在软件开发中发挥各自语言优势的高级技术。通过...

    java和汇编源程序

    Java和汇编语言是两种截然不同的编程范式,它们在计算机科学中占据了重要的位置。Java是一种高级编程语言,由Sun Microsystems(现为Oracle Corporation)于1995年推出,设计目标是“一次编写,到处运行”。它以其...

    汇编与C语言工具合集

    C语言则是一种中级语言,它提供了面向过程的编程范式,同时保持了足够的底层控制。TURBOC.20T和TURBOC30是Borland公司发布的Turbo C编译器的不同版本。Turbo C以其快速编译和小巧的体积著称,是80年代和90年代初许多...

    汇编 与 C的混合编程

    在计算机编程中,汇编语言和C语言是两种不同的编程范式。汇编语言是一种低级编程语言,直接对应机器指令,对硬件控制更精细,而C语言是一种高级语言,抽象程度更高,易于编写和理解。然而,在某些情况下,如需要优化...

    8086/8088/186汇编语言及上机教程(2)

    模块化开发是一种编程范式,强调将程序分解为多个小的、可独立编译的模块,以提高代码的可维护性和可复用性。书中讲解了如何通过链接和定位实现模块间的连接,以及如何定义和使用程序段(segment),从而实现模块化...

    编程语言原理(第10版

    2. **汇编语言**:一种低级语言,比机器语言更易于阅读和编写,每条指令对应一条机器语言指令。 3. **高级语言**:如C、Java、Python等,它们更接近自然语言,提高了程序员的工作效率,降低了错误率。 ### 二、编程...

    第2章 C++编程范式资料

    在C++编程中,编程范式是指编程时遵循的风格和模式,它影响代码的组织、可读性和可维护性。本章主要介绍了C++编程的三个方面:工程组织结构、代码编译方法以及编程风格指南。 2.1 C++工程组织结构 C++工程的组织...

Global site tag (gtag.js) - Google Analytics