当前位置: 首页 > news >正文

以实例解析汇编语言和高级语言

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程序使用函数调用语句实现,表达力更强。

相关文章:

  • RCE漏洞
  • OpenWrt如何配置WireGuard互联?
  • MyBatis @Param 注解详解:多参数传递与正确使用方式
  • Oracle19c进入EM Express(Oracle企业管理器)详细步骤
  • Map<String,Object>转换为XML报文的方法
  • 网络安全wireshark题目
  • Ubuntu20.04本地配置IsaacGym Preview 4的G1训练环境(一)
  • Linux - 进程通信
  • 11、vue3生命周期?
  • 湖仓一体化及冷、热、实时三级存储
  • Django 5实用指南(十二)异步处理与Celery集成
  • 【YOLOv12改进trick】多尺度大核注意力机制MLKA模块引入YOLOv12,实现多尺度目标检测涨点,含创新点Python代码,方便发论文
  • GCC RISCV 后端 -- GCC Passes 注释
  • 关于sqlalchemy的使用
  • 基于hive的电信离线用户的行为分析系统
  • 第9章:数据导入导出与设置
  • C语言共用体(union)
  • 【DeepSeek】5分钟快速实现本地化部署教程
  • SQL分几种
  • C语言——自定义类型:结构体