8086CPU相关汇编语言的简单概述

8086CPU相关汇编语言的简单概述

  • 1.寄存器
    • 通用寄存器
    • 8806CPU给出物理地址的方法
    • 段寄存器
      • 修改CS,IP的指令
  • 2.寄存器(内存访问)
    • 栈机制
  • 3.[BX]和loop指令
    • [BX]
    • loop
    • 段前缀
  • 4.包含多个段的程序
  • 5.更灵活的定位内存地址的方法
    • and和or指令
    • 大小写转换问题
    • [bx+idata](idata[bx])
    • SI和DI
    • [bx+SI],[bx+DI]
  • 6.数据处理的两个基本问题
    • bx,si,di和bp
    • 汇编语言中数据位置的表达
    • 寻址方式
    • 指令要处理的数据有多长
    • div指令
    • 伪指令dd
    • dup
  • 7.转移指令的原理
    • 操作符offset
    • jmp指令
      • 依据位移进行转移的jmp指令
      • 转移的目的地址值指令中的jmp指令
      • 转移地址在寄存器中的jmp指令
      • 转移地址在内存中的jmp指令
    • jcxz指令
  • 8.CALL和RET指令
    • ret和retf

1.寄存器

8086CPU有14个寄存器:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW

通用寄存器

AX,BX,CX,DX
存放一般性的数据,可以分为高8位和第8位

8806CPU给出物理地址的方法

物理地址=段地址×16+偏移地址

段寄存器

CS,DS,SS,ES
CS和IP是是两个最关键的寄存器
CS:代码段寄存器 IP:指令指针寄存器
读取一条指令后,IP值会自动增加

修改CS,IP的指令

jmp 段地址:偏移地址
例如 jmp 2AE3:3 执行后CS = 2AE3H ,IP = 0003H

2.寄存器(内存访问)

8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址,8086不支持将数据直接送入段寄存器的操作

栈机制

8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。**任意时刻,SS:SP指向栈顶元素。**push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址

3.[BX]和loop指令

[BX]

mov ax,[bx] 功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中

loop

格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作,①(cx)= (cx)-1 ②判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行

段前缀

用于显式地指明内存单元的段地址的“ds:”,“cs:”等,称为段前缀
例如:mov ax,ds:[bx]

4.包含多个段的程序

DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START
dw 0,12,34,56,78,

dw即“define word”含义是定义字型数据,一个字型数据占两个字节

5.更灵活的定位内存地址的方法

and和or指令

(1)and指令:逻辑与指令,按位进行与运算。可以将操作对象的相应位设为0,其他位不变。
例如:将al的第六位设为0 and al,10111111B
(2)or指令:逻辑或指令,按位进行或运算。可以将操作对象的相应位设为1,其他位不变。
例如:将al的第六位设为0 or al,01000000B

大小写转换问题

小写字母的ASCII码值比大写字母大20H。
简便方法:一个字母,不管它原来是大写还是小写,将它的二进制码第5位置置0,它就变成大写字母;第5位置置1,就变成小写字母

[bx+idata](idata[bx])

我们在前面用[bx]的方式来指明一个内存单元,现在可以用[bx+idata]更灵活的表示
例如:mov ax,[bx+200]

SI和DI

si和di是8086CPU中和bx功能相近的寄存器,si和di不能分成两个8位寄存器来使用

[bx+SI],[bx+DI]

比 [bx+idata]更加灵活

6.数据处理的两个基本问题

bx,si,di和bp

①在8086CPU中,真有这4个寄存器可以用在[…]中来进行内存单元的寻址
②在[…]中,这4个寄存器可以单个出现,或只能以4中组合出现:bx和si,bx和di,bp和si,bp和di
③在[…]中使用bp,而在指令中没有显式地给出段地址,那么段地址默认就在ss中

汇编语言中数据位置的表达

①立即数:对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中)
②寄存器:指令要处理的数据在寄存器中
③段地址(SA)和偏移地址(EA):指令要处理的数据在内存中 ,用[X]的格式给出

寻址方式

指令要处理的数据有多长

8086CPU可以处理两种尺寸的数据,byte和word,在指令中要指明是字操作还是字节操作
①通过寄存器的名字来指明
字操作:mov ax,1000
字节操作:mov al,1000
②在没有寄存器名的情况下,用操作符X ptr指明内存单元的长度,X是byte或word
inc word ptr 【bx】
inc byte ptr 【bx】

div指令

①除数:有8位和16位两种,在一个reg或内存单元中
②被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在AX和DX中存放,DX存放高16位,AX存放低16位
③结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数

伪指令dd

前面用db和dw定义字节型数据和字型数据。dd用来定义dword(double word,双字)型数据

dup

是一个操作符 ,和dd,dw,db一样。dup用来进行数据的重复
例如:db 3 dup(0),定义了3个字节,都为0
db 3 dup(0,1,2),定义了9个字节0,1,2,0,1,2,0,1,2

7.转移指令的原理

可以修改IP,或同时修改CS和IP的指令系统统称为转移指令。概括地讲,转移指令就是可以控制CCPU执行内存中某处代码的指令。
只修改IP,称为段内转移
同时修改IP和CS,称为段间转移
根据对IP的修改范围不同,段内转移又分为:短转移和近转移

  • 短转移IP的修改范围为-128~127
  • 近转移的IP修改范围为-32768~32767

总体上可以分为以下几类:

  1. 无条件转移指令(如:jmp)
  2. 条件转移指令
  3. 循环指令
  4. 过程
  5. 中断

操作符offset

功能:取得标号的偏移地址

CODES SEGMENT
    ASSUME CS:CODES
START:
	mov ax,offset start  ;相当于mov ax,0
S:
	mov ax,offset s		 ;相当于mov ax,3
	
	CODES ENDS
    END START

jmp指令

依据位移进行转移的jmp指令

段内短转移:jmp short 标号(转到标号处执行指令)
段内近转移:jmp near 标号
实际上,CPU在执行jmp指令的时候并不需要转移的目的地址。它包含的是转移的位移。这个位移是编译器根据汇编指令中的“标号”计算出来的。

转移的目的地址值指令中的jmp指令

jmp far ptr 标号 实现的是段间转移,有称为远转移
功能如下: (CS)=标号所在段的段地址 (IP)=标号所在段的偏移地址

转移地址在寄存器中的jmp指令

指令格式:jmp 16位 reg
功能:(IP)=(16位reg)

转移地址在内存中的jmp指令

  1. jmp word ptr 内存单元地址(段内转移)
    功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址
    内存单元地址可以用寻址方式(见上文)的任一格式给出
  2. jmp dword ptr 内存单元地址(段间转移)
    功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处的字是转移的目的偏移地址
    (CS)=(内存单元地址+2)
    (IP)=(内存单元地址)

jcxz指令

jcxz指令为有条件指令,所有的有条件转移指令都是短转移。
指令格式:jcxz 标号(如果(CX)=0,转移到标号处执行)
操作:当(CX)=0是,(IP)=(IP)+8位位移
8位位移=标号处的地址-jcxz指令后的第一个字节的地址
8位位移的范围为:-128~127,用补码表示
8位位移由编译程序在编译时算出

当(CX)≠0时,什么也不做(程序向下执行)

8.CALL和RET指令

ret和retf

ret指令用栈中的数据,修改IP的内容,从而实现近转移;(相当于pop IP)
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。(相当于pop IP pop CS)

你可能感兴趣的:(8086CPU相关汇编语言的简单概述)