以实例解析汇编语言和高级语言
1.主要区别
汇编语句和机器指令具有一一对应的特性。和机器指令相比,使用汇编语言编程更容易。汇编语言使用符号名表示操作码,还可以为内存地址分配符号名(标号),由汇编编译器(assembler)把它们翻译成机器指令,实现对计算机的操控。
用汇编语言编程,可以使用目标计算机的所有指令,而高级语言程序没有这样的能力。在高级语言中,许多目标计算机的指令和寄存器是不能访问的,有些特性也是无法利用的。用于系统编程的语言,如C语言,则同时具有高级语言和汇编语言的特点,它使用高级语言的语法,但是又能使用只有汇编语言才能使用的特性。
汇编语言和高级语言的另一个重要的区别:汇编语言只能运行在指令系统相同的系列计算机上,而高级语言程序可以运行在各种不同的计算机上。对许多应用来说,这种软件的可移植性相当重要。
2. 解决问题比较
单片机控制8个发光二极管(LED),P0口做输出口,控制 从LED1到LED8依次点亮,每次点亮一个LED,如此循环。 电路如下图所示。
汇编源程序
通过汇编源程序,能看到机器级的执行过程,对理解计算机的运行有帮助。
C51程序一
#include<reg51.h> //51单片机寄存器定义的头文件
#include <intrins.h> //包含左移函数的头文件
void delayms(unsigned char );
void main()
{
P0=0xff; // 8个LED灯全部熄灭
P0= 0xfe; //点亮LED1
while(1)
{
delayms(250); //调用LED灯亮灭延迟时间函数
P0 = _crol_(P0,1); //循环左移1位,点亮下一个LED
}
}
void delayms(unsigned char ms) // 定义流水灯亮灭延迟函数
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
主要通过调用左移一位的库函数_crol_(P0,1)实现流水灯。
C51程序二
#include <reg51.h>
char LED_state;
void LED_show();
void main()
{
int i;
LED_state=-1;
while(1)
{
LED_show();
for(i=0;i<30000;i++);
}
}
void LED_show()
{
if(LED_state>=7)
LED_state=0;
else
LED_state++;
P0=~(1<<LED_state);
}
主要把左移操作和取反操作相结合,实现流水灯。
显然,使用C51隐藏了机器实现,使开发者侧重于问题的解决思路,开发效率高,可靠性更好,且易于推广和交流。
3. 过程
过程(procedure)是实现模块化和重用的重要机制。指把一部分程序独立出来作为一个单元,这个单元可以在多个地方被调用。
在汇编语言程序中,常用子程序(subroutine)代替过程,如上述汇编源程序中的延时子程序DELAY。在C中,过程通常称为函数,如上述C51程序一中的delayms(unsigned char )函数,C51程序二中的LED_show()函数。
当被调用的过程完成后,必须返回到调用程序的断点处。一般的方法是调用时把返回地址压入堆栈,当过程结束的时候,从栈顶弹出返回地址并送入程序计数器。
子程序的调用,汇编程序通过调用指令(call)和返回指令(ret)实现。C程序使用函数调用语句实现,表达力更强。