(16 DOS)裸机汇编之实现主程序调用三个子程序(操作系统第一次实验)

本文介绍了如何通过DOS环境下的汇编语言编写主程序调用子程序。从编写汇编代码、使用nasm编译到在虚拟机中运行,详细阐述了汇编代码如何通过int中断实现功能,如输出字符串。文章通过实例演示了如何在引导扇区之外的扇区进行程序跳转,展示了裸机汇编的基础流程。
摘要由CSDN通过智能技术生成

本来想复制粘贴实验报告,但是发现图片不能够复制粘贴,而且意义不大。。。。。。。

可以。

第一步:

要会打汇编代码,弄成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就是了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值