8086汇编——Introduction

一、8086CPU的三种工作模式

  1. 实模式:只有低20位地址线起作用,仅能寻址第一个1MB的内存空间。MS DOS运行于该模式下。
  2. 保护模式:在该模式下,机器可提供虚拟存储的管理和多任务的管理机制。Windows 9x/NT/2000运行与该模式下。
  3. 虚拟8086模式:同时模拟多个8086处理器的工作。

二、8086微机系统的组成

对于汇编程序而言,我们需要关心CPU中的寄存器、存储器地址、端口(I/O地址)。

【内存单元的两个元素】: 地址(编号)和值(内容)。

【字节、字、双字】
多字节数据在存储器中占连续的多个存储单元。低位字节存入低地址,高位字节存入高地址。

字节:8086的内存以字节编址,每个内存单元有唯一的地址(物理地址),可以存放一个字节。
:一个字占据两个连续的字节。
双字:双字占据两个连续的字。

以低地址表示多字节数据存储的位置。

【数据的地址对齐】
字单元安排在偶地址(xxx0B),双字单元安排在模4地址(xx00B)等。

对于非对齐地址的数据,处理器访问时需要多次访问存储器,这样做花费时间较多。

【总线】
8086的系统总线有3种:

  1. 数据总线
  2. 地址总线:8086CPU外部一共有20条地址总线,但在CPU内部一次只能传送16位地址。
  3. 控制总线

【I/O】
I/O地址叫做端口,通常采用十六进制数来表达端口:

  • 8086的I/O端口为16位,可支持64k个8位端口;
  • I/O地址范围为:0000H ~ FFFFH

【8086的功能结构】

  • 总线接口单元BIU:主要负责读取指令和操作数。
  • 执行单元EU:主要负责指令译码和执行。

三、汇编语言程序、汇编程序、连接程序、调试程序

汇编程序:汇编程序将汇编语言源程序翻译(或称作“汇编”)成机器代码目标模块。
.ASM -> .OBJ

注意区分汇编程序与汇编语言源程序。

连接程序:连接程序将汇编后的目标模块转换为可执行程序。

调试程序:调试程序以便排错、分析等。

四、寄存器组

执行单元EU有8个通用寄存器。其中包含1个指令指针寄存器,1个标志寄存器,4个段寄存器。

【16位通用寄存器】
AX、BX、CX、DX、SI、DI、BP、SP
其中AX、BX、CX、DX可以分作高8位和低8位的两个独立寄存器。如:AH和AL。我们对其中8位的操作,并不影响另外对应的8位数据。

1、数据寄存器ax、bx、cx、dx
数据寄存器用来存放计算的结果和操作数,也可以存放地址。
每个寄存器又有它们各自的专用目的。

  • AX——累加器,使用频度最高,用于算术、逻辑运算以及与外设传送信息等;
  • BX——基址寄存器,常用做存放存储器地址;
  • CX——计数器,作为循环和串操作等指令中的隐含计数器;
  • DX——数据寄存器,常用来存放双字长数据的高16位,或存放外设端口地址。

2、变址寄存器si、di
变址寄存器常用于存储器寻址时提供地址

  • SI是源变址寄存器
  • DI是目的变址寄存器
    串操作类指令中,SI和DI具有特别的功能

3、指针寄存器sp、bp
指针寄存器用于寻址内存堆栈内的数据

  • SP为堆栈指针寄存器,指示栈顶的偏移地址。
    SP不能再用于其他目的,具有专用目的。SP始终指向栈顶。
  • BP为基址指针寄存器,表示数据在堆栈段中的基地址。

SP和BP寄存器与SS段寄存器联合使用以确定堆栈段中的存储单元地址

4、堆栈
8086中堆栈通常有处理器自动维持,由堆栈段寄存器SS和堆栈指针寄存器SP共同指示。

5、指令指针寄存器IP
指示代码段中指令的偏移地址。与代码段寄存器CS连用(CS:IP)。

6、标志寄存器
标志(flag)用于反映指令执行结果或控制指令执行形式。

16位的标志寄存器——程序状态字PSW寄存器。

状态标志(6个)——用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它。
CF ZF SF PF OF AF

控制标志(3个)——可由程序根据需要用指令设置,用于控制处理器执行指令的方式。
DF IF TF

  1. 进位标志CF(Carry Flag):当运算结果的最高有效位有进位(加法)或借位(减法)时,CF=1,or CF=0;

  2. 零标志位ZF(Zero Flag):若运算结果为0时,ZF=1,or ZF=0;

  3. 符号标志位SF(Sign Flag):运算结果最高位为1,则SF=1,or SF=0。
    有符号数据用最高有效位表示数据的符号。所以,最高有效位就是符号标志的状态
  4. 奇偶标志位PF(Parity Flag):当运算结果最低字节中“1”的个数为零或偶数时,PF=1;or PF=0。
    PF标志仅反映最低8位中“1”的个数是偶或奇,即使是进行16位字操作。

