学习操作系统原理最好的方法是自己写一个简单的操作系统。在上一讲中我们学习了用汇编语言读硬盘,本讲我们来学习用汇编语言写硬盘。同样也是设计一个简单的实验,实验内容为:在内存中准备一段有特征的512字节数据,地址为0x7e00~0x7fff,其特征是前3个字节依次为4、5、6,最后3个字节依次为6、5、4。然后将该段内存数据写入到硬盘的第2个扇区,并查看虚拟硬盘第2个扇区的数据是否与内存中0x7e00~0x7fff的数据一致,如果一致则说明写硬盘成功。本讲代码文件只有一个boot2.asm。boot2.asm代码如下:;定义常量DISK_BUFFERequ0x7e00;临时存放数据用的缓存区,放到
学习操作系统原理最好的方法是自己写一个简单的操作系统。本讲我们设计一个简单的读硬盘实验。通过一定的方法使硬盘第二个扇区的前3个字节依次为1、2、3,最后3个字节依次为3、2、1,中间的506个字节全为0。然后通过读硬盘程序将硬盘第二个扇区的数据读取到内存0x7e00-0x7fff的地方,也就是内存中MBR之后的512个字节。最后通过QEMU+DGB调试的方式来查看内存中0x7e00-0x7fff的数据,是否与硬盘第二个扇区中的数据一致,如果一致说明读硬盘成功。本讲代码文件共2个:data1.asmboot1.asm下面我们开始实验。一、设置硬盘第二个扇区中的数据data1.asm代码如下:db
学习操作系统原理最好的方法是自己写一个简单的操作系统。本讲我们设计一个简单的读硬盘实验。通过一定的方法使硬盘第二个扇区的前3个字节依次为1、2、3,最后3个字节依次为3、2、1,中间的506个字节全为0。然后通过读硬盘程序将硬盘第二个扇区的数据读取到内存0x7e00-0x7fff的地方,也就是内存中MBR之后的512个字节。最后通过QEMU+DGB调试的方式来查看内存中0x7e00-0x7fff的数据,是否与硬盘第二个扇区中的数据一致,如果一致说明读硬盘成功。本讲代码文件共2个:data1.asmboot1.asm下面我们开始实验。一、设置硬盘第二个扇区中的数据data1.asm代码如下:db
所需工具x86DOS模拟器:dosboxDOS上运行调试工具:DEBUG.EXE汇编器(链接器):DOS上运行的MASM.EXE、LINK.EXE或者直接使用MacOs自带的nasmexe下载地址:链接:https://pan.baidu.com/s/1Lf7O9R-8A52cvQhtJtHJxw提取码:rjnedosbox配置去 https://www.dosbox.com/download.php?main=1 (opensnewwindow)下载对应dmg文件点击,运行里面的dosbox,弹出一个窗口打开 ~/Library/Preferences/DOSBox0.74-3-3Pre
所需工具x86DOS模拟器:dosboxDOS上运行调试工具:DEBUG.EXE汇编器(链接器):DOS上运行的MASM.EXE、LINK.EXE或者直接使用MacOs自带的nasmexe下载地址:链接:https://pan.baidu.com/s/1Lf7O9R-8A52cvQhtJtHJxw提取码:rjnedosbox配置去 https://www.dosbox.com/download.php?main=1 (opensnewwindow)下载对应dmg文件点击,运行里面的dosbox,弹出一个窗口打开 ~/Library/Preferences/DOSBox0.74-3-3Pre
本文主要理解OC对象反汇编,以及block常见类型的反汇编OC反汇编创建一个Person类,并在main函数中初始化一个Person对象@interface Person : NSObject@property(nonatomic, copy) NSString *name;@property(nonatomic, assign) int age;+ (instancetype)person;@end@implementation Person+ (instancetype)person{ return [[self alloc] init];}@endint main(int argc
本文主要理解OC对象反汇编,以及block常见类型的反汇编OC反汇编创建一个Person类,并在main函数中初始化一个Person对象@interface Person : NSObject@property(nonatomic, copy) NSString *name;@property(nonatomic, assign) int age;+ (instancetype)person;@end@implementation Person+ (instancetype)person{ return [[self alloc] init];}@endint main(int argc
本文主要讲解编译器的优化以及指针的汇编编译器优化设置可在项目的BuildSetting->OptimizationLevel中找到,一般的优化方案选择FS(Fastest,Smallest)案例分析有以下代码int main(int argc, char * argv[]) { int a = 1; int b = 2;}在没有优化情况下的汇编如下image将优化方案从None改成FS,汇编如下修改1:main中调用int sum(int a, int b){ return a + b;}int main(int argc, char * argv[]) { sum(1
本文主要讲解编译器的优化以及指针的汇编编译器优化设置可在项目的BuildSetting->OptimizationLevel中找到,一般的优化方案选择FS(Fastest,Smallest)案例分析有以下代码int main(int argc, char * argv[]) { int a = 1; int b = 2;}在没有优化情况下的汇编如下image将优化方案从None改成FS,汇编如下修改1:main中调用int sum(int a, int b){ return a + b;}int main(int argc, char * argv[]) { sum(1