汇编语言---从入门到精通

一、基础知识

1.1机器、汇编与高级语言

       机器语言是机器指令的合集,电子计算机的机器指令是一列二进制数字,计算机将其转变为高低电平,早期的程序设计使用的是机器语言,程序员用0和1进行编程。

        汇编语言,汇编语言的主体是汇编指令,汇编指令和机器指令的区别是在于指令的表示方法,汇编指令是机器指令便于记忆的书写格式。

操作:将寄存器BX的内容送到AX中

机器指令;1000100111011000

汇编指令:mov ax,bx

       至此,程序员便用汇编语言开始书写源程序,但对于计算机来说,只能读懂机器指令,这时就需要一个能够将汇编指令转化为机器指令的编译器,实现转化的功能。

        高级语言,在汇编语言的基础上,形成了一种更加容易理解的语言,因为汇编语言只有相对专业的人员在使用。

1.2存储器与存储单元

        在计算机硬件中,有个很重要的核心部件---CPU,它是控制整个计算机的运作,并进行计算。要想让CPU工作,就得向它的提供指令与数据,指令与数据在内存中存放(指令与数据没有什么区别都是二进制信息)。在此我们可以将存储器认为是内存,数据与指令都在内存中存放。

        存储器有若干个存储单元,一个存储单元中存储一个字节,一个字节8个比特,一个比特代表一个二进制位。每个存储单元从0开始进行编号,一个存储器有256个存储单元,则编号从0-256,编号的作用是便于对内存中数据的访问。

1.3CPU对存储器的读写

        当CPU需要指令或数据时需要从存储器中进行读取,那么如何读取呢?这里有三点需要注意:1、从哪读取。2、怎样读取。3、读取信息。

        从哪读取:即为需要读取(指令或数据的地址),存储器很大,存储单元也很多,且具有编号,我们首先要指定读取存储单元的地址。

        怎样读取:在微机中,器件很多,CPU在读写数据时还需要指明,对那个器件进行操作,进行那种操作,是都还是写。

        读取信息:确定好存储器,存储单元以及读写的方式,进行信息的读取。

        这三个问题对应三种信息:

存储单元地址(地址信息)

器件的选择、读或写命令(控制信息)

读或写的数据(数据信息)

   确定好这些信息后,只需要将CPU与内存连接,通过这些信息实现数据的交换。

        CPU与内存的连接 ,靠的都是总线(实质是导线),从物理上讲,总线就是一根根导线的集合,但从逻辑功能来讲,总线又可分为地址总线、控制总线以及数据总线。

        CPU读取信息的过程:

  1. CPU通过地址总线将地址信息发出;
  2. CPU通过控制总线发出“读”命令,选中存储器件;
  3. 存储器将对应地址信息的数据通过数据总线送入CPU。

 1.4地址、数据以及控制总线

        地址总线:用于寻找内存的地址,地址总线能传送多少不同的信息,CPU就能对多少存储单元进行寻址,也就是说地址总线的宽度,决定了寻址的范围。

        数据总线:用于将CPU与器件之间的数据传递,数据总线的宽度决定了CPU与外接的数据传送速度。

        控制总线:CPU对外部器件的控制,控制总线的宽度决定了CPU对外部期间的控制能力。

1.5内存地址空间

        对于一个计算机来讲,其内部的存储器有多个,每个的功能都是不同的在物理上来说也都是独立的器件,但是对于CPU来讲系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量收CPU寻址能力的限制,这个逻辑存储器即为内存地址空间。

二、寄存器

        上面我们讨论的主要是,CPU与其他器件进行的信息传递,这节我们学习CPU内部的一些相关知识。

        CPU内部主要有:寄存器、控制器、运算器等器件构成,这些器件之间也是通过总线相连的,不过这些总线是CPU内部的总线,实现的是CPU内部各个器件之间的联系。

运算器:进行信息的处理;

寄存器:进行信息的存储;

控制器:用于控制各种器件进行工作;

内部总线:用于连接各种器件,在它们之间进行数据的传送;

程序员通过改变寄存器的内容来实现对CPU的控制。 

        不同的CPU寄存器的个数、结构是不同的。8086中有14个寄存器,分别为:AX,BX,CX,DX,CS,SS,DS,ES,SI,DI,SP,BP,IP,PSW.

