大概一年前学了一点,后来就搁置了,这个寒假捡回来给他冲完
第二章 寄存器
一个寄存器分为高位和低位,如AX寄存器分为AH和AL
当寄存器中存放的数据超出位数限制大小时,寄存器只会保留没有超出的那部分,如
mov ax 8226H
add ax 8226H
这其中ax计算的值理应为1044CH,但是限于AX寄存器是16位大小,寄存器中最终的值为044CH,进位1并不是真的丢弃(书中暂未提,后续再记)
在进行数据传送和运算时,要注意指令的两个操作对象位数应当是一致的
如 mov ax bh 就是错误的指令
物理地址(对于8086CPU)
*物理地址=段地址16+偏移地址**
- 起始地址=段地址*16(必然是16的倍数)
- 16位地址的寻址能力为64KB,因此一个段的长度最大为64KB
- 可以用不同的段地址和偏移地址形成同一个物理地址
例子:
相当于通过地址加法器将两个16位地址合成为一个20位的物理地址
段寄存器:CS,DS,SS,ES
CS和IP
CS为代码段寄存器,IP为指令指针寄存器
8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行
一个最简单的修改CS:IP的指令jmp
jmp 段地址:偏移地址
jmp 某一合法寄存器
jmp ax
指令执行前: ax=1000H,CS=2000H,IP=0003H
指令执行后: ax=1000H,CS=2000H,IP=1000H
记一些debug实验的内容吧。
R命令:查看、修改CPU寄存器的内容
例: 分别执行了查看各寄存器、修改CS寄存器、修改IP寄存器
D :查看内存中的内容
E :修改内存中的内容(前提是该内存可修改)
关于此有一个实验题是要求在fff00~fffff中找到pc主板机上ROM中写有的一个生产日期并试图修改它。 以下是我的实验过程👇
我成功找到并试图修改其内容,但修改后再查看发现其并没有改变,再回头看提示,才想明白该内存段是属于rom的地址空间,而rom为只读内存,无法修改。
U :将内存中的内容解释为机器指令和对应的汇编指令
例
T :执行CS:IP指向的内存单元处的指令(t一次执行一次,ip自动跳转下一个指令)
例
A :以汇编指令的形式向内存中写入指令
例
Comments