chapter7-chapter9

发布时间 2023-11-04 16:37:37作者: scrutiny-span

chapter7:更灵活的定位内存地址的方法

1.and和or指令

  1. and指令:按位进行与运算(同为1结果才为1)
执行下面两条指令后,al=00100011B
mov al,01100011B
and al,00111011B
  1. or指令:按位进行或运算(一个为1结果就为1)
执行下面两条指令后,al=01111011B
mov al,01100011B
or al, 00111011B

2.大小写字母的转换问题

  1. 大写字母转小写字母:+20H,即将第五位置为1
or al,00100000 ;假设al存储着相应的字母字符
  1. 小写字母转大写字母: -20H,即将第五位置为0
and al,11011111

3.[bx+idata]

  1. [bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata
;该指令含义为将一个字单元的内容送入ax寄存器中
;该字单元存放一个字,偏移地址为bx中的数值加上200,段地址在ds中
mov ax,[bx+200]
mov ax,200[bx]
mov ax,[bx].200
;上述三条指令等价

4.SI和DI

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

[bx+si]和[bx+di]

  1. [bx+si]或者[bx+di]表示一个内存单元,偏移地址为(bx) + (si),[bx+di]同理

几种定位内存地址的方法

  1. [常量值]:用一个常量表示地址,可以用来直接定位一个内存单元
  2. [bx]:用一个变量来表示内存地址,可用来间接定位一个内存单元
  3. [bx + 常量值]:用一个变量和常量来表示内存地址,可以在一个起始地址的基础上用变量间接定位一个内存单元
  4. [bx+si]:用两个变量来表示地址
  5. [bx+si + 常量值]:用两个变量和一个常量来表示地址

chapter8:数据处理的两个基本问题

1.两个基本问题
  1. 处理的数据在什么地方:机器指令处理的数据可以在CPU内部(内部的寄存器等),内存,端口
    1. mov bx,ds:[0]:指令执行前数据在内存
    2. mov bx, ax:指令执行前数据在寄存器
    3. mov bx, 1:指令执行前数据在CPU内部的指令缓冲器中
  2. 要处理的数据有多长:8086CPU的指令可以处理两种尺寸的数据:byte和word。机器指令中指明指令进行的是字节操作还是字操作的方法如下:
    1. 通过寄存器名指明要处理的数据的尺寸
    ; 字操作
    inc ax
    ; 字节操作
    inc al
    mov al,ds:[0]
    
    1. 在没有寄存器名存在的情况下用操作符word ptr或者byte ptr指明内存单元的长度,比如说inc word ptr ds:[0]
  3. 有些指令默认访问的是字单元还是字节单元
    比如push和pop指令默认访问的是字单元
2.bx,si,di,bp
  1. 在8086CPU中,只有这四个寄存器可以用在[...]中进行内存单元的寻址
;例如
mov ax,[si]
mov ax,[si+bx]
3.汇编语言中数据位置的表达
  1. 立即数(idata):立即数就是直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中)。立即数直接在汇编指令中给出。
;比如
mov al,'a'
add bx,2000H
  1. 寄存器:指令要处理的数据在寄存器中.在汇编指令中给出相应的寄存器名
;比如
mov ds,ax
  1. 段地址(SA)和偏移地址(EA):指令要处理的数据在内存中,在汇编指令中可以用[X]的格式给出EA,段地址SA存储在某个段寄存器中。存放段地址的寄存器最好通过段前缀显性给出。
;存放段地址的寄存器可以是默认的
;1. 存放段地址的寄存器默认在DS中
mov ax,[bx+si+8] ;即等同于mov ax,ds:[bx+si+8]
mov ax,[0]

;2.存放段地址的寄存器默认在SS中
mov ax,[bp+si+8]
4.寻址方式

定位内存单元的偏移地址的方法称为寻址方式。8086CPU中的寻址方式如下图:
image.png

5.div指令(除法指令)
  1. 除数:有8位或者16位,在一个寄存器中或者内存单元中
  2. 被除数:默认放在AX中,或者AX和DX中。如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,则被除数为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。
  3. 结果:
    1. 如果除数为8位,则AL存储商,AH存储余数
    2. 如果除数为16位,则AX存储商,DX存储余数
  4. 格式
div 寄存器
div 内存单元
6.伪指令dd
  1. db:定义字节型数据
  2. dw:定义字型数据,占用两个字节
  3. dd:定义双字型数据,占用四个字节
;例如data段定义三个数据
;第一个数据为01H
;第二个数据为0001H
;第三个数据为00000001H
data segment
    db 1
    dw 1
    dd 1