2.1通用寄存器

        8086的寄存器是16位的,可以存放两个字节,其中AX,BX,CX,DX这4个寄存器为通用寄存器,用于存放一般性的数据。

    8086之前的CPU中寄存器的位数为8位,因此为了保证兼容性,使原来上一代CPU编写的程序稍加修改可以继续运行,AX,BX,CX,DX这四个寄存器都可分为两个独立的8位寄存器使用。

AX可分为AH与AL; 

BX可分为BH与BL; 

CX可分为CH与CL; 

DX可分为DH与DL;

AH称为高八位寄存器,AL称为低八位寄存器; 

 在AX寄存器中,存储20000,并且分别用AH与AL观察;

        在16位寄存器与8位寄存器的数据存储情况为:

寄存器寄存器中的数据所表示的值
AX010011100010000020000(4E20H)

AH

0100111078(4EH)
AL0010000032(20H)

 此时,寄存器AH、AL作为两个寄存器单独使用,互不干扰。

2.2汇编指令

通过汇编指令控制CPU进行进行计算,在此我们列出常见的几个指令;

汇编指令控制CPU完成的操作用高级语言的语法描述
mov ax,18将18送入寄存器AXAX=18
mov ah,78将78送入寄存器AHAH=78
add ax,8将寄存器AX中的数值加8AX=AX+8
mov ax,bx将寄存器BX的数据送入寄存器AX中AX=BX
add ax,bx将AX和BX的数值相加,结果存在AX中AX=AX+BX

在写一条汇编指令或者寄存器的名称时,不区分大小写;

执行下方的汇编指令,其相关寄存器的数据内容为:设寄存器AX、BX初始值均为(0000H)

程序中的指令执行后寄存器AX中的数据执行后寄存器BX中的数据
mov ax,4E20H4E20H0000H
add ax,1406H6226H0000H
mov bx,2000H6226H2000H
add ax,bx8226H2000H
mov ax,bx8226H8226H
add ax,bx?8226H

         在上述汇编指令的最后一条指令add ax,bx中,执行前ax=8226H,bx=8226H相加之后所得的值为:1044CH,但是ax为16为寄存器,只能存放4为16进制的数据,所以最高位的1不能保存在ax中,ax的数据为:044CCH。

        此处我们想说明的是,当存入寄存器的值超过寄存器的位数时,存储的数值从低位往进放,高位舍弃。

        执行下方的汇编指令,其相关寄存器的数据内容为:设寄存器AX、BX初始值均为(0000H)

程序中的指令指令执行后AX中的数据指令执行后BX的数据
move ax,001AH001AH0000H
move bx 0026H001AH0026H
add al,bl0040H0026H
add ah,bl2640H0026H
add bh,al2640H4026H
move ah,00040H4026H
add al,85H00C5H4026H
add al,93H?4026H

        在上述汇编指令中,最后一条指令的计算add al,93H,在执行前al中数据为C5H,相加之后的值为158H,al寄存器是8位寄存器,只能存放两位16进制的数据,所以最高位的1丢失,ax的数据位为0058H,注意,此时al作为一个独立的8位寄存器来使用,和ah没有关系,CPU在执行这条指令时认为ah与al是两个不相关的寄存器,不要错误的认为al产生进位后会存储到ah中,add al ,93H进行的是8位运算。

2.3物理地址

        前面我们讲过,在CPU访问内存单元时,要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有一个唯一的地址,这个地址被称为物理地址

        CPU通过地址总线将一个内存单元的物理地址送入存储器,在送入之前,必须在CPU内部产生这个地址,不同的CPU产生物理地址的方式是不同的。

2.4 8086CPU

8086CPU是16位结构的CPU,这16位结构指的是什么呢?

1、运算器一次最多可以处理16位的数据;

2、寄存器的最大宽度为16位;

3、寄存器与运算器之间的通路是16位;

        这也就是说,宰086内部能够一次性处理、传输、暂时存储的信息最大长度是16位。对于16位CPU,能一次性处理、传输的地址也是16位的。

