目录
2.4.3 例子:8086CPU访问地址为123c8h的内存单元
2.11.2 将123boh~123bah的内存单元定义为数据段
访问寄存器和内存
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