首页 > 编程语言 >通过汇编语言了解程序的实际应用

通过汇编语言了解程序的实际应用

时间:2024-02-27 19:12:10浏览次数:22  
标签:操作数 本地 汇编语言 代码 程序 指令 应用 源代码

通过调查本地代码的内容,可以了解程序最终是以何种形式来运行的。但是,如果直接打开本地代码来看的话,只能看到数值的罗列。如果直接使用这些数值来编写程序的话,还真是不太容易理解。因而就产生了这样一种想法,那就是在各本地代码中,附带上表示其功能的英语单词缩写。例如,在加法运算的本地代码中加上 add(addition 的缩写)、在比较运算的本地代码中加上 cmp(compare 的缩写)等。这些缩写称为助记符,使用助记符的编程语言称为汇编语言。这样,通过查看汇编语言编写的源代码,就可以了解程序的本质了。因为这和查看本地代码的源代码,是同一级别的。不过,即使是用汇编语言编写的源代码,最终也必须要转换成本地代码才能运行。负责转换工作的程序称为汇编器,转换这一处理本身称为汇编。在将源代码转换成本地代码这个功能方面,汇编器和编译器是同样的。用汇编语言编写的源代码,和本地代码是一一对应的。因而,本地代码也可以反过来转换成汇编语言的源代码。持有该功能的逆变换程序称为反汇编程序,逆变换这一处理本身称为反汇编。
除了将本地代码进行反汇编这一方法外,通过其他方式也可以获取汇编语言的源代码。大部分 C 语言编译器,都可以把利用 C 语言编写的源代码转换成汇编语言的源代码,而不是本地代码。利用该功能,就可以对 C 语言的源代码和汇编语言的源代码进行比较研究。
汇编语言的源代码,是由转换成本地代码的指令和针对汇编器的伪指令构成的。伪指令负责把程序的构造及汇编的方法指示给汇编器(转换程序)。不过伪指令本身是无法汇编转换成本地代码的。由构成程序的命令和数据的集合体加上一个名字而得到的,称为段定义。段定义的英文表达 segment 具有“区域”的意思。在程序中,段定义指的是命令和数据等程序的集合体的意思。一个程序由多个段定义构成。伪指令 proc 和 endp 围起来的部分,表示的是过程(procedure)的范围。在汇编语言中,这种相当于 C 语言的函数的形式称为过程。
在汇编语言中,1 行表示对 CPU 的一个指令。汇编语言指令的语法结构是操作码 + 操作数(也存在只有操作码没有操作数的指令)。操作码表示的是指令动作,操作数表示的是指令对象。操作码和操作数罗列在一起的语法,就是一个英文的指令文本。操作码是动词,操作数相当于宾语。能够使用何种形式的操作码,是由 CPU 的种类决定的。本地代码加载到内存后才能运行。内存中存储着构成本地代码的指令和数据。程序运行时,CPU 会从内存中把指令和数据读出,然后再将其存储在 CPU 内部的寄存器中进行处理。寄存器是 CPU 中的存储区域。不过,寄存器并不仅仅具有存储指令和数据的功能,也有运算功能。
指令中最常使用的是对寄存器和内存进行数据存储的 mov 指令。mov 指令的两个操作数,分别用来指定数据的存储地和读出源。操作数中可以指定寄存器、常数、标签(附加在地址前),以及用方括号([])围起来的这些内容。如果指定了没有用方括号围起来的内容,就表示对该值进行处理;如果指定了用方括号围起来的内容,方括号中的值则会被解释为内存地址,然后就会对该内存地址对应的值进行读写操作。
程序运行时,会在内存上申请分配一个称为栈的数据空间。栈(stack)有“干草堆积如山”的意思。就如该名称所表示的那样,数据在存储时是从内存的下层(大的地址编号)逐渐往上层(小的地址编号)累积,读出时则是按照从上往下的顺利进行的。栈是存储临时数据的区域,它的特点是通过 push 指令和 pop 指令进行数据的存储和读出。往栈中存储数据称为“入栈”,从栈中读出数据称为“出栈”。push 指令和 pop 指令中只有一个操作数。
函数的参数是通过栈来传递,返回值是通过寄存器来返回的。
C 语言中,在函数外部定义的变量称为全局变量,在函数内部定义的变量称为局部变量。全局变量可以引用源代码的任意部分,而局部变量只能在定义该变量的函数内进行引用。

