请问、练习使用int 13功能获取安装了DOS 6.22系统的硬盘MBR、反汇编。应该如何做呢,能帮忙想想嘛,谢谢啦

请问、练习使用int 13功能获取安装了DOS 6.22系统的硬盘MBR、反汇编。应该如何做呢,能帮忙想想嘛,谢谢啦,第1张

读MBR:

debug

a 100

mov ax,0201 读1个扇区

mov bx,200 读到ES:00处

mov cx,1 0柱面,第一个扇区开始

mov dx,80 0磁头, 第一亩李嫌扰宽个硬盘

int 13

int 3 返回DOS

以迅手上指令将第一个硬盘的MBR读到ES:BX(ES:200)处;

u ES:200 开始反汇编MBR

1、在BIOS或由MBR引导伏歼时,约定的bootstrap代码的加载位置是 0000:7c00,所以此时CS=0000

2、7c1f开始的数据是族厅数 48 65 6C 6C 6F 2C 20 4F 53 20 77 6F 72 6C 64 21 00,正是 "Hello, OS world!"。你把字符串作为指令兆首反汇编了所以看不出来。

1: *** 作系统很庞大, *** 作系统的引导bootsect这个必须要由汇编来写,不枣梁过由于 *** 作系统过于庞大,所以内核就由C(linux系统没有采用一条C++语句,即使是现在的linux内核也没有一条C++语法)来写了,具体的你可以看下Linux源代码,用到汇编的部分只有引导的部分,而那部分只能有汇编来写,这部分包括mbr,因为512B 的mbr每一个字节都有特定作用只能由低级语言来写。

2:只要你问出这个问题,我想你是可能是没有弄清楚汇编的概念,这么跟你说吧, 你在windows上面玩的所有东西,包括你玩的超大型游戏,都可以用汇编来写,虽然实际上这不现实,也没人会这么做。但一个DOS格式文件或者一个WIN32下的PE(exe)文件内部 都是二进制内容是可以反汇编的,里面说白了存储的都是汇编代码(实际上是机器码,但机器码跟汇编代码是一一对应的)

可视化编程吧,汇编是不能实现所见即所得的那种可视化编程的,但是资源还是可以用资源编辑器编写,在链接的时候连接进去。

对于编写可视化程序给你一段代码:

.386

.model flat,stdcall

option casemap:none

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Include 文件定义

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include windows.inc

include user32.inc

includelib user32.lib

include kernel32.inc

includelib kernel32.lib

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

数据段

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data

szCaption db 'A MessageBox !',0

szText db 'Hello, World !',0

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

代码段

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>凳枯运>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.code

start:

invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK

invoke ExitProcess,NULL

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

end start

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

用下列命令进行编译和链接:

ml /c /coff Hello.asm

Link /subsystem:windows Hello.obj

(win32汇编编译环境你可以到网上搜索masm32)

汇编在windows平台下也能调用api。3D效果也都是DX什么这些东西的API 调用出来的!

一句话:高级(其他任何)语言能做的汇编都能做,高级(其他任何)语言不能做的,只有计算机能完成的汇编都能做(比如 *** 作系统引导部分)

3:汇编编译出来的文件obj文件在win32平台下面一般都是COFF文件格式,coff格式百度上有详细介绍

COFF文件跟EXE文件其实很像了,对于特殊的编译选项,比如在写 *** 作系统引导的时候你不需要生成额外的信息,你要的是在目标文件每一个字节处的机器码,即你要精准定位每一行代码 都对应目标文件的位置。这个时候就不需要连接,汇编出来的文件直接裸机就能运行

4:

obj文件在linux上和windows上 都是采用coff格式的。假如linux不用系统调用 windows不用败搜windows api也许 这两个系统的coff文件就完全一样了!不过 在调用系统接口的时候 linux用的是系统调用,windows用的是windows api,即使coff文件格式一样,也不能跨平台,很抱歉!

5:汇编程序能在没有 *** 作系统的情况下运行

你需要一个nasm编译器(貌似现在也只有这个编译器能按指令一行一行编译到目标文件中)

汇编代码如下:

org 07c00h 告诉编译器程序加载到7c00处

mov ax, cs

mov ds, ax

mov es, ax

call DispStr 调用显示字符串例程

jmp $ 无限循环

DispStr:

mov ax, BootMessage

mov bp, ax ES:BP = 串地址

mov cx, 22 CX = 串长度

mov ax, 01301h AH = 13, AL = 01h

mov bx, 000ch 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)

mov dl, 0

int 10h 10h 号中断

ret

BootMessage: db "Powerd By HuangLiuyou"

times 510-($-$$) db 0 填充剩下的空间,使生成的二进制代码恰好为512字节

dw 0xaa55 结束标志

用nasm编译生成一个512字节的obj文件(mbr)

然后用mbr工具什么什么的或者 磁盘编辑工具什么的把这512字节拷贝到0柱面、0磁头、1扇区(一个扇区就是512字节,不要在你的电脑上这么做,你可以把这512字节写到U盘上然后从U盘启动电脑就能看到效果,在虚拟机里面也行,具体怎么弄你可以参考于渊的著作《自己动手写 *** 作系统》)

然后启动电脑就行了

对于问题1,和问题5

你想深入研究建议你去找一本介绍早期linux内核源代码的书籍来看一下

汇编程序在没有 *** 作系统的情况下运行 相当于你在写 *** 作系统,几乎没有功能的 *** 作系统,你只能调用BIOS中断!

在没有 *** 作系统的情况运行 程序->你自己想象开发 *** 作系统的过程吧!怎么运行我已经告诉你了!不会的话你找我要工具

我可以给你 nasm编译器,磁盘烧写工具!如果你需要我可以直接把二进制文件给你!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12247568.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存