8086汇编

8086是Intel发布的第一款16位CPU, 其采用的x86架构日后成为Intel最成功的架构。

汇编语言使用助记符来代替机器码,汇编语言通常是与机器相关的。今天汇编语言已经不再大贵吗用于软件开发, 只是用于底层硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都会需要汇编语言。

8086 CPU

8084CPU所有的内部寄存器、内部及外部数据总线都是16位宽,因此是完全的16位微处理器。

8086拥有20位外部地址总线,因此物理寻址空间为1MB .由于内部寄存器都是16位,对1M地址空间寻址时采取了段寻址方式。

8086 CPU 中寄存器总共为 14 个,且均为 16 位 。

即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES。

而这 14 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。

AX,BX,CX,DX 称作为数据寄存器:

  • AX (Accumulator):累加寄存器,也称之为累加器;

  • BX (Base):基地址寄存器;

  • CX (Count):计数器寄存器;

  • DX (Data):数据寄存器;

可以分为两个独立的 8 位的 AH(BH, CH, DH) 和 AL(BL, CL, DL) 寄存器

SP 和 BP 又称作为指针寄存器:

  • SP (Stack Pointer):堆栈指针寄存器;

  • BP (Base Pointer):基指针寄存器;

SI 和 DI 又称作为变址寄存器:

  • SI (Source Index):源变址寄存器;

  • DI (Destination Index):目的变址寄存器;

段寄存器:

  • CS (Code Segment):代码段寄存器;

  • DS (Data Segment):数据段寄存器;

  • SS (Stack Segment):堆栈段寄存器;

  • ES (Extra Segment):附加段寄存器;

控制寄存器:

  • IP (Instruction Pointer):指令指针寄存器;
  • FLAG:标志寄存器;

8086有一个16位宽的标志寄存器FLAG.其中7位被保留,只使用其中的9位:

  • 进位标志CF

  • 奇偶标志PF

  • 辅助标志AF

  • 为零标志ZF

  • 符号标志SF

  • 追踪标志TF

  • 中断允许标志IF

  • 方向标志DF

  • 溢出标志OF。

汇编指令

传送指令

传送指令用于将指定值传送到指定的寄存器或主存的某个位置。MOV指令是最基本的传送指令:

MOV dest, src

将源地址的值src传送到目的地址dest。 src可以为:

  • 立即数,如2FFH

  • 寄存器, 如AX

  • 主存地址,如DS:[SI-2]
    表示在DS寄存器指定的段中,段内偏移由SI-2指定的内存单元即:DS*16+SI-2

8086支持多种寻址方式,更多关于寻址的内容可以参考8086寻址方式

合法的MOV指令必须满足:

  • dest和src类型必须匹配,即必须同为字节类型或是字类型

  • 目的操作数dest不能为立即数或代码段寄存器CS;

  • 指针寄存器IP既不能作源操作数也不能作目的操作数

  • 目的操作数和源操作数不能同时为内存单元

  • 不能将立即数传送给段寄存器,但可以将内存里的数据直接传送给段寄存器

其它传送指令包括:

  • XCHG oper1, oper2: 将操作数oper1与oper2的值交换

  • LEA dest, src: 将src的地址传送到dest中, src必须是内存单元, dest必须是寄存器.

  • LES dest, src: 将src的段内偏移量到BX, 将段地址传给ES,src必须是内存单元。

  • LDS dest src: 将src的段地址传入DS, 偏移量传给指定的寄存器dest, src必须是内存单元

堆栈

堆栈区段由寄存器SS记录栈底, SP中记录栈顶指针.

  • PUSH oper: 压栈

  • POP dest : 弹栈, 并将弹出的值送往dest

算术运算

加法运算:

  • ADD oper1, oper2: 两个操作数相加并将结果送往oper1

  • INC oper: 对oper执行加1操作

减法运算:

  • SUB oper1, oper2: 计算oper1 - oper2并将结果送往oper1

  • DEC oper: 对oper执行-1操作, 若oper变为0则将ZF置为1

  • NEG oper: 对oper进行求补操作, 即0 - oper.

  • CMP oper1, oper2: 比较两操作数,若相等则zf=1; 若oper1< oper2 则: sf=1

乘法运算:

  • MUL oper: 无符号乘法,
    若OPRD为8位则计算"AL* OPRD" 结果保存在AX中;
    若OPRD为16位则计算"AX*OPRD", DX保存结果的高16位,AX保存结果的低16位

  • IMUL oper: 有符号乘法, 此外规则与MUL相同

除法运算:

  • DIV oper: 无符号除法指令
    若oper为8位,则被除数默认在AX中,AX除以OPRD的商保存在AL中,余数保存在AH中;
    若oper为16位,则被除数默认在DX与AX中,结果的商保存在AX中,余数保存到DX中

  • IDIV oper: 有符号除法, 该指令把除数与被除数均作为有符号数,此外与DIV相同.