标签:操作数,本地,汇编语言,代码,程序,指令,应用,源代码
From: https://www.cnblogs.com/duyan123/p/18037600

相关文章

  • 通过编译器输出汇编语言的源代码
    除了将本地代码进行反汇编这一方法外,通过其他方式也可以获取汇编语言的源代码。大部分C语言编译器,都可以把利用C语言编写的源代码转换成汇编语言的源代码,而不是本地代码。利用该功能,就可以对C语言的源代码和汇编语言的源代码进行比较研究。笔者在学生时代的报告中,使用的便是该功能......
  • 操作系统和应用关系
    在计算机中尚不存在操作系统的年代,完全没有任何程序,因此程序员就需要编写出处理相关的所有程序。用机器语言编写程序,然后再使用开关将程序输入,这一过程非常麻烦。于是,有人开发出了仅具有加载和运行功能的监控程序,这就是操作系统的原型。通过事先启动监控程序,程序员就可以根据需要......
  • WPF UI更新技巧:掌握EventHandler的基础与Dispatcher的高级应用
     概述:在WPF中,通过EventHandler可实现基础和高级的UI更新方式。基础用法涉及在类中定义事件,并在UI中订阅以执行更新操作。高级用法借助Dispatcher类,确保在非UI线程上执行操作后,通过UI线程更新界面。这两种方法提供了灵活而可靠的UI更新机制。在WPF(WindowsPresentationFounda......
  • Qt 常见数据结构详解:从基本框架到实际应用
    在Qt框架中,数据结构的选择对于提高代码效率和性能至关重要。正确地使用数据结构可以显著提高应用程序的效率和响应速度。下面我们将详细介绍Qt中常见的几种数据结构,包括QString、QList、QVector、QMap、QHash、QSet和QPair。1.QStringQString是Qt中用于处理字符串的类。......
  • 程序是怎样跑起来的 日矢泽久雄 第六章
    《程序是怎样跑起来的》这本书的第六章,主要探讨了文件压缩的机制和方法。读完这一章后,我对文件压缩有了更深入的理解。我知道了简单的压缩算法——RLE(Run-LengthEncoding)。在这种算法中,每个字符后面标识出现的频率,例如“A6B1C2E5F1”就是用RLE算法压缩后的结果。然而,文本文件的......
  • 《程序是怎样跑起来的》第八章读后感
    本章主要讲解了编译器的功能,程序员编写的代码称为源代码,而源代码在计算机上无法运行的,需要通过编译器生成本地代码才能在计算机上运行,每个源代码编程语言都需要专用的编译器,编译器通过语法解析、句法解析、语义解析等才能生成本地代码,根据CPU的不同,本地代码也不同,正如上一章所说的......
  • 汇编语言以及程序的实际构成是什么
    汇编语言为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,比如,用“ADD”代表加法,“MOV”代表数据传递等等,这样一来,人们很容易读懂并理解程序在干什么,纠错及维护都变得方便了,这种程序设计语言就称为汇编语......
  • 操作系统和应用的关系
    操作系统和应用的关系操作系统和应用软件之间的关系是操作系统为应用软件提供运行环境和基础服务,而应用软件则是直接为用户提供服务的软件。操作系统是计算机系统的核心,它管理着硬件资源(如CPU、内存、硬盘和外设等),并提供了系统服务,如内存管理、文件管理和设备管理等。这......
  • 程序是怎么跑起来的第十一章
    Windows提供了通过应用来间接控制硬件的方法,利用操作系统提供的系统调,用功能就可以实现对硬件的控制,在Windows中,系统调用称为API,各API就是应用调用的函数。IN指令通过指定端口号的端口输人数据,并将其存储在CPU内部的寄存器中。OUT指令则是把CPU寄存器中存储的数据,输出到指定端口......
  • 《程序是怎样跑起来的》第七章读后感
    本章主要讲解了程序是怎样运行的,不同的程序不同的环境上不一定可以运行,而操作系统和硬件决定了程序的运行环境,同一类的硬件可以选择安装多种操作系统,但从程序运行环境来考虑,CPU的种类是特别重要的,从Windows克服了CPU以外的硬件差异可以看出(CPU不同本地代码不同)。不同操作系统的API......