1 debug 常用命令

1.1 R/r 命令

  • 查看、修改cpu寄存器中的值
    1
    2
    -r							;查看寄存器的值
    -r cs ;修改cs寄存器的值

1.2 D/d 命令

  • 查看内存中的内容
    1
    2
    3
    4
    5
    6
    ;d 段地址:偏移地址
    -d 1000:01 ;查看内存100001处的内容
    -d ;接上一条指令,列出后续内存的内容

    ;d 段地址:偏移地址
    -d 1000:0 9 ;查看10000-100009内存的值

1.3 E/e 命令

  • 改写内存中的值
    1
    2
    3
    -e 1000:10 0 1 2 3 4 5      ;从1000:10开始向内存写入0 1 2 3 4 5
    -e 1000:50 1 'a' 2 'b' ;写入字符实际上是写入ascii码
    -e 1000:10 ;从1000:10开始写入

1.4 U/u 命令

  • 查看机器码对应的汇编指令
    1
    -u 1000:0       ;查看1000:0处的机器码对应的汇编指令

1.5 T/t 命令

  • 执行当前指令
    • 执行CS:IP指向的指令,并使CS:IP 指向下一条指令

1.6 A/a 命令

  • 以汇编指令的形式在内存中写入指令内容
    1
    2
    3
    4
    -a 1000:0
    1000:0000 mov ax,1
    1000:0003 mov bx,2
    1000:0006 add ax,bx

1.7 g指令

1
-g f
  • 依次执行指令直到ip的值为f

2. 寄存器

2.1 寄存器分类

寄存器分类

2.2 段地址、偏移地址、物理地址

  • 段地址×*2^4(移四位)+偏移地址=物理地址
  • 原因
    1. 8086cCPU提供20根地址线 但是机器是16位的
    2. 寄存器只能存16位地址 用两个16位寄存器计算 寄存器1 左移四位 + 寄存器2

2.3 通过修改地址寄存器决定cpu从哪里读取指令和数据

  • CPU把 CS:IP 指向的内容当成指令

2.4. CPU执行指令的过程

  1. CPU从 CS:IP 所指向的内存单元读取指令,存放到 指令缓存器中
  2. IP = IP + 所指指令的长度,从而指向 下一条指令
  3. CPU执行指令缓存器中的内容

3. 寄存器对内存的访问

3.1 数据在内存中的存放

  • 数据类型

    1. 字节型数据 1byte(8bit)
    2. 字型数据 2byte(16bit) 如 4E20H
  • 一个字型数据 存放在内存中 可以有2个连续的的地址的内存单元组成

    • 高地址(地址编号大)内存存放到 字型数据的高位字节(如: ah)
  • 进行读取数据时应当 数据的类型 以防止读取出错

  • 从内存中读用 mov ax,ds:[bx]

  • 写入内存中用 mov es:[bx],ax

3.2 栈

3.2.1 操作和标记

  • 3.2.1 入栈 push
    • sp=sp-2 注意是
    • [ss:sp]=ax
  • 3.2.2 出栈 pop
    • sp=sp+2 注意是
    • ax=[ss:sp]
  • 3.3.3 栈顶标记 ss:sp
    • 使用的寄存器 ss 段地址寄存器 和 sp 段地址寄存器 组合的地址当做栈顶标记地址

3.2.2 栈只是操作字型数据 (2byte or 16bit)

3.3 安全的内存空间

  1. 直接访问的 0:200~0:2ff 256字节 的安全内存空间
  2. 通过操作系统:
    1. 操作系统直接分配
    2. 像操作系统申请

4. 编译 链接

4.1 编译

  • masm asm -> obj
  • link obj -> exe

4. 常用指令

4.1 loop 指令

  • 遇到的问题(循环执行一段指令)

    1
    2
    3
    4
    setNumber:  mov ds:[bx],dl
    inc dl
    inc bx
    jmp setNumber ;标号(内存地址) 标识 `mov ds:[bx],dl `
  • setNumber 用于标识命令的ip位置

  • loop 指令是循环指令

    1
    2
    3
    4
    5
    mov cx,16
    setNumber: mov ds:[bx],dl
    inc dl
    inc bx
    loop setNumber ;标号(内存地址) 标识 `mov ds:[bx],dl `
  • 设置cx的值,cx自减1 直到cx 为0

    • 注意cx不能初始化为0 会越界