汇编

青春壹個敷衍的年華 提交于 2020-04-06 22:00:40

一、介绍

  • 汇编语言是一种面向机器的低级程序设计语言
  • 汇编语言以助记符形式表示每一条计算机指令
    • 助记符是便于人们记忆、并能描述指令功能和指令操作数的符号
    • 助记符一般就是表明指令功能的英语单词或其缩写
    • MOV AX , 30H
      ADD AX , 50H
      MOV [2100H] , BX
      HLT

       

  • 汇编语言的主要特点:
    • 汇编语言程序与处理器指令系统密切相关
    • 程序员可直接、有效的控制硬件系统
    • 形成的可执行文件运行速度快、占用主存容量少
  • 汇编语言程序中可以出现不同进制的数,但一定要有标识字母加以区别
  • 数据的组织形式:位(bit)、字节(Byte)、字(Word)、双字(Dword)
  • 无论是数据还是指令在计算机中都是以二进制形式存放的
  • 无符号整数——所有有效位都当作数值处理,当然这样的数全部都是正数,故不保留符号位,常用于表示地址,或运算中表示计数值等
  • ASCII编码——在内存中使用一个字节(8位二进制数)存放一个字符(它的ASCII码),最高位没用(写0).在通信过程中最高位有时用于奇偶校验
    • 数码0~9:30H~39H
    • 大写字母A~Z:41H~5AH
    • 小写字母a~z:61H~7AH
    • 空格:20H
  • 带符号数的表示方法——采用补码表示法(补码存储、补码运算) 
  • 与、或、异或、非运算

二、计算机硬件相关知识

1、硬件

  • 中央处理单元CPU
    • 控制器、运算器、寄存器
  • 存储器
    • 主存储器:RAM和ROM
    • 辅助存储器:磁盘、光盘、U盘
  • 外部设备
    • 输入设备和输出设备

2、软件

  • 系统软件
  • 应用软件

3、寄存器、存储器地址、端口(I/O地址)

  • AX BX CX DX SI DI BP SP(16位)
  • EAX EBX ECX EDX ESI EDI EBP ESP(32位)
  • 存储器是由大量存储单元组成,需要用编号区别每个单元:编号=地址
  • 存储器地址是存储器中存储单元的编号
  • 每个存储单元存放一个字节量的数据,一个字节B(Byte)=8个二进制位数b(bit)
  • 采用十六进制数来表示地址
    • 存储器地址表示为:00000H~FFFFFH
    • 其中大写H(或小写h)表示十六进制数
  • I/O接口电路由接口寄存器组成,需要用编号区别各个寄存器:编号=地址
  • I/O地址是接口电路中寄存器的编号
DATA SEGMENT
    ...
DATA ENDS

CODE SEGMENT
         ASSUME ...
START:
    ...
    ...
CODE ENDS
          END START
  • 数据寄存器用来存放计算的结果和操作数,也可以存放地址
  • 每个寄存器又有他们各自的专用目的
    • EAX——累加器,使用频度最高,用于算数、逻辑运算以及与外设传送信息等
    • EBX——基址寄存器,常用作存放存储器地址
    • ECX——计数器,作为循环和串操作等指令中的隐含计数器
    • EDX——数据寄存器,常用来存放双字长数据的高16位,或存放外设端口地址
  • 变址寄存器常用于存储器寻址时提供的地址
    • ESI是源变址寄存器
    • EDI是目的变址寄存器
  • 指针寄存器用于寻址内存堆栈内的数据
    • ESP为堆栈指针寄存器,指示栈顶的偏移地址,不能再用于其他目的,具有专用目的
    • EBP为基址指针寄存器,表示数据在堆栈段中的基地址
  • ESI和EDI在串操作指令有特殊用法
  • ESP和EBP寄存器与SS段寄存器联合使用确定堆栈段中的存储单元地址
  • 堆栈(Stack)
    • 堆栈是主存中一个特殊区域
    • 它采用先进后出FILO或后进先出LIFO的原则进行存取操作,而不是随机存取操作的方式
    • 堆栈通常由处理器自动维持
    • 在80X86中,由堆栈段寄存器SS和堆栈指针寄存器ESP共同指示
  • 指令指针EIP
    • 指令指针寄存器EIP,指示代码段中指令的偏移地址
    • 它与代码段寄存器CS联用,确定下一条指令的物理地址
    • 计算机通过CS:EIP寄存器来看你告知指令序列的执行流程
    • EIP寄存器是一个专用寄存器
      •  程序连续自动执行的关键
  • 标志寄存器
    • 标志(EFlag)用于反映指令执行结果或控制指令执行形式
    • 8086处理器的各种标志形成了一个16位的标志寄存器FLAGS(程序状态字PSW寄存器)

 

15···12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF

    • 状态标志——用来记录程序运行结果的状态信息,许多指令的执行都将相应的设置它

 

CF   ZF    SF   PF   OF   AF

 

    • 控制标志——可由程序根据需要用指令设置,用于控制处理器执行指令的方式

 

