今天要做什么?
1: 段间直接跳转指令
2: 调试前面写的程序
1:
1.1:汇编语言程序默认是从文件开始 一行一行往下执行的,处理器是停不下来的,如果指令执行中发现没有指令,是会报错的,如果是在调试器里面,我们会控制指令的执行。
在处理器加电执行或者复位后,会指向ROM BIOS中的指令,执行完ROM BIOS的最后一条指令,读到内存的物理地址7c00处。
逻辑地址可以表示成 0x0000:0x7c00
Jmp 0x0000: 0x7c00 这样就形成了跳转指令
如此执行,将是无限循环
这这个图片中,段间的意思是这条指令将跳到另外一个段里面执行,这条语句给出了段地址和偏移地址。
0x0000:0x7c00
用段地址去修改代码段寄存器CS,用偏移地址取修改指令指针寄存器IP
这条指令将修改 代码段寄存器CS和指令指针寄存器IP
1.2:查看编译后的这条执行 详细分析一下
这条指令 偏移指令在前,代码段寄存器在后,和我们在编写的时候是不一样,反过来的,顺序和书写顺序。
00 00:7c 00
2:调试这段程序
Bochs
输入 sreg 会显示很多段寄存器的内容
输入 r 显示所有的通用寄存器
单步执行指令:输入框 输入S (step)单步
断点指令:b 所谓断点 这是一个内存地址,当处理器执行到这个地址时,指令停止
例如输入:b 0x7c00 ,到0x7c00 时,指令停止
输入C 时,不间断执行指令,如果我们设置了断点,他就会在断点处停下来
一个u命令 返回一条后面的机器指令 汇编原指令
u/16 连续的返汇编16条指令
要查看内存可以使用调试命名
xp
xp /512xb 0x7c00(从物理地址7c00处显示 512个字节)
xp /要查看的字节(512) 要查看的方式x(以十六进制显示)b(byte以字节为单位显示)
要查看的地址 0x7c00,最好先将调试地址设置到0x7c00处
输入
b 0x7c00
然后c 执行
在执行 xp /512xb 0x7c00
此时执行S 单步执行
我们上面练习的代码
此时的执行和我们上面的书写是有一些不一样的
mov byte ptr ds:0x0000,0x41
0x41 传送到 代码段寄存器ds:0x0000
xp /16xb 0xb8000
查看显存处的地址内容
0x50 是P
0x0b 是 黑底青字
0x6c 是 l
0x0b 是 同上
0x65 是 e
s命令有一个小问题,用s命令来执行写入显存的步骤时,写入的内容不能够在屏幕上看出来
为此需要一个新的命令:
next命令 简写成n也是可以的,执行完成的命令会直接显示到屏幕上
修改 屏幕上的文字成功
调试完成后
模拟器会出现报错
多出了这一个文件 lock 说明文件已经被锁定
删除这个文件重新开始 最好
help 显示所有调试命令
help p显示单个命令的用法例如 p命令
将显存汇编代码写入后,更换virtual box 储存介质,将写入更改显存内容的vhd软盘导入,最好重启电脑后重新操作一遍,用管理员身份启动,最后操作成功。启动成功后,成功显示文件。
这是自测试以来第三次用软盘启动,不过这次是完全理解后手写并打印的了。