汇编 订阅
汇编程序是指把汇编语言书写的程序翻译成与之等价的机器语言程序的翻译程序。汇编程序输入的是用汇编语言书写的源程序,输出的是用机器语言表示的目标程序。汇编语言是为特定计算机或计算机系列设计的一种面向机器的语言,由汇编执行指令和汇编伪指令组成。采用汇编语言编写程序虽不如高级程序设计语言简便、直观,但是汇编出的目标程序占用内存较少、运行效率较高,且能直接引用计算机的各种设备资源。它通常用于编写系统的核心部分程序,或编写需要耗费大量运行时间和实时性要求较高的程序段。 展开全文
汇编程序是指把汇编语言书写的程序翻译成与之等价的机器语言程序的翻译程序。汇编程序输入的是用汇编语言书写的源程序,输出的是用机器语言表示的目标程序。汇编语言是为特定计算机或计算机系列设计的一种面向机器的语言,由汇编执行指令和汇编伪指令组成。采用汇编语言编写程序虽不如高级程序设计语言简便、直观,但是汇编出的目标程序占用内存较少、运行效率较高,且能直接引用计算机的各种设备资源。它通常用于编写系统的核心部分程序,或编写需要耗费大量运行时间和实时性要求较高的程序段。
信息
外文名
assembler
汉语拼音
huibian chengxu
中文名
汇编程序
学    科
计算机
汇编程序背景信息
汇编执行指令是机器指令的符号化表示,其操作码用记忆符表示,地址码直接用标号、变量名字、常数等表示。汇编执行指令经汇编程序翻译为机器指令,二者之间基本上保持一一对应的关系。汇编伪指令又称作汇编指示,用于向汇编程序提供用户自定义的符号、数据的类型、数据空间的长度,以及目标程序的格式、存放位置等提示性信息,其作用是指示汇编程序如何进行汇编。使用汇编语言编写的源代码,需要通过使用相应的汇编程序将它们转换成可执行的机器代码。这一过程被称为汇编过程。许多汇编程序可以识别代表地址和常量的标签(label)和符号(symbols),这样就可以用字符来代表操作数而无需采取写死的方式。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的。许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计;在实际应用中,它通常被应用在底层硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言 [1]  。
收起全文
精华内容
参与话题
问答
  • 汇编语言

    千次阅读 2019-09-18 21:52:55
    汇编语言 汇编语言是一类语言,ARM,MIPS,X86。 汇编语言与CPU联系紧密。但是可移植性差。 Li $t1 , 1 # 把1放到t1寄存器里面 add $t0 , $t1 ,2 # 2加上ti里面的放到t0中 ...

    汇编语言

    汇编语言是一类语言,ARM,MIPS,X86。
    汇编语言与CPU联系紧密。但是可移植性差。

     Li $t1 , 1   # 把1放到t1寄存器里面
     add $t0 , $t1 ,2  # 2加上ti里面的放到t0中
    
    展开全文
  • [编程语言][汇编语言]计算机与汇编语言

    千次阅读 多人点赞 2015-11-30 18:47:31
    汇编语言

    一、什么是计算机 ?


    简单的说计算机是这样一种机器:当我们把一些信息输入到计算机中后,它经过计算后告诉我们信息处理的结果。计算机能够完成很多任务,甚至有些任务是极其复杂的。但计算机在完成这些任务的时候,最终其实是做数值的计算。所以我们叫这种机器为“计算”机。计算机是为了方便人类而产生的,理论上来说计算机能完成的任务人类也是能够完成的。所以,计算机很多方面其实和人类很像。

    1、CPU、内存与硬盘

    我们去电脑城买电脑的时候,卖场的工作人员通常会介绍一台电脑的配置如何。笔者的笔记本就是i7CPU、8G内存以及1TB硬盘的。什么是CPU?什么是内存?还有,什么是硬盘?这些问题可能对一个熟悉电脑的人来说小菜一碟,但对某些刚刚接触电脑的人来说还是比较困难的。下面我们打开电脑的外壳,看看这些东西到底是什么样子的。

    CPU其实是个不到半个手掌大小的方块,它的周围有一些引脚。人们所说的内存其实是一个长方形的条形电路板,也就是内存条。而硬盘是一个铁盒子,我们无法打开这个铁盒子深入地了解硬盘的内部结构。

    以上是我们感官的认识,下面我们来了解它们的功能。

    CPU(Central Processing Unit,中文名称是中央处理器)是我们计算机中最为重要的一个部件。它完成绝大多数的运算,好比是我们的大脑。

    内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据。内存就像是我们手头的草稿纸。我们的大脑不能计算过于复杂的计算,否则就需要借助草稿纸来暂时记下中间的计算结果。CPU其实和我们的大脑是一样的,只能计算一定范围内的运算。对于稍稍复杂一些运算,CPU就需要暂时把中间结果保存在内存中。

    硬盘(Hard Disk)主要用于保存数据。我们借助草稿纸得到复杂运算的结果后,为了便于老师批阅,通常是把运算结果填写的练习本上的。CPU可以把运算结果保存在其内部,当然也可以保存在内存中。由于电子硬件的特性,计算机断电以后CPU和内存中保存的数据会完全丢失。硬盘的电子硬件特性决定了它即便是断电,也不会丢失数据。这样我们就可以把运算结果保存在硬盘上。

    2、寄存器

    什么!寄存器又是个什么东西?

    我们的大脑在计算的时候,其实计算发生在大脑内部某个空间的。我们可以通过平时的训练来扩充这个计算空间,这样我们就可以计算更加复杂的运算。说到底,我们的大脑内部也有一个类似草稿纸的空间。对于1+2这种简单运算,我们的大脑完全可以马上得到结果。对于17×8这样的运算,我们也可以比较容易地得到结果:首先计算7×8得到56,然后计算1×8的到8,然后再把之前运算结果的进位5和这次得到的8相加得到13,最终的结果就是136。为了得到了136这个最终结果,我们的大脑产生了56、8和13这些中间结果,而这些中间结果其实是保存在我们大脑内部的“草稿纸”中的。看似还比较容易,但如果我们想计算1234×5678呢?除了个别人,如果不凭借手边的草稿纸,要得到正确结果恐怕就不是那么容易了。

    我们的大脑如此,计算机又是怎样的呢?一些高手口中说的“32位计算机”、“64位计算机”,我们可以理解为一台计算机一次运算能够处理的数值的最大长度是32位或是64位的。在这里,我们先不探究32位或64位是怎样的一个长度,只需要了解计算机的运算能力不是万能的,超过一定的范围计算机就无能为力了。计算机的运算功能是由CPU来完成的,所以CPU的运算能力就是计算机的运算能力。在计算机内部也是有“草稿纸”的,这些“草稿纸”就是寄存器(register)。寄存器和内存一样,也是可以保存数值,但是寄存器能够存储数据的能力远远小于内存。

    组成寄存器和内存的电子元件是不相同的。寄存器的速度比较快,但制造成本比较高;内存的速度比较慢,但制造成本比较低。如果我们只使用内存,那么速度更快的CPU大部分时间是在等待内存;如果我们只使用寄存器,那么一台电脑将不是我们这些普通人能够买得起的。为了获得一定的运算速度,也为了能够降低成本。工程师决定在CPU内部内置一些寄存器来完成CPU的运算功能,同时CPU也需要在内存中保存其运算结果。

    在这里我们总结一下:计算机的运算功能是依靠CPU完成的;在运算过程中要CPU要用到其内部的寄存器;而当寄存器无法满足计算的需要时,我们可以把中间结果暂时保存在内存中;当计算完成并且需要永久保存其结果时,我们就把它们保存在硬盘里。

    二、机器语言与汇编语言


    1、机器语言

    我们在学习英语之前,我们听不懂美国人到底说了写什么。同样的,我们计算机也是不能理解“1+2=?”这种极其简单的计算问题。计算机只能理解机器语言,也就是二进制指令,二进制就是计算机世界中的通用语言。“1011 1000 0000 0001 0000 0000 1000 0011 1100 0000 0000 0010”这段二进制指令的含义就是让CPU计算1+2的运算。如果这么多的1和0中写错一个数字,就可能变成另外的含义了。为了方便阅读,我们可以把这段二进制指令以16进制数表示:“B80100 83C002”。可是即便如此,机器语言对我们来说还是很难阅读。

    2、汇编语言

    我们可以理解汉语,可以理解数学算式。通过学习,我们还可以理解英语、法语。当然,通过学习以及自身超强的记忆力,我们也能够理解机器语言。但这就背离了我们发明计算机的初衷,为了方便运算,我们竟然要花巨大的时间和精力来学习以及记忆一门世界上最难懂的语言。

    世界上谁会这么做呢?但不这么做又该如何让计算机明白我们的意图呢?聪明的前辈们发明了汇编语言(assembly language)这种中间语言。借助于汇编语言,我们可以很容易地将自己的意图转换为汇编语言。而汇编语言和机器语言一一对应的关系,又决定了它们之间可以非常容易地进行转换。用汇编语言表达之前机器语言就是:

        mov $1, %ax
        add $2, %ax

    嗯,有点意思了。mov很像move,add是加法运算的英文单词。只是为什么在1和2的前面有个美元符号$?%ax又是个什么东西?未知的东西好像有些多了,但别着急,这些疑问我们会一一谈到了。

    前面的代码片段中的mov、add是助记符(mnemonic),%ax是寄存器。每一行为一条指令。第一条指令的意思是把1搬进(move)ax寄存器,第二条指令的意思是把ax寄存器的数值加上(add)2。以后我们会发现,“B80100”其实就是mov $1, %ax,而”83C002“就是add $2, %ax。看看,有了汇编语言做翻译,我们是不是很容易就让计算机知道我们到底想让它做些什么事情了。

    汇编语言就是把机器指令用人们能比较理解的简短的助记符表示出来的语言。这里要提一下的是,汇编语言虽然与机器语言一一对应,但却有多种不同的表达格式。最常用的汇编语言格式为“Intel汇编格式”和“AT&T汇编格式”,而上面的代码片段就是“AT&T汇编格式”的。不过它们之间的差异很小,也很容易掌握,而且它们也很容易相互转换,完全不会影响到我们学习汇编语言本身。

    三、第一个汇编程序


    前面说了这么多文科知识,我们已经很枯燥了。下面就开始我们自己的第一个汇编程序。不过,我们首先需要知道得到最终的成品之前,我们都需要做哪些事情。

    第一步,我们在脑海里把自己的意图转换成一条条的汇编指令后,就可以通过键盘输入到计算机里并且保存为一个文本文件。这个文本文件我们称为源代码文件(source file),简称源文件。其扩展名为“s”,比如“boot.s”文件。源文件就是我们起点。

    第二步,我们通过汇编器(assembler)把源代码文件转换成目标文件(object file)。此时,我们得到的目标文件是一个包含二进制指令序列的文件,而这些二进制指令序列就是计算机能够理解的机器语言。这个过程称为汇编。每一个源文件汇编后会得到一个目标文件,当然N个源文件汇编后得到的就是N个目标文件。也就是说,汇编的过程是以源文件为单位进行的,源文件与目标文件是一一对应的。虽然如此,我们的工作还没有结束。

    第三步,我们需要通过把链接器(linker)把目标文件链接成在相应环境下可以执行的文件,即可执行文件(executable file)。这个过程我们称为链接。如果有多个目标文件,我们可以把它们链接成一个可执行文件。也就是说,在链接过程中,目标文件与可执行文件是多对一的关系。好了,到这里,我们已经得到了我们想要的成品了。

    以上这三步是我们必须完成的。当然了,肯定有朋友会问到:“第二部得到的不是已经是机器语言了吗,为什么还需要第三步呢?”说的没错,第二部中的目标文件确实已经包含机器语言了。不过,对于我们练习的小程序,用一个源文件就可以了。但是,如果一个大型项目,甚至是Linux这样的“巨型”项目,就需要分成多个模块,分别进行编辑、汇编,然后再链接成一个可执行文件。另外,目标文件缺少程序加载所必须的信息,而这些信息必须由链接器补充完整。

    好像又说了一堆枯燥的文科知识,不过一旦了解了上面的这些内容将有助于我们完成自己的第一个汇编程序。为了降低难度,尽可能少地讲解新知识,我们来编写一个Linux下的“hello, world!”汇编程序。

    1、编辑源文件

    将下面的源代码编辑在一个文本文件中,并且文件名保存为“hello.s”。

    /*
     * File:        ch1/hello.s
     * Author:      HuoYun
     * Created on:  2015/11/30 15:15:47
     * Modified on: 2015/11/30 15:15:47
     * Describe:
     *      本程序为了演示汇编以及链接的过程。
     * Compile command:
     *      as hello.s -o hello.o
     *      ld hello.o -o hello
     * Usage:
            hello
     */
    
        .section .text
        .global _start
    _start:
        # 调用系统调用,在屏幕上显示信息。
        mov $4, %eax
        mov $1, %ebx
        mov $message, %ecx
        mov $len, %edx
        int $0x80
    
        # 调用系统调用,退出程序。
        mov $1, %eax
        mov $0, %ebx
        int $0x80
    
        .section .data
    message:
        .ascii "hello, world!\n"
        len = .-message

    我们稍后来讲述如何编辑这个汇编源代码。

    2、汇编

    我们进入保存源代码文件的目录,然后执行下面的命令:

    $ as hello.s -o hello.o

    如果我们编辑的源代码没有问题,就会得到boot.o这个目标文件。但如果我们在编辑的过程中不小心输错了一个地方,汇编器可能会提示错误。这个时候就需要我们仔细地检查并且更正了。

    3、链接

    我们继续执行下面的命令:

    $ ld hello.o -o hello

    这个时候就会的到boot这个可执行文件。当然如果由于某种原因,链接器提示发生了错误,同样的,我们依然要查找并更正错误。

    4、执行

    当我们正确地得到了可执行文件boot后,我们就可以执行下面的命令来运行我们的第一个汇编程序了:

    $ ./hello

    如果得到下面的运行结果,说明我们之前的步骤都没有错误。以后我们编译程序时,多数情况下都会使用之前的步骤。所以,以后我们不再详细讲述每个程序的编译过程,而是将编译命令记录在源文件的注释中。

    hello, world!

    至此,是否有些兴奋和成就感呢?编写程序代码是个枯燥的过程。有的时候我们洋洋洒洒地写了成百上千行代码,可就是无法编译通过,或者编译通过了却没有得到我们预期的效果。这时,我们只能慢慢地寻找bug。找到了一个bug,但发现还有另外的bug。是的,我们就是在编辑、找错、再编辑、再找错这种多次重复的过程中完善程序的,最终我们得到的是一个我们期望的程序。编写程序是乏味的,产生的错误是让人厌烦的。没有一个人一开始就能写出正确无误的代码,大量的编程会降低自己的失误率。学习编程,最忌讳的就是眼高手低,因为事情经常不是你想象的那样。书中剩余的代码示例均已在Ubuntu linux 15.04操作系统下编译完成,我们尽可能地保证代码的正确性,让大家能够得到一样的结果。看到这里,如果你仅仅只是通过之前的描述直到了“hello, world!”汇编程序的允许结果,那请你亲自动手敲敲键盘,看看是否能够得到和我一样的结果。

    “纸上得来终觉浅,绝知此事要躬行。”我以这一句作为本章的结束,再一次地说明亲自编写代码的重要性。

    展开全文
  • c语言和汇编语言的区别

    万次阅读 多人点赞 2016-11-04 17:57:16
    C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言;尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准...
    什么是c语言:

        C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言;尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

    什么是汇编语言:

        汇编语言(assembly language)是一种用于电子计算机微处理器微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。[1] 
    许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。
    汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。在今天的实际应用中,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。

    C语言和汇编语言的优缺点:以c来举例

    优点:

    1.c的运行效率高;
    2.c可以实现硬件的直接访问;
    3.c代码的移植性好;


    缺点:


    1.c的代码复用性差;

    2.c的代码维护性差;

    3.c的扩展性差,即如果想增加新功能,需要修改较多的代码;

    4.c语言的可读性差;


    至于汇编语言的优缺点基本和c的优缺点相反;


    c和汇编的选择:


    1.若只有较简单的逻辑操作、逻辑算法、简单运算,使用汇编会得到较为精准的代码,但用c也同样可以做到。

    2.若掺有复杂运算、浮点运算、非线性方程等,汇编恐怕无能为力了(最起码难度很大)。

    3.单片机种类繁多,各自的汇编语法大都不一样,若仅使用汇编,可扩充性、可移植性都很差,用c会好的多。


    简单地说,很小的程序,主要是硬件简单控制的可以用汇编,

    稍微复杂一点尤其是牵涉到一些计算或者管理等方面的最好用c 。


    而现在随着技术的发展,面向程序员的高级语言比面向CPU的汇编语言好用得,在硬件条件允许的情况下,程序员当然选择用高级语言编程,不旦提高了编程效率,也提高了代码的可维护性,并且十分有利于编写大型的工程。







     

     

     

     

        

     

     

        

     

     

        

    c

     

     

    展开全文
  • 汇编语言(王爽)实验十 编写子程序

    万次阅读 多人点赞 2016-07-28 16:09:21
    标 题:汇编实验10—— 编写子程序 作 者: XHS_12302 时 间: 链 接: 实验10编写子程序 在这次实验中,我们将要编写3个子程序,通过它们来认识几个常见的问题和掌握解决这些问题的方法。同前面的所有实验一样,...

    标 题: 汇编实验10—— 编写子程序
    作 者: XHS_12302
    时 间: 2016_7_28 16:56

     

     

     

     

     

    实验10编写子程序


      在这次实验中,我们将要编写3个子程序,通过它们来认识几个常见的问题和掌握解决这些问题的方法。同前面的所有实验一样,这个实验是必须要独立完成的,在后面的课程中,将要用到这个实验中编写的3个子程序。
    1.  显示字符串
    问题
    显示字符串是现实工作中经常要用到的功能,应该编写一个通用的子程序来实现这个功能。我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。

    提示
    (1)  子程序的入口参数是屏幕上的行号和列号,注意在子程序内部要将它们转化为显存中的地址,首先要分析一下屏幕上的行列位置和显存地址的对应关系:
    (2)  注意保存子程序中用到的相关寄存器:
    (3)  这个子程序的内部处理和显存的结构密切相关,但是向外提供了与显存结构无关的接口。通过调用这个子程序,进行字符串的显示时可以不必了解显存的结构,为编程提供了方便。在实验中,注意体会这种设计思想。

    子程序描述
    名称:show_str
    功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
    参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),
        (cl)=颜色,ds:si指向字符串的首地址
    返回:无
    就用举例:在屏幕的8行3列,用绿色显示data段中的字符串。

     

     

     

     

    代码:

     

    assume cs:code
       data segment
       db 'Welcome to masm!',0
       data ends
    
     code segment
       start:  mov dh,8
               mov dl,3
               mov cl,2
               mov ax,data
               mov ds,ax
               mov si,0
               call show_str
               mov ax,4c00h
               int 21h
       show_str: push dx
                 push cx
                 push ds
                 push si
    
         mov ax,0b800h
         mov es,ax
         
         mov al,160
         mul dh
         mov bx,ax
         mov al,2
         mul dl
         add bx,ax
        mov al,cl
        
             s: mov cl,[si] 
                  jcxz ok
                  mov dx,[si]
                  mov es:[bx],dx
                  mov es:[bx+1],al
                  inc si
                  add bx,2
                  loop s
    
     ok:             
      pop si
      pop ds
      pop cx
      pop dx
    ret
    code ends
    end start 

     

     

    实验截图

     

     

     

    2.  解决除法溢出的问题
    问题
    前面讲过,div指令可以做除法。当进行8位除法的时候,用al存储结果的商,ah存储结果的余数:进行16位除法的时候,用ax存储结果的商,dx存储结果的余数。可是,现在有一个问题,如果结果的商大于ah或ax所能存储的最大值,那么将如何?
    比如,下面的程序段:
     mov bh,1
     mov ax,1000
     div bh
    进行的是8位除法,结果的商为1000,而1000在ah中放不下,
    又比如,下面的程序段:
    mov ax,1000h
    mov dx,1
    mov bx,1
    div bx
    进行的是16位除法,结果的商为11000H,而11000H在ax中存放不下。
    我们在用div指令做除法的时候,很可能发生上面的情况:结果的商过大,超出了寄存器所能存储的范围。当CPU执行div等除法指令的时候。如果发生这样的情况,将引发CPU的一个内部错误。这个错误被称为:除法溢出。我们可以通过特殊的程序来处理这个错误, 这里我们不讨论这个错误的处理,这是后面的课程中要涉及的内容。

    好了,我们已经清楚了问题的所在:用div指令做除法的时候可能产生除法溢出。由于有这样的问题,在进行除法运算的时候要注意除数和被除数的值,比如1000000/10就不能用div指令来计算。那么怎么办呢?我们用下面的子程序divdw解决。


    子程序描述
    名称:divdw
    功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
    参数:(ax)=dword型数据的低16位
        (dx)=dword型数据的高16位
        (cx)=除数
    返回:(dx)=结果的高16位,(ax)=结果的低16位
        (cx)=余数
    应用举例:计算1000000/10(F4240H/0AH)

      mov ax,4240h
      mov v dx,000fh
      mov cx,0ah
      call divdw


    提示
    给出一个公式:
    X:被除数,范围:[0,FFFF FFFF]
    N:除数,范围:[0,FFFF]
    H:X高16位,范围:[0,FFFF]
    L:X低16位,范围:[0,FFFF]
    int():描述性运算符,取商,比如:rem(38/10)=8
    rem():描述性运算符,取答数,比如:rem(38/10)=8
    公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
    这个公式将可能产生溢出的除法运算:X/N,转变为多个不会产生溢出的除法运算。
    公式中,等号右边的所有除法运算都可以用div指令来做,肯定不会导致除法溢出。

    代码:

     

    assume cs:code
        code segment
        start:mov ax,4240h
              mov dx,000fh
              mov cx,0Ah
              call divdw
              mov ax,4c00H
              int 21h
    divdw:
          push ax
          mov ax,dx
          mov dx,0
          div cx
          mov bx,ax
          pop ax
          div cx
          mov cx,dx
          mov dx,bx
          ret    
        code ends
    end start

     

     

     

    程序截图:

     

    3.数值显示
    问题
    编程,将data段中的数据以十进制的形式显示出来。
    data segment
    dw 123,12666,1,8,3,38
    data ends
      这些数据在内存中都是二进制信息,标记了数值的大小。要把它们显示到屏幕上,成为我们能够读懂的信息,需要进行信息的转化。比如,数值12666,在机器中存储为二进制信息:0011000101111010B(317AH),计算机可以理解它。而我们要在显示器上读到可以理解的数值12666,我们看到的应该是一串字符:“12666”。由于 显卡遵循的是ASCII编码,为了让我们能在显示器上看到这串字符,它在机器中应以ASCII码的形式存储为:31H、32H、36H、36H、36H(字符“0”~“9”对应的ASCII码为30H~39H)。
      通过上面的分析可以看到,在概念世界中,有一个抽象的数据12666,它表示了一个数值的大小。在现实世界中它可以有多种表示形式,可以在电子机器中以高低电平(二进制)的形式存储,也可以在纸上、黑板上、屏幕上以人类的语言“12666”来书写。现在,我们面临的问题就是,要将同一抽象的数据,从一种表示形式转化为另一种表示形式。
      可见,要将数据用十进制形式显示到屏幕上,要进行两步工作:
    (1)  将用二进制信息存储的数据转变为十进制形式的字符串:
    (2)  显示十进制形式的字符串。
    第二步我们在本次实验的第一个子程序中已经实现,在这里只要调用一下show_str即可。我们来讨论第一步,因为将二进制信息转变为十进制形式的字符串也是经常要用到的功能,我们应该为它编写一个通用的子程序。


    子程序描述
    名称:dtoc
    功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符。
    参数:(ax)=word型数据
        ds:si指向字符串的首地址
    返回:无
    应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。
    在显示时我们调用本次实验中的第一个子程序show-str。



    提示
      下面我们对这个问题进行一下简单地分析。
    (1)  要得到字符串“12666”,就是要得到一列表示该字符的ASCII码:31H、32H、36H、36H、36H。
    十进制数码字符对应的ASCII码=十进制数码值+30H
    要得到表示十进制数的字符串,先求十进制数每位的值。
    例:对于12666,先求得每位的值:1、2、6、6、6。再将这些数分别加上30H,便得到了表示12666的ASCII码串:31H、32H、36H、36H、36H。
    (2)  那么,怎样得到每位的值呢?采用如图10.2所示的方法。

    图10.2除10取余法示意


      可见,用10除12666,共除5次,记下每次的余数,就得到了每位的值。
    (3)  综合以上分析,可得出处理过程如下:
    用12666除以10,循环5次,记下每次的余数;将每次的余数分别加30H,便得到了表示十进制数的ASCII码串,如图10.3所示。



    图10.3得到十进制每位数字字符的方法示意

     


    (4)  对(3)的质疑:
    在已知数据是12666的情况下,知道进行5次循环。可在实际问题中,数据的值是多少
    程序员并不知道,也就是说,程序员不能事先确定循环次数。
      那么,如何确定数据各位的值已经全部求出了呢?我们可以看出,只要是除到商为0,各位的值就已经全部求出。可以使用jcxz指令来实现相关的功能。

     

     

     

     

     

    代码:

     

    assume cs:code
      data segment
      db 16 dup(0)
      data ends
    
     
      code segment
        start:mov ax,12666
              mov bx,data
              mov ds,bx
              mov si,0
              call dtoc
              mov dh,8
              mov dl,3
              mov cl,2
              call show_str
              mov ax,4c00h
              int 21h
    dtoc:
           mov cx,ax    ;17
           jcxz bk
           push ax
           mov al,ah
           mov ah,0
           mov bl,10
           div bl
           mov cl,al
           mov ch,ah
           pop ax
           mov ah,ch
           div bl
           mov dl,ah
           mov dh,0
           push dx
           mov ah,cl
           jmp short dtoc   ;29
         bk:pop ax 
            add ax,30h
            mov [si],al
            
            pop ax 
            add ax,30h
            mov [si+1],al
           
            pop ax 
            add ax,30h
            mov [si+2],al
            
            pop ax 
            add ax,30h
            mov [si+3],al    ;44
            
            pop ax 
            add ax,30h
            mov [si+4],al
            mov byte ptr [si+5],0
            ret
           
         
    show_str:
         mov si,0
         mov ax,0b800h
         mov es,ax
         
         mov al,160
         mul dh
         mov bx,ax
         mov al,2
         mul dl
         add bx,ax
         mov al,cl
        
             s: mov cl,[si] 
                  jcxz ok
                  mov dx,[si]
                  mov es:[bx],dx
                  mov es:[bx+1],al
                  inc si
                  add bx,2
                  loop s
    
     ok: ret    
      code ends
    end start


    程序运行截图

     

     

    至此    实验完成    

                               题中有不足之处  希望不吝赐教

                                             文中有的 文字是借鉴别人的    除了代码和截图

                                                 完成实验参考过别的资料,在第二个实验中受过小甲鱼视频(328/2)的启发

                                                                                                   视频资料上云盘找:链接: http://pan.baidu.com/s/1nvpQiLz 密码: et5r

                                                                                                                                                                                                                                     日期:2016_7_28

    展开全文
  • 汇编语言王爽汇编语言王爽汇编语言王爽汇编语言王爽汇编语言王爽汇编语言王爽汇编语言王爽汇编语言王爽汇编语言王爽汇编语言王爽汇编语言王爽汇编语言王爽
  • 机器语言、汇编语言(低级语言)、高级语言 【原文:https://zhuanlan.zhihu.com/p/37524989】 编程语言的机器级表示:机器语言、汇编语言、高级语言 ​ 首先下面一张图是C语言、汇编语言以及翻译过的机器语言,大家...
  • C语言指针与汇编内存地址(二)

    千人学习 2016-05-26 10:37:35
    C语言指针与汇编内存地址视频教程,该课程学习和使用过C语言的程序员都认为要做到对指针这一概念的透彻理解和灵活运用相当困难。本课程会详细讲解C语言与指针、以及如何查看汇编内存等C语言高级教程内容。
  • 汇编语言初步理解

    千次阅读 多人点赞 2016-04-17 14:06:59
    汇编破处
  • 汇编语言实验2-汇编语言程序框架

    千次阅读 2017-03-31 20:17:35
    学会由汇编语言源程序到可执行文件的生成过程,学会用Debug运行程序 学会在程序中操作栈的方法 学会用loop指令编制循环程序解决简单问题 学会用bx和loop指令配合访问连贯的内存空间 2. 实验内容任务1-编制第一个汇编...
  • 在键盘上输入两个一位数,在屏幕上显示它们的积。stack segment db 200 dup(0)stack endscode segment assume cs:code,ss:stackbegin: mov ah,1 int 21h ;从键盘输入第一个数字al mov bl,al mov ...
  • 汇编语言程序vs. 汇编程序

    千次阅读 2016-12-02 13:37:48
    汇编语言程序vs. 汇编程序@(组成原理)这是个常常被人拿来挖坑的地方。汇编语言程序就是你用汇编语言写的文本型的程序,我们说用一堆助记符来写的源代码。汇编程序是汇编阶段用来把汇编语言翻译成机器语言指令的程序...
  • 汇编语言程序设计

    千人学习 2017-03-01 22:19:38
    汇编语言是一门低级程序设计语言,在数以千计的计算机语言中,有着不可替代的重要地位,广泛地用于开发操作系统内核、设备驱动程序等。随着近年来物联网、嵌入式系统的发展,汇编语言在行业中的地位也再次攀升,在...
  • 汇编语言入门

    万次阅读 多人点赞 2017-08-01 20:55:22
    学习汇编前你应该知道的知识   1、汇编需要什么工具和程序,到哪里下载?  目前阶段,汇编程序仅需要两个程序就够了。masm.exe,link.exe。 前者是编译程序,后者是链接程序。另外,为了验证和调试程序,还...
  • 汇编语言的所有指令

    万次阅读 多人点赞 2017-11-11 09:43:15
    1、数据传送指令集MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG ...语法
  • 汇编语言之歌

    千次阅读 2020-04-14 08:53:43
    汇编语言课上,让同学们分组搞一个创作,以此调剂调剂,天天上网课的同学们需要释放一下。  我的学生黄倩颖,代表第4组,创作了这首《assembler language》。  70后表示喜欢00后的作品。 上视频—— 附歌词——...
  • 汇编,汇编语言,汇编程序概念

    千次阅读 2009-12-11 09:04:00
    汇编语言是第一个计算机语言.该语言实际上是计算机处理器运行的指令的命令形式表示法.(这意味着你将与处理器的底层打交道,比如寄存器和堆栈).它等价于C,C语言概念.把汇编语言翻译成真实的机器码的工具叫"汇编程序". ...
  • 汇编语言汇编语言有什么区别

    千次阅读 2018-11-18 08:50:21
    宏汇编属于汇编语言。宏汇编本人理解就是再给取个名,便于编写程序。 例如某人叫二狗子,签名时候写二狗子不行(叫二狗子的太多了),就要取个大名,但得到公安局登记。宏汇编就相当于公安局。 ...
  • 8086汇编语言讲座

    千人学习 2018-03-20 10:20:26
    关于8086汇编语言,是与计算机原理相结合的,通过汇编语言可以加深对计算机原理的掌握和理解。 另外汇编语言还是可以干成事的,比如破解,外挂等都会用到它。
  • 汇编语言】纯汇编语言编写打飞机小游戏

    万次阅读 多人点赞 2015-08-10 10:01:10
    上学期汇编语言的期末考核可选的一项是用纯汇编语言编写一个小游戏,喜欢动手的我当然首选这个了。小游戏当中用来练手的,一般有贪吃蛇、俄罗斯方块、打飞机之类的咯,于是我选择了其中一个——打飞机!咳咳,选择它...
  • 汇编语言程序设计II

    千人学习 2017-03-01 22:27:52
    汇编语言是一门低级程序设计语言,在数以千计的计算机语言中,有着不可替代的重要地位,广泛地用于开发操作系统内核、设备驱动程序等。随着近年来物联网、嵌入式系统的发展,汇编语言在行业中的地位也再次攀升,在...
  • 汇编语言程序设计VI

    千人学习 2017-05-17 09:24:04
    汇编语言是一门低级程序设计语言,在数以千计的计算机语言中,有着不可替代的重要地位,广泛地用于开发操作系统内核、设备驱动程序等。随着近年来物联网、嵌入式系统的发展,汇编语言在行业中的地位也再次攀升,在...
  • win10配置汇编语言环境(王爽汇编语言环境)

    千次阅读 多人点赞 2019-03-30 16:47:20
    win10配置汇编语言环境(王爽汇编语言环境) 前言 有不少童鞋在学习“汇编语言”这门课程时,不太满足于课本上的理论知识,想要亲自上机实践一下,从而更能够更深刻的理解汇编语言的基本原理。然而,大多数同学...
  • 汇编语言程序设计VII

    千人学习 2017-06-20 21:43:21
    汇编语言是一门低级程序设计语言,在数以千计的计算机语言中,有着不可替代的重要地位,广泛地用于开发操作系统内核、设备驱动程序等。随着近年来物联网、嵌入式系统的发展,汇编语言在行业中的地位也再次攀升,在...
  • 汇编语言程序设计V

    千人学习 2017-03-30 12:01:38
    汇编语言是一门低级程序设计语言,在数以千计的计算机语言中,有着不可替代的重要地位,广泛地用于开发操作系统内核、设备驱动程序等。随着近年来物联网、嵌入式系统的发展,汇编语言在行业中的地位也再次攀升,在...
  • 汇编语言程序设计III

    千人学习 2017-03-08 20:16:58
    汇编语言是一门低级程序设计语言,在数以千计的计算机语言中,有着不可替代的重要地位,广泛地用于开发操作系统内核、设备驱动程序等。随着近年来物联网、嵌入式系统的发展,汇编语言在行业中的地位也再次攀升,在...
  • 汇编语言程序设计IV

    千人学习 2017-03-14 21:48:59
    汇编语言是一门低级程序设计语言,在数以千计的计算机语言中,有着不可替代的重要地位,广泛地用于开发操作系统内核、设备驱动程序等。随着近年来物联网、嵌入式系统的发展,汇编语言在行业中的地位也再次攀升,在...

空空如也

1 2 3 4 5 ... 20
收藏数 107,152
精华内容 42,860
关键字:

汇编