我正在尝试编写一个引导加载程序和一个非常原始和基本的内核,以了解裸机编码实践和技术。无论如何,我正在使用 NASM 编写我的引导程序。我的代码正在运行,但我对要使用的调用约定有疑问。
我只是通过运行 NASM 来编译我的引导加载程序: nasm bootloader.asm -o bootloader。
在我的汇编代码,我写的功能,如BlDisplayString通过BIOS中断显示字符串int 0x10用AH = 0x13。我试图__fastcall通过在CX, DX, STACK. 这是在 16 位代码中使用的正确调用约定标准吗?当我调用这些函数时,CPU 未处于保护模式并且仍处于实模式。
assembly operating-system calling-convention bootloader x86-16
我熟悉任务优先级寄存器cr8(Windows 上的 IRQL),当然我知道如何使用 和 来启用和禁用cli中断sti。不过,我对两者有几个疑问。
首先,清除中断标志是否会cli“覆盖”TPR 中存储的当前值?例如:TPR 是PASSIVE_LEVEL (0)。如果中断被禁用,TPR 中的值就不再重要了吗?第二:我是从维基百科上读到的:
将 TPR 加载为 0 会启用所有外部中断。用 15 (1111b) 加载 TPR 将禁用所有外部中断。
这是否意味着将 TPR 设置为0xF KzRaiseIrql(HIGH_LEVEL)相当于cli?如果我的 TPR 是0xF并且中断标志被清除,会发生什么情况?如果中断标志使能怎么办?
我正在使用 msvc 编译一个程序/NODEFAULTLIB,所以我不能使用任何 C 库函数。如何创建一个 C 风格的字符串 ( char*),其中包含一个指针 ( void*)的十六进制表示,例如printf("%p\r\n", voidPointer)产生,以便我可以使用 将其写入控制台WriteConsoleW?
WriteConsoleW只接收一个指向包含要输出的字符串的缓冲区的指针,以及字符串中的字符数。如何在不使用 C 运行时库函数(如 sprintf)的情况下转换它?但是,我可以使用WinAPI函数,lstrlenW例如 。
如果我处理WM_NCCALCSIZE一个带有样式的窗口WS_OVERLAPPED,我只是简单地0在WPARAM值为时返回TRUE。这将删除窗口边框。
这样做与创建WS_POPUP窗口有什么区别?如果我尝试使用扩展框架,实际框架是否不同?我DwmExtendFrameIntoClientArea?应该何时尝试使用每种样式?
因此,我有std::string一个由C样式函数填充的对象,例如strcpy。该函数可以返回10-100个字符之间的任意位置,因此我在字符串中保留了100个字符。
但是使用&buf[0]作品,但是当我尝试时shrink_to_fit(),字符串被破坏了。如何避免这种情况?
std::string buf;
buf.reserve(100);
//example of the function that can write to a buffer with 10-100 characters.
strcpy(&buf[0], "Hello");
buf.shrink_to_fit();
std::cout << buf << std::endl;
Run Code Online (Sandbox Code Playgroud)