本来想复制粘贴实验报告,但是发现图片不能够复制粘贴,而且意义不大。。。。。。。
可以。
第一步:
要会打汇编代码,弄成asm后缀,用以nasm
第二步:
将汇编代码nasm编译成可行的二进制文件,再把多个文件弄成整一个文件。
第三步:
将二进制文件当做软盘,载入虚拟机中。
那么虚拟机在开机的时候就可以运行我们所写的代码。
可以那么这篇博文就到这里结束啦
第一步:
写汇编代码,以最简单的输出HELLO,WORLD为例看看语法
;程序源代码(myos0.asm)
org 7c00h ; BIOS将把引导扇区加载到0:7C00h处,并开始执行///看不懂再说
Start:
mov ax, cs ; 置其他段寄存器值与CS相同
mov ds, ax ; 数据段
mov ax, ds ; ES:BP = 串地址
mov es, ax ; 置ES=DS///这四行我也看不懂
mov bp, Message ; BP=当前串的偏移地址
mov cx, MessageLength ; CX = 串长(=9)
mov ax, 1301h ; AH = 13h(功能号)、AL = 01h(光标置于串尾)
mov bx, 0007h ; 页号为0(BH = 0) 黑底白字(BL = 07h)
mov dh, 0 ; 行号=0
mov dl, 0 ; 列号=0
int 10h ; BIOS的10h功能:显示一行字符/这七行代码可以输出定义好的Message字符串
AfterRun:
jmp $ ;无限循环///$是当前地址的意思,汇编也是顺序执行,jmp $ 就是不断地跳到当前地址,简单点说不断跳到当前行,也就是无限循环
Message:
db 'Hello, world.'///定义字符串,变量名为Message db是 define bit 用就是了,注意字符串用单引号,双引号会引起一些BUG
MessageLength equ ($-Message)/equ 就是等号= 的意思 Message是上一行定义的变量,但在汇编里面它还代表着地址,或者说行数,$-Message 就是当前地址-Message的首地址,也就是字符串所占地址的长度
times 510-($-$$) db 0/$$是起始地址 $-$$就是当前地址减去初始地址(初始地址不是0,),也就是用了多少地址,一个扇区有512个地址
db 0x55,0xaa///最后两个地址弄为十六进制的55 和 aa 这是引导扇区的特征
///最后两行就是把后面的所有地址弄为0 以及最后两个为55 aa 的意思
重点讲解一下那七行代码是怎么输出字符串的,
在汇编里面,我们有四个寄存器ax bx cx dx,这四个寄存器可以分为ah al bh bl ch cl dh dl h是high l是low
也就是ah是ax的高一半,al是ax的低一半,以此类推。
那七行代码中前六行都是给这些寄存器的值赋值。
然后调用中断,也就是int 10h
这个int 10h是什么意思呢,
用C++来类比,我们应该可以这样来说
比如一些C++代码
int10h(int ax, string bx, char cx, double dx)
{
if(ax==什么什么值)
{
执行特定功能,比如输出字符串,也就是输出bx,比如根据dx的值确定输出在屏幕的那个位置
}else if(ax == shenmeshenmezhi)大概就是这个意思
}
当然 不一定是int类型或者string类型,但大概是这个意思
执行int 10H 的时候,就会自动传递四个寄存器的值,然后这些寄存器的值作为参数执行不同的功能,
同样还有int 16h int 21h之类的,每一个int xxh代表一大类类似的函数。
在int 10h中
ax = 1301h 代表输出字符串,光标放在字符串的末尾,h是十六进制
bx = 0007h代表页号和黑底白字,页号是什么呢,为0就是了。