课余内容
DOSBOX debug 调试工具的常用指令
-r:可以显示CPU寄存器中的所有数据,并将CS:IP所指向的内容翻译成指令
-d:可以显示地址中的数据,默认显示128个字节
-d 1000:0:显示从1000:0开始的128个字节
-d 1000:0 2F:显示从1000:0到1000:2F的内容
-u:可以显示地址中的指令
-a:向内存地址中写入指令
-t:执行当前CS:IP中的指令
-e:可以修改内存中的内容
-e 2000:0 “abcdefg” :将内存中的内容修改为字符串对应的ASCⅡ码
学校内容
第三章 汇编语言指令集
3.3 寻址方式
- 立即寻址:操作数包含在指令中,如
MOV AX, 1111
- 寄存器寻址:操作数存放在寄存器中,如
MOV AX, BX
- 存储器操作数寻址
- 直接寻址
- 段寄存器名称:[ 偏移地址 ]
如
MOV AX, DS:[50H] ,数据保存在地址为DS:[50H]的内存中
- 段寄存器名称:[ 变量名 ]
如
MOV AX, DS:BUF,BUF是一个变量,数据保存在地址为DS:BUF的内存中
- 间接寻址
段寄存器名称:[ 间址寄存器 ]
如
MOV AX, DS:[BX],BX称为间址寄存器
- 基址寻址
段寄存器名称:[ 基址寄存器+位移量 ]
如
MOV AX, DS:[BX+3]
基址寄存器只有BX和BP可以使用
- 变址寻址
段寄存器名称:[ 变址寄存器 + 位移量 ]
如
MOV AX, SS:[SI + 3]
变址寄存器只有SI和DI可以使用
- 基址变址寻址
基+变就是两个加起来用
在实际书写中,DS:或SS:可省略。数据段寄存器默认使用DS段寄存器,堆栈段寄存器默认使用SS段寄存器。
| 基址寄存器 |
约定访问的逻辑段 |
变址寄存器 |
约定访问的逻辑段 |
| BP |
堆栈段 |
SI、DI |
数据段 |
| BX |
数据段 |
|
|
## 3.4 汇编语言语法
### 3.4.1 汇编语言语句类型和格式
**符号指令(机器指令)**:符号指令是CPU直接执行的指令,是一种指令性语言。
**伪指令**:伪指令为汇编工具提供信息,是一种指示性语语言。伪指令的基本结构:
| 变量 |
伪指令助记符 |
空格 |
操作数项,多个操作数间用逗号隔开 |
; 注释 |
### 3.4.2 常用命令
- SEG运算符
SEG运算符用来求一个逻辑段的段基址,或标号或变量所在逻辑段的段基址。
`MOV AX, SEG DATA` 作用为取出`DATA`的段基址,并赋值给`AX`
由于逻辑段段名本身就包含了段基址,所以可以省略SEG符号
- OFFSET运算符
OFFSET运算符用来求一个逻辑段的偏移地址。如:
```markdown
MOV DB 10H, 20H, 30H
MOV BX, OFFSET BUF
MOV AH, [BX+1]
```
效果是取出BUF的偏移地址,放置在BX中,执行后AH=20H
- $运算符
$运算符返回当前汇编地址计数器的值。通常使用它计算变量在逻辑段中占用的字节总数。如:
```markdown
BUF DB ‘HELLO WORLD’
COUNT EQU $-BUF
```
- PTR运算符
临时类型转换运算符。
### 3.4.3 操作项
- DB型数据
DB(Define Byte)表示字节型定义。它定义的常量按照字节顺序排列。它可以定义用单引号引起的字符串,字符串中的字符依次排列在内存中。
```markdown
NUM1 DB 12H, 64, -1, 3*3
DB 11H ;可以跨越多行定义
DB 'HELLO' ;可以定义用单引号引起的字符串
NUM2 DB ?, ? ;问号代表随机数
```
以上定义的内容在内存中的排列和C语言中的数组类似,先定义的字节位于低位字节中。
| NUM1 |
12H |
|
40H |
|
FFH |
|
09H |
|
11H |
|
'H’ |
|
‘E’ |
|
‘L’ |
|
‘L’ |
|
‘O’ |
| NUM2 |
XXH |
|
XXH |
- DW型数据
DW(Define Word)表示字型数据。它定义的变量占用两个字节,若定义时只定义了一个字节,则另一个字节将用’00H’补全。DW型数据的字符型常数只能是一个或两个字符。
```markdown
NUM1 DW 1234H, 56, 'AB', 'C', ?
```
以上定义的每个字(两个字节)中,后面的字节排列在低位字节上。
| NUM1 |
34H |
|
12H |
|
56H |
|
00H |
|
'A‘ |
|
'B’ |
|
‘C‘ |
|
00H |
|
XXH |
|
XXH |
- DD型数据
DD(Define Double Word)表示双字定义。它定义两个字,也就是四个字节。
定义的每个双字中,后面的字节依然排列在低位字节上
## 3.5 汇编语言基本指令集
### 3.5.1 传送类指令
- 数据传送指令
`MOV 目标, 源操作数`
将源操作数传送到目标操作数中
变体:
- MOVSX符号位拓展传送指令,缺失的位数用符号补齐
- MOVZX零拓展传送指令,缺失的位数用零补齐
- 偏移地址传送指令
`LEV 目标, 源操作数`
将源操作数的偏移地址传送到目标操作数
`LEV AX, BUF`等价于`MOV AX, OFFSET BUF`
- 交换指令
`XCHG 目标操作数, 源操作数`
将源操作数和目标操作数的数据交换,需要字长相等
对于双操作数指令,需要注意以下几点:
- 立即数不能作为目标操作数
- 源、目标操作数不能同时为内存数
- 不允许将立即数直接传送到段寄存器,需要寄存器中继
```plain text
MOV AX, 1000H
MOV DS, AX
```
- 源、目标操作数要等长,必要时使用PTR运算符临时修改
- 基址+变址寻址中,寄存器写法顺序不同,默认的段寄存器不同
```plain text
SS:[BP + SI]
DS:[SI + BP]
```