DF    IF      TF

 

    • 进位标志CF——当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF=1;否则CF=0
    • 零标志ZF——若运算结果为0,则ZF=1,否则ZF=0
    • 溢出标志OF——若算术运算的结果有溢出,则OF=1,否则OF=0
    • 符号标志SF——运算结果最高位为1,则SF=1;否则SF=0
      • 有符号数据用最高有效位表示数据的符号,所以最高有效位就是符号标志的状态
    • 奇偶标志PF——当运算结果最低字节中"1"的个数为零或偶数时,PF=1;否则PF=0
      • PF标志仅反映"1"的个数是偶或奇
    • 方向标志DF——用于串操作指令,控制地址的变化方向
      • 设置DF=0,存储器地址自动增加
      • 设置DF=1,存储器地址自动减少
    • 中断允许标志IF——用于控制外部可屏蔽中断是否可以被处理器响应
      • 设置IF=1,则允许(开)中断
      • 设置IF=0,则禁止(关)中断
      • CLI指令复位中断标志:IF=0
      • STI指令置位中断标志:IF=1
    • 陷阱标志TF——用于控制处理器进入单步操作方式
      • 设置TF=0,处理器正常工作
      • 设置TF=1,处理器单步执行指令
      • 单步执行指令——处理器在每条指令执行结束时,便产生一个编号为1的内部中断,这种内部中断称为单步中断,所以TF也称为单步标志
        • 利用单步中断可对程序进行逐条指令的调试
        • 这种诸条指令调试程序的方法就是单步调试
判断溢出:双符号位法
3AH+7CH                 AAH+7CH
0 0011 1010             1 1010 1010
0 0111 1100             0 0111 1100
————————————           ——————————————
0 1011 0110             0 0010 0110
符号位不同OF=1         符号相同OF=0
CF=0                        CF=1

 

    • 溢出和进位
      • 进位标志表示无符号数运算结果是否超出范围,超出范围后运算结果不正确
      • 溢出标志表示有符号数运算结果是否超出范围,超出范围后运算结果不正确
      • 处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF
      • 应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出
  • 段寄存器
    • CS——代码段寄存器
    • DS——数据段寄存器
    • ES——附加数据段寄存器
    • SS——堆栈段寄存器

4、内存组织结构

  • 计算机中信息的单位
    • 二进制位Bit:存储一位二进制数:0或1
    • 字节Byte:8个二进制位,D7~D0
    • 字Word:16位,2个字节,D15~D0
    • 双字DWord:32位,4个字节,D31~D0
  • 最低有效位LSB:数据的最低位,D0
  • 最高有效位MSB:数据的最高位,对应字节、字、双字分别指D7、D15、D31
  • 存储器需要利用地址区别
    • 每个存储单元都有一个编号;被称为存储器地址(以字节为单位编制)
    • 每个存储单元存放一个字节的内容(8位二进制数)
  • 多字节数据存放方式
    • 多字节数据在存储器中占连续的多个存储单元
    • 存放:低字节存入低地址,高字节存入高地址
    • 表达:用低地址表示多字节数据占据的地址空间
  • 物理地址和逻辑地址
    • 每个物理存储单元有一个唯一的20位编号,即物理地址:00000H~FFFFFH
    • 分段后用户编程时,采用逻辑地址:段基地址:段内偏移地址
  • 段寄存器的作用(8086有4个16位段寄存器,每个段寄存器确定一个逻辑段的起始地址,每种逻辑段均有各自的用途)
    • CS——指明代码段的起始地址
      • 代码段寄存器CS存放代码段的段地址
      • 指令指针寄存器IP指示下条指令的偏移地址
      • 处理器利用CS:IP取得下一条要执行的指令
    • SS——指明堆栈段的起始地址
      • 堆栈段确定堆栈所在的主存区域
      • 堆栈段寄存器SS存放堆栈段的段地址
      • 堆栈指针寄存器SP指示堆栈栈顶的偏移地址
      • 处理器利用SS:SP操作堆栈顶的数据
    • DS——指明数据段的起始地址
      • 数据段存放运行程序所用的数据
      • 数据段寄存器DS存放数据段的段地址
      • 各种主存寻址方式(有效地址EA)得到存储器中操作数的偏移地址
      • 处理器利用DS:EA存取数据段中的地址
    • ES——指明附加段的起始地址
      • 附加段是附加的数据段,也用于数据的保存
      • 附加段寄存器ES存放附加段的段地址
      • 各种主存寻址方式(有效地址EA)得到存储器中操作数的偏移地址
      • 处理器利用ES:EA存取附加段中的数据
      • 串操作指令将附加段作为其目的操作数的存放区域
  • 如何分配各个逻辑段
    • 程序的指令序列必须安排在代码段
    • 程序使用的堆栈一定在堆栈段
    • 程序中的数据默认是安排在数据段,也经常安排在附加段,尤其是串操作的目的区必须是附加段
    • 数据的存放比较灵活,实际上可以存放在任何一种逻辑段中
  • 段超越前缀指令
    • 没有指明时,一般的数据访问在DS段;使用BP访问主存,则在SS段
    • 默认的情况允许改变,需要使用段超越前缀指令

       

       

        
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!