5.溢出标志OF(Overflow Flag):若算术结果有溢出,OF=1,or OF=0;【什么是溢出?溢出判断】

6.辅助进位标志AF(Auxiliary Carry Flag):运算时D3位(低半字节)有进位或借位时,AF=1,or AF=0。这个标志主要由处理器内部使用,用于十进制算术运算调整指令中,用户一般不必关心。

7.方向标志DF(Direction Flag):用于串操作指令中,控制地址的变化方向:

  • 设置DF=0,存储器地址自动增加;
  • 设置DF=1,存储器地址自动减少。
  • CLD指令复位方向标志:DF=0;
  • STD指令置位方向标志:DF=1。

8.中断允许标志IF(Interrupt-enable Flag):用于控制外部可屏蔽中断是否可以被处理器响应:

  • 设置IF=1,允许中断;
  • 设置IF=0,禁止中断。
  • CLI指令复位中断标志:IF=0;
  • STI指令置位中断标志:IF=1。

9.陷阱标志TF(Trap Flag):用于控制处理器进入单步操作模式:

  • 设置TF=0,处理器正常工作;
  • 设置TF=1,处理器单步执行指令。
    单步执行指令——处理器在每条指令执行结束时,便产生一个编号为1的内部中断。这种内部中断称为单步中断。所以TF也称为单步标志。

7、段寄存器
段地址——段的起始地址的高16位地址。段内再由16位二进制数来寻址。
偏移地址——段内存储单元到段首地址的字节的距离。
物理地址——用20位二进制数表示。地址范围为00000H ~ FFFFFH。物理地址唯一标识一个存储单元。
逻辑地址——段地址:偏移地址,逻辑地址不唯一。
物理地址=段地址x16+偏移地址

8086有4个16位的段寄存器。

  1. 代码段CS(Code Segment):指明代码段的 起始地址。
    代码段用来存放程序的指令序列。指令指针寄存器IP指示下一条指令的偏移地址。处理器利用CS:IP取得下一条要执行的指令。

  2. 堆栈段SS(Stack Segment):指明堆栈段的起始地址。
    堆栈段确定堆栈所在的主存区域。堆栈指针寄存器SP指示堆栈栈顶的偏移地址。处理器利用SS:SP操作堆栈栈顶的数据。

  3. 数据段DS(Data Segment):指明数据段的起始地址。
    数据段存放运行程序所用的数据。各种主存寻址方式(有效地址EA)得到存储器中操作数的偏移地址。处理器利用DS:EA存取数据段中的数据。

  4. 附加段ES(Extra Segment):指明附加段的起始地址。
    附加段是附加的数据段,也用于数据的保存。各种主存寻址方式(有效地址EA)得到存储器中操作数的偏移地址。处理器利用ES:EA存取附加段中的数据。
    串操作指令将附加段作为其目的操作数的存放区域。

【关于分段】

  1. 8086对逻辑段的要求:
  • 段地址低4位均为0
  • 每段最大不超过64KB(216 B),但并不要求必须为64KB
  • 各段之间可以独立,也可以有重叠
  1. 如何分配各个逻辑段
  • 程序的指令序列必须安排在代码段。
  • 程序使用的堆栈一定在堆栈段。
  • 程序中的数据默认是安排在数据段,也经常安排在附加段,尤其是串操作的目的区必须是附加段。
  • 数据的存放比较灵活,实际上可以存放在任何一种逻辑段中。

8、段超越前缀指令
没有指明时,一般的数据访问在DS段;使用BP访问主存,则在SS段
默认的情况允许改变,需要使用段超越前缀指令;8086指令系统中有4个,用于明确指定数据所在的逻辑段:
CS: ;代码段超越,使用代码段的数据
SS: ;堆栈段超越,使用堆栈段的数据
DS: ;数据段超越,使用数据段的数据
ES: ;附加段超越,使用附加段的数据

【段超越示例】

【不允许使用段超越的情况】

  • 串处理指令的目的串必须用ES段;
  • PUSH指令的目的和POP指令的源必须用SS段;
  • 指令必须存放在CS段。

【段寄存器的使用规定】

【补充】

【什么是溢出】
处理器内部以补码表示有符号数。8位表达的整数范围是:+127~-12816位表达的范围是:+32767~-32768。如果运算结果超出这个范围,就产生了溢出。有溢出,说明有符号数的运算结果不正确。

【溢出和进位】
溢出标志OF和进位标志CF是两个意义不同的标志。
进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;
溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。

【如何运用溢出和进位】

  • 处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF。

  • 应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。

