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=00002、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编译器,磁盘烧写工具!如果你需要我可以直接把二进制文件给你!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)