返回随笔学校科目
已烂尾ENGINEERING NOTE

汇编语言

记录 DOSBox Debug 调试命令、寄存器、寻址方式和基础汇编指令,当前笔记已停止更新。

汇编

课余内容

DOSBOX debug 调试工具的常用指令

  • -r:可以显示CPU寄存器中的所有数据,并将CS:IP所指向的内容翻译成指令
    • -r AX:修改寄存器中的内容
  • -d:可以显示地址中的数据,默认显示128个字节
    • -d 1000:0:显示从1000:0开始的128个字节
    • -d 1000:0 2F:显示从1000:0到1000:2F的内容
  • -u:可以显示地址中的指令
  • -a:向内存地址中写入指令
    • -a 2000:0:在指定的内存中写入指令
  • -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] ```