写一个能装载硬盘数据到内存的MBR程序
2013-06-15 16:09
232 查看
我们已经学会了让自己的指令作为MBR程序运行,但是它只能打印一个字符。这次我们要做的事是让我们的指令从硬盘上读取一块数据到内存里。 这里要用到另一个bios中断。 什么是bios中断?中断就是让cpu暂停目前的指令,而转去执行另一块指令,执行完后再返回来继续执行目前的指令。而bios中断是基本的输入/输出中断,当我们的指令中包含一条中断指令(比如上一篇中的int 10h),cpu就会根据后面的中断号转去执行相应的指令,如果中断号为10h,cpu就去执行13h对应的那一块指令,在那一块指令里,有各种判断语句,比如如果判断到寄存器ah的值为0xe,那么它就执行显示操作,将当前al里asc码对应的字符显示在输出设备(显示器)上,至于如何显示,那就是另外需要学习的了,其原理也很容易理解。但是现在我们不需要关心,我们只需要知道,如果想在显示器上显示字符X,就先将ah的值设为0xe,再将al的值设为X对应的asc码,再调用10h号中断就可以了。 这次我们要用到的是0x13号中断。需要设寄存器ah的值为42h,设寄存器DL的值为0x81,然后在给DS和SI设值,最后再给以DS:SI开始的16个字节的内存设置,当这一切都设好后,就调用0x13号中断,那么cpu就会将硬盘指定扇区的数据读入内存上指定的地方,这些指定的内容正是我们前面所设置的。 下面的代码以u盘方式运行后,u盘的mbr先将自己拷贝到令一块内存,然后跳过去继续执行,将硬盘的mbr读入内存0x7c00的地方,然后跳到0x7c00处执行 mov cx,512 mov ax,0 mov ds,ax mov si,0x7c00 mov di,0x8c00 copy: mov dx,[si] mov [di],dx inc si inc di loop copy jmp 0x1019 ;jmp to 0x8c19. current add:0x16. next ins add:0x19. ip after fetch:0x7c19 operands:0x1019-0x19=0x1000. ;ip after exe:0x7c19+0x1000=0x8c19 mov ah,0xe ;print a smile face mov al,1 int 10h read: mov ah,0x42 mov dl,0x81 mov si,0x0 mov ds,si mov si,0x8000 mov byte [si],0x10 mov word [si+2],0x1 mov word[si+4],0x7c00 mov word[si+6],0x0 mov dword[si+8],0x0 mov dword[si+12],0x0 int 0x13 jmp -0x1000 ;ip after fetch:0x8c7d. next ins add:0x7d. X=desAdd - ipAfterFetch + nexInsAdd end: jmp end printHex: mov ah,0xe cmp al,10 jnb notBelowTen add al,48 jmp print notBelowTen: add al,55 print: int 0x10 ret times 0200h - 2 - ($ - $$) db 0 ; NASM directive: zerofill up to 510 bytes dw 0AA55h ; Magic boot sector signature db "ABCDEFG" |
相关文章推荐
- 数据持久化的本质 - 数据保存成文件,存储到程序的沙盒中 -在应用程序结束时,将内存中的数据以文件的形式搬到(保存到)硬盘中
- 一个关于继承的程序,求高人解释程序执行过程中内存的数据存储情况
- 内存和硬盘上的数据存储方式
- 对一个程序在内存中的分析
- 将文本文件中的数据读取到一个二维数组中,求出这些数据的中位数,然后求所有数据与中位数的差值的绝对值和,并求出和的最小值,最后把程序运行的结果写到一个txt文件中
- 如何用1g内存服务器去爬取一个大型网站的嵌套数据(一步步解决out of memery)
- 素数距离问题 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数
- SQLSERVER 占了500多M内存,原来的程序无法一次查询出50多W数据了,记录下这个问题的解决过程。
- 使用UDP协议编写一个网络程序,设置接收端程序的监听端口是8001,发送端发送的数据是“Hello, world”。
- [初]对于C++内存模型的一个测试小程序
- 使用UDP协议编写一个网络程序,设置接收端程序监听端口为8001,发送端发送的数据是“hello world”
- Linux下查看某一个程序运行所占用的内存
- 如何导出一个client的用户数据到本地硬盘
- 如何设置Java虚拟机内存以适应大程序的装载
- 程序中的数据在内存中的布局
- C/C++程序内存中数据存储区分类
- Linux内核装载和启动一个可执行程序
- [网易云课堂]Linux内核分析(七)—— Linux内核如何装载和启动一个可执行程序
- Perl Pack写的一个数据报表程序
- 转:PTDD恢复分区等于恢复你的数据(包括误GHOST后硬盘变成一个分区)