汇编语言 学习笔记(一)

本贴最后更新于 2333 天前,其中的信息可能已经物是人非

汇编语言学习笔记

一、概论

8086,8088 构架

1. 寄存器

8 个通用寄存器

  • AX [AH, AL] - 累加器
  • BX [BH, BL] - 基址寄存器
  • CX [CH, CL] - 计数器
  • DX [DH, DL] - 数据寄存器
  • SP - 堆栈指针
  • BP - 基址指针
  • SI - 源地址寄存器
  • DI - 目的地址寄存器

2 个控制寄存器

  • IP - 指令指针 【用户不能直接访问 IP
  • F - 状态标志寄存器 (溢出、方向、符号、进位、零、奇偶...)

4 个段寄存器

  • CS - 代码段寄存器
  • DS - 数据段寄存器
  • SS - 堆栈段寄存器
  • ES - 附加段寄存器

2. 存储器

数据长度

类型名称 定义符号 类型值
字节变量 DB 1
字变量 DW 2
双字变量 DD 4
长节变量 DQ 8
10 字节变量 DT 10
近标号 NEAR -1(FFH)
远标号 FAR -2(FEH)

far 是远调用;near 是近调用。
near 只能在段内被调用,所以调用是只需将 ip 进栈;而 far 则可以在段间被调用,所以需要 cs 与 ip 都进栈。

jmp short 标号(转移标号处执行指令) / jmp near ptr 标号 功能:(IP) = (IP)+16 位位移。 实现的是段内近转移。

jmp far ptr 标号 实现的是段间转移(远转移)

数制

  • 2 进制 - B
  • 10 进制 - D (BCD 码)
  • 16 进制 - H

字符

  • ASC II 码

二、寻址方式

() - 表示地址内的内容
[] - 直接地址

与数据有关的寻址方式

1. 立即数寻址

MOV ax, 13           ; (ax) ← 13

a. 立即数可以使八位或者十六位
b. 目的寄存器可以是 8 或者 16 位的 通用寄存器 或者 段寄存器

2. 寄存器寻址

MOV ax, bx           ; (ax) ← (bx)

3. 存储器寻址

1. 直接寻址 (有效地址 = 基址 + 偏移地址)
MOV  ax, [2000H]        ;  将存储器 [ds:2000H] 的内容赋值到 ax
MOV  ax, es:[2000H]     ;  将存储器 [es:2000H] 的内容赋值到 ax

*a. * DS 隐含指定

2. 寄存器间接寻址 (有效地址 = 段寄存器地址 x16 + 寄存器内容)
MOV ax, [bx]			; 将存储器 [(ds)*16 + (bx)] 对应的存储单元的内容送到 ax中
MOV ax, [ss]			; 将存储器 [(bp)*16 + (ss)] 对应的存储单元的内容送到 ax中

a. bx,si,di 所对应的段寄存器为 ds (数据段 )
b. bp 所对应的段寄存器为 ss (堆栈段 ss - 寄存器 bp)
c. 物理地址 = (段寄存器) x 16 + (寄存器) 即段寄存器后面加一个 0,再加上制定寄存器的值为地址

3. 寄存器相对寻址 (有效地址 = 段寄存器地址 x16 + 寄存器内容 + 8/16 位移量)
MOV ax, count[si] ;将存储器[(ds)*16 + count + (si)]对应的存储单元的内容送到 ax 中 
MOV ax, count[bp] ;将存储器[(ss)*16 + count + (si)]对应的存储单元的内容送到 ax 中

a. bx,si,di 所对应的段寄存器为 ds (数据段 )
b. bp 所对应的段寄存器为 ss (堆栈段 ss - 寄存器 bp)

4. 基址变址寻址 (有效地址 = 段寄存器地址 x16 + 基址寄存器 + 变址寄存器)
MOV  ax, [bx + di]   ; (ax) ← mem[(ds)*16 + (bx) + (di)]
MOV  ax, [bp][si]    ; (ax) ← mem[(ds)*16 + (bp) + (si)]

a. 基址寄存器 bx,bp
b. 变址寄存器 si,di

5. 相对基址变址寻址 (有效地址 = 段寄存器*16 + 基址寄存器 + 编制寄存器 + 位移量)
; (ax) ← mem[mk + (bx) + (si)]
MOV AX, MK[BX][SI]
MOV AX, MK[BX+SI]
MOV AX, [MK+BX+SI]

*a. * DS 隐含指定

转移地址寻址

1. 段内直接转移

1. JMP SHORT OPR
JMP   SHORT OPR 	; (IP) ← (IP) + 8位位移量

a. 8 位和 16 位位移量由 目标地址 OPR *确定 *

2. JMP NEAR PTR OPR
JMP   NEAR PTR OPR	; (IP) ← (IP) + 16位位移量

2. 段内间接转移

1. JMP WORD PTR OPR
JMP ax					; (IP) ← (ax)
JMP WORD PTR TABLE[bx]	; (IP) ← (mem[(ds)*16 + TABLE + (bx)])

a. 有效地址 EA 值由 OPR 的寻址方式确定,可以使用 mem 或 reg

3. 段间直接转移

1. JMP FAR PTR OPR
; (IP) ← OPR的段内偏移地址
; (CS) ← OPR所在段的段地址
JMP	FAR	PTR	NEXT ; NEXT 与 当前指令不在一个段内 

4. 段内间接转移

1. JMP DWORD PTR OPR
;(IP) ← (EA)
;(CS) ← (EA+2)
JMP  DWORD PTR  OPR

a. EA 由 OPR 的寻址方式为存储器寻址方式

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1090 引用 • 3467 回帖 • 298 关注
  • 汇编
    9 引用 • 1 回帖
  • 笔记

    好记性不如烂笔头。

    303 引用 • 777 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...