2.5 8086CPU产生物理地址的方法

         8086CPU有20位地址总线,这也就是说明可以传送20位地址,寻址能力为(2^20字节)1MB,但是8086CPU又是16位结构,如何在16位结构内部产生20位地址,是我们本节讨论的内容。

        8086CPU采用一种在内部用两个16位地址合成的方法形成一个20位的地址。

        在8086CPU需要一个20位的物理地址时,CPU的相关部件会提供两个16位的地址,一个称为段地址,一个称为偏移地址。两个地址通过CPU内部总线送至地址加法器中,地址加法器将两个16位地址合成为一个20位的物理地址。再通过内部总线送至输入输出控制电路,通过地址总线将20位物理地址传送至存储器中。

        地址加法器产生物理地址方法为:物理地址=段地址×16+偏移地址;具体操作如下:

        8086CPU想要访问物理地址为12345H的内存单元,此时CPU的地址加法器的工作方式为:

        1、相关器件提供段地址与偏移地址;;

        2、段地址和偏移地址送入地址加法器;

        3、段地址×16;

        4、段地址×16+偏移地址,得出物理地址;

        5、输入物理地址。

        在此说明一个X进制的数据左移1位,相当于乘X;用16进制来表示对应的二进制数,乘以16相当于左移一位。

        2.6段地址偏移地址的本质

        “段地址×16+偏移地址=物理地址”的本质含义是:CPU在访问内存单元时,用一个基础地址(段地址×16)和一个相对基础地址的偏移地址相加,给出内存单元的物理地址。

举例说明:

        现在我们利用纸条进行传信,传递的信息是1234,如果我有一张可以容纳4位数字的纸条,我可以直接写下1234,但是如果我们没有可以容纳4位的纸条,只有两张容纳3位的纸条。那么我们只能写下100(段地址)与234(偏移地址)。并且我们对事先做了约定,得到两张纸条后,做运算:段地址(100)×10+偏移地址(234)=物理地址(1234)。

        这里还需要注意的是,内存中是没有实质“段”这个划分的,段的划分来自于CPU,将若干个地址的连续的内存单元看作是一个段,我们自己将一段内存定义为一个段,用段地址指示段,用偏移地址访问段内的单元。

如果用一个段存放数据,则定义为:“数据段”;

如果用一个段存放代码,则定义为:“代码段”;

如果用一个段存放栈,则定义为:“栈段”;

        总结:本节为汇编语言的入门,汇编语言是很多计算机相关课程的基础,所以打好基础很重要,本节的概念较多,后面我会写一些相关的实验帮助大家更好的理解。

        参考资料:《汇编语言》第四版--王爽老师著

        创作不易,还请大家多多点赞支持!!

        