【溢出判断】
判断运算结果是否溢出有一个简单的规则:

  • 只有当两个相同符号数相加(包括不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出;因为,此时的运算结果显然不正确。

  • 其他情况下,则不会产生溢出。

8086汇编——Introduction(8086内部寄存器,段寄存器,存储器分段)的更多相关文章

  1. 【8086汇编-Day1】预备知识

    菜鸟的8086汇编入门之旅,偶有错处恭请大佬们指正. Ⅰ· 闲说一下 我为什么学汇编?相对于晦涩难懂的01010101011010机器语言(高低电平变化驱动机器做出不同反应),汇编语言用更便于记忆和使 ...

  2. 8086汇编语言学习(二) 8086汇编开发环境搭建和Debug模式介绍

    1. 8086汇编开发环境搭建 在上篇博客中简单的介绍了8086汇编语言.工欲善其事,必先利其器,在8086汇编语言正式开始学习之前,先介绍一下如何搭建8086汇编的开发环境. 汇编语言设计之初是用于 ...

  3. 8086汇编和Win32汇编

    8086汇编是指在某环境下汇编编译产生的程序,用机器去执行每条指令的长度为16位(可小于16),如DOS操作系统:WIN32汇编是32位环境下的汇编,如Windows(Windows也有64位的,XP ...

  4. Win10下C语言转8086汇编

    目录 Win10下C语言转8086汇编 简介 开始 写C代码 转换成汇编代码 Win10下C语言转8086汇编 简介 最近学习<王爽汇编>,然后突发奇想,想一边写C语言用编译器将其翻译成汇 ...

  5. 汇编之FS段寄存器

    FS寄存器指向当前活动线程的TEB结构(线程结构) 偏移  说明 000  指向SEH链指针 004  线程堆栈顶部 008  线程堆栈底部 00C  SubSystemTib 010  FiberD ...

  6. 【8086汇编-Day6】关于loop的实验

    实验内容 因为是要复制代码,所以常规来做是取代码段地址来用,所以把cs值mov给ax,但是这只是临时的,ax之后还有别的用途,那就把指令当作数据来存(把ax值 mov给ds,表示这一段地址用作代码段, ...

  7. “段寄存器”的故事[转](彻底搞清内存段/elf段/实模式保护模式以及段寄存器)

    http://blog.csdn.net/michael2012zhao/article/details/5554023 一. 段寄存器的产生 段寄存器的产生源于Intel 8086 CPU体系结构中 ...

  8. 32位机,CPU是如何利用段寄存器寻址的

    转自:http://blog.sina.com.cn/s/blog_640531380100xa15.html 32位cpu 地址线扩展成了32位,这和数据线的宽度是一致的.因此,在32位机里其实并不 ...

  9. CPU的段寄存器

    http://www.cnblogs.com/tolimit/p/4775945.html?utm_source=tuicool&utm_medium=referral CPU的段寄存器 在C ...

随机推荐

  1. id 查询

    Ids Query | Elasticsearch Reference [6.2] | Elastic http://www.elastic.co/guide/en/elasticsearch/ref ...

  2. bzoj4594: [Shoi2015]零件组装机

    论静态查错的重要性...乱搞题真难调 首先这题看起来就是要分治检验了. 考虑对于区间[l,r],分成[l,p-1]和[p,r]使得这两个区间合并可以得到[l,r],并且要保证后面一个区间较大 设前一个 ...

  3. 【Idea】Debug模式

    Idea则是把手标放到你想显示结果的代码上,按Ctrl+F1就显示结果. 如果你想跳到下一个断点直接按F9

  4. 【HDU 2167】 Pebbles

    [题目链接] 点击打开链接 [算法] 状压DP 先搜出一行符合的情况,然后,f[i][j]表示第i行,状态为j,能够取得的最大值,DP即可 [代码] #include<bits/stdc++.h ...

  5. AutoIT:为文件夹下面的文件批量改名

    以前用Ruby脚本,对于中文,数字结合的文件名,修改名字也不是非常简单,需要修改字符集,可是用autoit来实现,也挺简单的,并且可以替换已有文件名中的汉字部分. $filepath = " ...

  6. WIN8系统的远程桌面漏洞 利用QQ拼音纯净版实现提权

    前言 发现这个漏洞的时候, 笔者正在机房上课.正想用3389远程桌面去控制宿舍电脑的时候,因为重做系统忘记自己的IP地址,因此就随手扫描了一下IP段开3389端口的电脑. 没想到就随手扫描到一台WIN ...

  7. Git 仓库结构 (一)***

    Git 仓库      1.1Git 基本概念    在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Gi ...

  8. bzoj3995

    线段树 额 计蒜客竟然把这个出成noip模拟题... 这个东西很像1018,只不过维护的东西不太一样 然后我参考了fuxey大神的代码,盗一波图 具体有这五种情况,合并请看代码,自己写了一个结果wa了 ...

  9. hash学习

    hash真奇妙 1.子串hash:如果我们要求一段子串的hash值,设h[i]:1-i的hash值,h[l-r]=h[r]-h[l-1]*pw[r-l+1],无论是模意义下还是自然溢出都是可以的 2. ...

  10. 【184】FileZilla 搭建 FTP 及访问

    参考:FileZilla 下载中心 参考:使用FileZilla Server轻松搭建个人FTP服务器 建好后,Windows 访问:Windows徽标键+R打开运行窗口,输入ftp://*** ,* ...