汇编
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(左移四位)+偏移地址=物理地址
- 原因
- 8086cCPU提供20根地址线 但是机器是16位的
- 寄存器只能存16位地址 用两个16位寄存器计算 寄存器1 左移四位 + 寄存器2
2.3 通过修改地址寄存器决定cpu从哪里读取指令和数据
- CPU把 CS:IP 指向的内容当成指令
2.4. CPU执行指令的过程
- CPU从 CS:IP 所指向的内存单元读取指令,存放到 指令缓存器中
- IP = IP + 所指指令的长度,从而指向 下一条指令
- CPU执行指令缓存器中的内容
3. 寄存器对内存的访问
3.1 数据在内存中的存放
数据类型
- 字节型数据 1byte(8bit)
- 字型数据 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 安全的内存空间
- 直接访问的 0:200~0:2ff 256字节 的安全内存空间
- 通过操作系统:
- 操作系统直接分配
- 像操作系统申请
4. 编译 链接
4.1 编译
- masm asm -> obj
- link obj -> exe
4. 常用指令
4.1 loop 指令
遇到的问题(循环执行一段指令)
1
2
3
4setNumber: mov ds:[bx],dl
inc dl
inc bx
jmp setNumber ;标号(内存地址) 标识 `mov ds:[bx],dl `setNumber 用于标识命令的ip位置
loop 指令是循环指令
1
2
3
4
5mov cx,16
setNumber: mov ds:[bx],dl
inc dl
inc bx
loop setNumber ;标号(内存地址) 标识 `mov ds:[bx],dl `设置cx的值,cx自减1 直到cx 为0
- 注意cx不能初始化为0 会越界
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.