课程介绍 第1章 预备知识  1.1 汇编语言的由来及其特点   1 机器语言   2 汇编语言   3 汇编程序   4 汇编语言的主要特点   5 汇编语言的使用领域  1.2 数据的表示和类型   1 数值数据的表示   2 非数值数据的表示   3 基本的数据类型  1.3 习题 第2章 CPU资源和存储器  2.1 寄存器组   1 寄存器组   2 通用寄存器的作用   3 专用寄存器的作用  2.2 存储器的管理模式   1 16位微机的内存管理模式   2 32位微机的内存管理模式  2.3 习题 第3章 操作数的寻址方式  3.1 立即寻址方式  3.2 寄存器寻址方式  3.3 直接寻址方式  3.4 寄存器间接寻址方式  3.5 寄存器相对寻址方式  3.6 基址加变址寻址方式  3.7 相对基址加变址寻址方式  3.8 32位地址的寻址方式  3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义   1 内存变量定义的一般形式   2 字节变量   3 字变量   4 双字变量   5 六字节变量   6 八字节变量   7 十字节变量  4.3 调整偏移量伪指令   1 偶对齐伪指令   2 对齐伪指令   3 调整偏移量伪指令   4 偏移量计数器的值  4.4 复合内存变量的定义   1 重复说明符   2 结构类型的定义   3 联合类型的定义   4 记录类型的定义   5 数据类型的自定义  4.5 标号  4.6 内存变量和标号的属性   1 段属性操作符   2 偏移量属性操作符   3 类型属性操作符   4 长度属性操作符   5 容量属性操作符   6 强制属性操作符   7 存储单元别名操作符  4.7 表达式   1 进制伪指令   2 数值表达式   3 地址表达式  4.8 符号定义语句   1 等价语句   2 等号语句   3 符号名定义语句  4.9 习题 第5章 微机CPU的指令系统  5.1 汇编语言指令格式   1 指令格式   2 了解指令的几个方面  5.2 指令系统   1 数据传送指令   2 标志位操作指令   3 算术运算指令   4 逻辑运算指令   5 移位操作指令   6 位操作指令   7 比较运算指令   8 循环指令   9 转移指令   10 条件设置字节指令   11 字符串操作指令   12 ASCII-BCD码调整指令   13 处理器指令  5.3 习题 第6章 程序的基本结构  6.1 程序的基本组成   1 段的定义   2 段寄存器的说明语句   3 堆栈段的说明   4 源程序的结构  6.2 程序的基本结构   1 顺序结构   2 分支结构   3 循环结构  6.3 段的基本属性   1 对齐类型   2 组合类型   3 类别   4 段组  6.4 简化的段定义   1 存储模型说明伪指令   2 简化段定义伪指令   3 简化段段名的引用  6.5 源程序的辅助说明伪指令   1 模块名定义伪指令   2 页面定义伪指令   3 标题定义伪指令   4 子标题定义伪指令  6.6 习题 第7章 子程序和库  7.1 子程序的定义  7.2 子程序的调用和返回指令   1 调用指令   2 返回指令  7.3 子程序的参数传递   1 寄存器传递参数   2 存储单元传递参数   3 堆栈传递参数  7.4 寄存器的保护与恢复  7.5 子程序的完全定义   1 子程序完全定义格式   2 子程序的位距   3 子程序的语言类型   4 子程序的可见性   5 子程序的起始和结束操作   6 寄存器的保护和恢复   7 子程序的参数传递   8 子程序的原型说明   9 子程序的调用伪指令   10 局部变量的定义  7.6 子程序库   1 建立库文件命令   2 建立库文件举例   3 库文件的应用   4 库文件的好处  7.7 习题 第8章 输入输出和中断  8.1 输入输出的基本概念   1 I/O端口地址   2 I/O指令  8.2 中断   1 中断的基本概念   2 中断指令   3 中断返回指令   4 中断和子程序  8.3 中断的分类   1 键盘输入的中断功能   2 屏幕显示的中断功能   3 打印输出的中断功能   4 串行通信口的中断功能   5 鼠标的中断功能   6 目录和文件的中断功能   7 内存管理的中断功能   8 读取和设置中断向量  8.4 习题 第9章 宏  9.1
比较字符串可以使用汇编语言中的指令来实现。以下是一个比较字符串的汇编程序示例: ``` section .data str1 db 'hello', 0 str2 db 'world', 0 section .text global _start _start: mov esi, str1 ; 将 str1 的地址存储在 esi 中 mov edi, str2 ; 将 str2 的地址存储在 edi 中 cmp_loop: mov al, [esi] ; 将 esi 指向的字符存储在 al 中 mov bl, [edi] ; 将 edi 指向的字符存储在 bl 中 cmp al, bl ; 比较两个字符 jne not_equal ; 如果不相等,跳转到 not_equal 标签 cmp al, 0 ; 如果两个字符相等,检查是否是字符串的结尾 je equal ; 如果是字符串的结尾,跳转到 equal 标签 inc esi ; 指向下一个字符 inc edi jmp cmp_loop ; 继续比较下一个字符 not_equal: ; 如果不相等,输出提示信息并退出程序 mov eax, 4 mov ebx, 1 mov ecx, msg_not_equal mov edx, msg_not_equal_len int 0x80 mov eax, 1 xor ebx, ebx int 0x80 equal: ; 如果相等,输出提示信息并退出程序 mov eax, 4 mov ebx, 1 mov ecx, msg_equal mov edx, msg_equal_len int 0x80 mov eax, 1 xor ebx, ebx int 0x80 section .data msg_not_equal db 'Strings are not equal', 0xA msg_not_equal_len equ $ - msg_not_equal msg_equal db 'Strings are equal', 0xA msg_equal_len equ $ - msg_equal ``` 这个程序可以比较两个字符串 `str1` 和 `str2` 是否相等。程序先将 `str1` 和 `str2` 的地址分别存储在 `esi` 和 `edi` 中,然后逐个比较两个字符串中的字符。如果有字符不相等,程序就会输出提示信息并退出。如果两个字符串完全相等,程序也会输出提示信息并退出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值