位运算

按位运算:

  • NOT oper: 操作数按位取反然后将结果送回, 对标志位不产生影响

  • AND oper1, oper2: 将oper1与oper2进行位与操作, 结果送入oper1

  • TEST oper1, oper2: 将oper1与oper2进行位与操作, 不改变操作数的值只影响标志位

  • OR oper1, oper2: 对oper1与oper2进行位或运算, 结果送回oper1中

  • XOR oper1, oper2: 对oper1与oper2进行位异或运算, 结果送回oper1中

移位运算:

  • SAL oper, m :算术左移
    对oper进行m次算术左移操作, 0补空位,溢出值放入CF标志位中.
    对移1位的指令,若移位后操作数的最高位发生变化,则OF=1,否则OF=0

  • SHL oper, m: 逻辑左移操作, 与SAL完全相同.

  • SAR oper, m: 算术右移
    对oper进行m次算术右移操作, 每次移位符号位保持不变,移出的最低位进入CF.
    对于有符号数和无符号数而言算术右移一位相当于除以2.每移1位,移出的位都送到CF。

  • SHR oper, m 逻辑右移
    对oper进行m次l逻辑右移操作, 0补空位.
    对移1位的指令,若移位后操作数的最高位与次高位不相等,则OF=1,否则OF=0

  • ROL oper, m: 不带标志位的循环左移指令
    将目标操作数向左循环移动1位或CL指定的位数,最高位移入CF,同时再移入最低位构成循环,CF不在循环圈之内
    对移1位的指令,若移位后操作数的最高位与次高位不相等,则OF=1,否则OF=0

  • RCL oper, m: 带标志位的循环左移指令
    将目的操作数连同CF一起向右循环移动1位或CL指定的位数,最低位移入CF,而CF原来的值移入最高位,CF包含在循环圈之内
    对移1位的指令,若移位后操作数的最高位与次高位不相等,则OF=1,否则OF=0

  • POR oper, m: 不带标志位的循环右移指令
    将目标操作数向右循环移动1位或CL指定的位数,最低位移入CF,同时再移入最高位构成循环,CF不在循环圈之内
    对移1位的指令,若移位后操作数的最高位与次高位不相等,则OF=1,否则OF=0

  • RCR oper, m: 带标志位的循环右移指令
    将目的操作数连同CF一起向右循环移动1位或CL指定的位数,最低位移入CF,而CF原来的值移入最高位,CF包含在循环圈之内
    对移1位的指令,若移位后操作数的最高位与次高位不相等,则OF=1,否则OF=0

跳转指令

跳转指令可以通过改写控制寄存器等使程序跳转到指定语句处, 汇编程序通常使用跳转指令来控制程序流。

无条件跳转指令JMP可以跳转标号处:

  JMP A
  MOV AX, BX
  INC AX
A:MOV AX, CX
  DEC AX

上述程序执行JMP语句后会跳转到标号A处继续执行, JMP和标号A之间的指令将被跳过

条件跳转指令通过检查标志位来判断是否进行跳转:

  • JZ label: ZF=1时执行跳转

  • JNZ label ZF=0时执行跳转

条件跳转指令可以用来实现条件结构(if)和循环结构(while).

       CMP AL, 11H
TRUE:  MOV BX, [SI]
       MOV CX, [DI]
       OUT BX, CX
       JMP GOON
FALSE: MOV BX, [SI]
       MOV CX, [DI+1]
       OUT BX, CX
GOON:  INC AH

上述程序中若AL的值为11H则TRUE和FALSE标号之间的4条语句,完成后跳转到GOON标号处;否则, 执行FALSE后指令。

    MOV AX, 0
    MOV CX, 10
DO: ADD AX, CX  
    DEC CX
    JNZ DO 

每次执行DEC指令后, 若CX不为0则ZF=1, JNZ指令会式程序跳转至DO标号处继续执行。如此循环,直至CX=0后停止。

输入输出指令

计算机通常将IO设备的控制寄存器,状态寄存器和接口等映射到内存称为设备映像, 我们可以通过读写设备映像控制IO设备。

更多关于IO的内容可以参考输入输出系统

输入输出指令用于将数据发送到IO设备或从IO设备中读取数据:

  • IN buf dev 将dev设备中的数据读入缓冲区

  • OUT dev buf 将buf中的设备发送到dev设备

dev是设备(映像)的地址,buf可以是寄存器和内存单元等。

中断指令

中断是指当出现需要时,CPU暂时停止当前程序的执行转向中断服务程序。中断向量是中断服务程序的入口地址, 一般中断向量码乘4即为中断服务程序的入口地址。

中断服务程序的入口地址存放实际在中断向量表中,中断向量实际上是中断向量表中记录的序号。

8086系统支持多种类型的中断, 中断请求是其中一种可由用户程序触发的中断。INT指令用于发出中断请求,参数为中断向量码:

INT ivec
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值