C语言0x1f5,[009][x86汇编语言]学习加载程序的编写(c08_mbr.asm)

源程序来源加载程序功能加载程序 知道 用户程序位于 虚拟硬盘的LBA逻辑扇区100 处;加载程序 知道 虚拟机 内存物理地址0x10000处空闲;加载程序 要把 用户程序 从虚拟硬盘里取出来,然后放到 虚拟机里空闲的内存空间那里;加载程序 知道 虚拟机 开机后会读取 虚拟硬盘主引导扇区(LBA模式逻辑扇区号0) 的内容,将其复制到内存 0x0000:0x7c00处开始执行;(我们)要做的事情利用工...
摘要由CSDN通过智能技术生成

源程序来源

加载程序功能

加载程序 知道 用户程序位于 虚拟硬盘的LBA逻辑扇区100 处;

加载程序 知道 虚拟机 内存物理地址0x10000处空闲;

加载程序 要把 用户程序 从虚拟硬盘里取出来,然后放到 虚拟机里空闲的内存空间那里;

加载程序 知道 虚拟机 开机后会读取 虚拟硬盘主引导扇区(LBA模式逻辑扇区号0) 的内容,将其复制到内存 0x0000:0x7c00处开始执行;

(我们)要做的事情

利用工具 nasmide.exe 编译加载程序的源文件.asm,生成一个.bin二进制文件,将.bin文件利用工具 fixvhdwr.exe 写入到虚拟硬盘的主引导扇区(LBA模式逻辑扇区号0)。

加载程序:增加注释

;

;文件名 c08-1.asm

;文件说明:硬盘主引导扇区代码(加载程序)

;创建日期:9:12 2018/5/23

app_lba_start equ 100 ;用户程序源地址的起始逻辑扇区号

SECTION mbr align=16 vstart=0x7c00

;设置栈段和栈指针

mov ax,0

mov ss,ax

mov sp,ax

mov ax,[cs:phy_base]

mov dx,[cs:phy_base+0x02]

mov bx,16

div bx ;物理地址0x10000 转换为 段地址0x1000

mov ds,ax

mov es,ax

;以下读取程序的起始部分

xor di,di ;28位起始逻辑扇区号的高12位

mov si,app_lba_start ;28位起始逻辑扇区号的低16位

xor bx,bx ; ???

call read_hard_disk_0

;以下判断整个用户程序有多大

mov dx,[2] ; 32位用户程序长度的高16位

mov ax,[0] ; 32位用户程序长度的低16位

mov bx,512 ; 1个扇区512字节

div bx

cmp dx,0 ; dx里存着余数,余数不为0代表没有除尽

jnz @1

dec ax

@1:

cmp ax,0 ; 小于1个扇区或者长度为512的整数倍时ax = 0

jz direct

; 读取剩余的扇区

push ds ; 用户程序的开头是基于LBA逻辑扇区号计算出来的段地址

mov cx,ax ; 循环次数(剩余的扇区数)

@2:

mov ax,ds

add ax,0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#0 Homer::RtpSessionState::deprovisionAtDestruction (this=0x7f1fe00e7650) at ../components/mos/state/session_state/src/rtp_session_state.cpp:886 886 ../components/mos/state/session_state/src/rtp_session_state.cpp: No such file or directory. [Current thread is 1 (Thread 0x7f1ffffff700 (LWP 372))] (gdb) bt #0 Homer::RtpSessionState::deprovisionAtDestruction (this=0x7f1fe00e7650) at ../components/mos/state/session_state/src/rtp_session_state.cpp:886 #1 0x00005653759a8e33 in Homer::DeviceState::~DeviceState (this=0x7f1fe00ecf50) at ../components/mos/state/device_state/src/device_state.cpp:87 #2 0x0000565375c4229e in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release (this=0x7f1fe00ecf40) at /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/shared_ptr_base.h:155 #3 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count (this=0x7f1fe00bbb08) at /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/shared_ptr_base.h:730 #4 std::__shared_ptr<Homer::DeviceStateBase, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr (this=0x7f1fe00bbb00) at /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/shared_ptr_base.h:1169 #5 Homer::Device::~Device (this=0x7f1fe00bb070) at ../components/mos/device/src/device.cpp:94 #6 0x0000565375c3c08a in Homer::WebsocketDevice::~WebsocketDevice (this=0x7f1fe00bb070) at ../components/mos/device/src/websocket_device.h:31 #7 Homer::WebsocketClientDevice::~WebsocketClientDevice (this=0x7f1fe00bb070) at ../components/mos/device/src/websocket_client_device.cpp:20
06-13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值