data ends
7.dup操作符
  1. dup是一个操作符,也是由编译器识别处理的符号。他是和db,dw,dd等数据定义伪指令配合使用的,用来进行数据的重复。
  2. dup的使用格式如下:
db 重复的次数 dup (重复的字节型数据)
dw 重复的次数 dup (重复的字型数据)
dd 重复的次数 dup (重复的双字型数据)
  1. 示例
db 3 dup (0)    ;表示定义了三个字节,值都是0,等同于db 0,0,0
db 3 dup (0,1,2);定义了九个字节,他们是012012012

;定义一个容量为200个字节的栈段
stack segment
    db 200 dup (0)
stack ends

chapter9:转移指令的原理

1.概述

  1. 转移指令:可以修改IP或者同时修改CS和IP的指令称为转移指令。概括的讲,转移指令就是可以控制CPU执行内存中某处代码的指令。
  2. 8086CPU的转移行为有以下几类:
    1. 段内转移:只修改IP,比如说jmp ax
      段内转移又分为短转移和近转移。短转移IP的修改范围为-128到127
      近转移IP的修改范围为-32768到32767
    2. 段间转移:同时修改CS和IP,比如jmp 1000:0
  3. 8086CPU的转移指令分为以下几类
    1. 无条件转移指令(比如jmp)
    2. 条件转移指令
    3. 循环指令(比如loop)
    4. 过程
    5. 中断

2.操作符offset

  1. 操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。
  2. 使用示例
assume cs:codesg
codesg segment
    ;(第一条指令长度为3个字节)
    start:mov ax,offset start   ;等同于mov ax,0
    s:mov ax,offset s           ;等同于mov ax,3
codesg ends
end start

3.jmp指令

jmp指令为无条件转移指令

1. jmp指令需要给出两种信息:
  1. 转移的目的地址
  2. 转移的距离(段间转移,段内短转移,段内近转移)
2. 根据位移进行转移的jmp指令
  1. 这种汇编指令对应的机器码并不包含转移的目的地址,而是包含转移的位移(相对于当前IP值的转移位移)。
  2. 格式
;将转到标号处执行指令
;short说明指令进行的是段内短转移,对IP的修改范围-128到127
;标号是代码段中的标号,指明指令要转移的目的地
jmp short 标号

;段内近转移
jmp near ptr 标号

3.功能

功能为 (IP) = (IP) + 8位位移
8位位移 = 标号处的地址 - jmp指令后的第一个字节的地址
jmp short 标号

功能为 (IP) = (IP) + 16位位移
16位位移 = 标号处的地址 - jmp指令后的第一个字节的地址
jmp near ptr 标号

位移由编译程序在编译时算出
3.转移的目的地址在指令中的jmp指令
  1. 段间转移(远转移)
;far ptr指明了指令使用标号的段地址和偏移地址修改CS和IP
jmp far ptr 标号
4.转移地址在寄存器中的jmp指令
  1. 指令格式:jmp 16位寄存器
  2. 功能:(IP) = (16位寄存器)
5.转移地址在内存中的jmp指令
  1. 转移地址在内存中的两种jmp指令格式
    1. 格式1:jmp word ptr内存单元地址(段内转移)功能是从内存单元地址处开始存放一个字,是转移的目的偏移地址
    2. 格式2:jmp dword ptr内存单元地址(段间转移)功能是从内存单元地址处开始存放两个字,高地址处的字是转移的目的段地址,低地址处的字是转移的目的偏移地址
  2. 示例
;指令执行后,(IP) = 0123H
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]

;指令执行后,(CS) = 0,(IP) = 0123H
mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx] 

4.jcxz指令

  1. jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移。在对应的机器码中包含转移的位移而不是目的地址。对IP的修改范围为-128到127
  2. 指令格式:jcxz 标号
  3. 功能:如果(cx) = 0,则转移到标号执行。当(cx) = 0时,(IP) = (IP) + 8位位移。8位位移等于标号处的地址减去jcxz指令后的下一条指令的地址 这条指令的功能相当于:
if ((cx) == 0)
{
    jmp short 标号  // 段内短转移
}

5.loop指令

  1. loop指令为循环指令,所有的循环指令为段内短转移。在对应的机器码中包含转移的位移,而不是目的地址。
  2. 指令格式:loop 标号
  3. 功能:(cx) = (cx) - 1,如果(cx)!= 0,转移到标号处执行。
    loop指令的功能相当于:
(cx)--
if ((cx) != 0)
{
    jmp short 标号
}

6.cmp指令

根据某种条件决定是否转移。(修改IP)。所有条件转移指令的转移位移都是-128到127(段内短转移)

  1. 因为cmp指令可以同时进行无符号数和有符号数比较,所以根据cmp指令的比较结果进行转移的指令也分为两种。
    image.png