目录
访问寄存器和内存
2.1 寄存器是CPU内部的信息存储单元
2.1.1 通用寄存器--以AX为例
2.1.2 将AX分成AH与AL
2.2 “字”再寄存器中的存储
2.3 mov和add指令
2.3.1 练习1
2.3.2 练习2
2.4 确定物理地址的方法
2.4.1 物理地址
2.4.2 8086CPU给出物理地址的方法
2.4.3 例子:8086CPU访问地址为123c8h的内存单元
编辑
2.4.1 “段地址*16+偏移地址=物理地址”本质含义
2.5 内存的分段表示法
2.5.1 同一段内存,多种分段方案
2.5.2 用不同的段地址和偏移地址形成同一个物理地址
2.6 Debug的使用
2.6.1 用R命令查看、改变cpu寄存器的内容
2.6.2 用D命令查看内存中的内容
2.6.3 用E命令改变内存中的内容
2.6.4 使用U命令将内存中的机械指令翻译成汇编指令
2.6.5 用A命令以汇编指令的格式在内存中写入机械指令
2.6.6 用T命令执行机器指令
2.6.7 退出debug程序
2.7 CS、IP与代码段
2.7.1 两个关键的寄存器
2.7.2 8086pc读取和执行指令
2.8 jmp指令
2.8.1 修改cs、ip的指令
2.8.2 转移指令jmp
2.8.3 实际应用jmp
2.9 内存中字的存储
2.9.1 内存中字的存储
2.9.2 字单元
2.10 用DS和【address】实现字的传送
2.10.1 CPU从内存单元中要读取数据
2.11 DS与数据段
2.11.1 对内存单元中数据的访问
2.11.2 将123boh~123bah的内存单元定义为数据段
编辑
2.11.3 用mov指令操作数据
2.11.4 加法add和减法sub指令
编辑
2.11.5 小结
编辑
2.12 栈及栈操作的实现
2.12.1 栈结构
2.12.2 栈的操作
2.12.3 栈顶界问题的解决
2.12.4 小结
访问寄存器和内存
2.1 寄存器是CPU内部的信息存储单元
2.1.1 通用寄存器--以AX为例
2.1.2 将AX分成AH与AL
2.2 “字”再寄存器中的存储
8086是16位的CPU
8086的字长(word size)为16bit
一个字(word)可以存在一个16位寄存器中
这个字的高位字节存在这个寄存器的高8位寄存器
这个字的低位字节存在这个寄存器的低8位寄存器
2.3 mov和add指令
2.3.1 练习1
2.3.2 练习2
注意:al寄存器是ax的低八位,bl寄存器是bx的低八位。ah、bh都是对应的寄存器的高八位。
注意注意:当输入add al, 93H时,结果显示0058H,为啥这个溢出了1为什么不把它留到00这两个高位上面去呢?因为这是两个8位相加。
2.4 确定物理地址的方法
2.4.1 物理地址
2.4.2 8086CPU给出物理地址的方法
2.4.3 例子:8086CPU访问地址为123c8h的内存单元
2.4.1 “段地址*16+偏移地址=物理地址”本质含义
2.5 内存的分段表示法
2.5.1 同一段内存,多种分段方案
2.5.2 用不同的段地址和偏移地址形成同一个物理地址
2.6 Debug的使用
Debug是DOS系统中的著名的调试程序,也可以运行zaiwindows系统实模式下。
使用Debug程序,可以查看CPU各中寄存器中的内容、内存的情况,并且在机器指令级跟踪程序的运行。
mount c d:\masm # 将本机的目录d:\masm挂载到工作环境下的C盘
C: # 切换到C盘
debug # 启动debug程序
2.6.1 用R命令查看、改变cpu寄存器的内容
R - 查看寄存器内容
R 寄存器名 - 改变指定寄存器内容
r # 查看寄存器内容
# 修改寄存器ax的内容为1234
r ax
1234
2.6.2 用D命令查看内存中的内容
D - 列出预设地址内存处的128给字节的内容
D 段地址:偏移地址 - 列出内存中指定地址处的内容
D 段地址:偏移地址 结尾偏移地址 - 列出内存中指定地址范围内的内容
d # 每输入一次d命令都会列出当前地址下128个字节的内容
d 2000:0000 # 查看从这个指定的物理内存开始下128个字节的内容
d 2000:0 2f # 查看2000这个段起始偏移地址0到末尾偏移地址2f的内容
# 也就是48个字节的内容
2.6.3 用E命令改变内存中的内容
E 段地址:偏移地址 数据1 数据2。。。。
E 段地址:偏移地址
逐个询问式修改
空格 - 接受,继续
回车 - 结束
e 2000:0000 12 34 56 ab # 将这个物理地址上的内容改为这些
# 使用d命令还能看到最右边的ASCLL码
e 2000:0 # 逐个访问式的修改他们的内容
# 想修改下一个字节的内容直接按空格就行,修改完成按回车
2.6.4 使用U命令将内存中的机械指令翻译成汇编指令
d 2000:0 f # 先查看一下内容
e 2000:0 b8 23 01 bb 03 00 98 ab 01 d8 # 修改内容
u 2000:0 # 用汇编语言格式查看这个物理地址下16字节内容的修改内容
2.6.5 用A命令以汇编指令的格式在内存中写入机械指令
a 073f:100 # 修改这个物理地址下16个字节的内容使用汇编语言
mov ax, 0123 # 按回车后继续下一个地址,一个地址对应4个字节
mov bx, 3
mov ax, bx
add ax, bx
# 后面一直回车直接结束
# 使用u 073f:100 同样能看到刚刚配置的汇编命令的信息
2.6.6 用T命令执行机器指令
r # 查看一下各个寄存器
t # 一直按回车可以执行在CS:IP处的指令,这个是我们之前在这个地址的内存处配置过的
2.6.7 退出debug程序
q #直接输入一个q命令
2.7 CS、IP与代码段
2.7.1 两个关键的寄存器
CS:代码段寄存器
IP:指令指针寄存器
CS:IP : CPU将内存中CS:IP指向的内容当作指令执行
2.7.2 8086pc读取和执行指令
2.8 jmp指令
2.8.1 修改cs、ip的指令
2.8.2 转移指令jmp
2.8.3 实际应用jmp
# 修改cs寄存器的内容与修改ip寄存器的内容
r cs
2000
r ip
0
# 在物理地址2000:0上输入汇编指令
a 2000:0
mov ax,6622
mov jmp 1000:3 # jmp指令直接让其跳转到地址1000:3上,后面的代码没有得到执行
mov cx,ax
# 在物理地址1000:0上输入汇编指令
a 1000:0
mov ax, 0123
mov ax, 0 # ax寄存器值为0
mov bx ax # bx寄存器值为0
jmp bx #此时的bx值等效为IP寄存器的值,为0,也就是跳转到IP值为0的地址继续执行指令
当执行jmp bx时直接跳转到偏移地址为0000的位置继续执行指令,以此达到循环程序的目的。
2.9 内存中字的存储
2.9.1 内存中字的存储
我们写的时候是ah al的写的,但是读取与存储的时候是al ah。
2.9.2 字单元
2.10 用DS和【address】实现字的传送
2.10.1 CPU从内存单元中要读取数据
e 1000:0 3 11 22 66 # 先给这个指定的内存地址分配初始的数据
a
mov ax, 1000
mov ds, ax # 将1000h这个内容赋给ds段地址寄存器
mov ax, [0] # 意思是将ds寄存器的内容作为段地址,0作为偏移地址的物理地址的内存内容赋值给ax这个通用存储器
mov bx, [2]
mov cx, [1]
add bx, [1]
add cx, [2]
t
t
t
t # 使用t命令执行下去就行
2.11 DS与数据段
2.11.1 对内存单元中数据的访问
2.11.2 将123boh~123bah的内存单元定义为数据段
2.11.3 用mov指令操作数据
2.11.4 加法add和减法sub指令
2.11.5 小结
2.12 栈及栈操作的实现
2.12.1 栈结构
2.12.2 栈的操作
a
mov ax, 1000
mov ss, ax
mov sp, 0010
mov ax, 001a
mov bx, 001b
push ax # 入栈
push bx
pop ax # 出栈
pop bx