进位标志可以包含哪些值?它只是0x00和0x01(布尔值)还是像其他CPU寄存器一样是16(或32/64)位?
我如何检查其状态?难道我只是用它喜欢像一个正常的CPU寄存器cmp cf, 0x00然后jg <jump destination>?
我正在写一个迷你操作系统.将它用于我自己的目的是好的做法,还是应该为CPU的独占写权限保留,我所做的一切都是从它读取的?
我一直在尝试设计一个简单的操作系统,只是引导扇区,以及带有中断的16位实模式.我终于能够制作OS/bootloader,我在虚拟盒中进行了测试,并且它有效.
然后我将图像刻录到CD上,并将其启动到我的旧桌面,使用Pentium 4,BIOS修订版A05和1GB内存,并且它工作得很好 - 一个简单的操作系统,在顶部打印一个"标题"屏幕,所有它允许您键入屏幕,注册几个键导航光标.
然后我将光盘插入我1年前的笔记本电脑,配备i5处理器,2.6 GB RAM和A05 BIOS Revision,光标似乎随机移动,高速打印随机字符,最后停在anscii字符处235(扩展字符表的一部分),此时键盘工作正常,指定移动光标的键工作正常,只是标题.这是我测试它的计算机,对其进行了编译,编写并将其刻录成CD.(我使用Linux Mint 12 OS)
我已经跳过了我认为需要做的所有"箍":制作了一个iso图像,遵循El Torito'无仿真'启动标准,启动签名,512字节,并写入正确的扇区.
这是我的代码的问题,我没有做某事,或者这是正常的吗?
这是我的代码(NASM x86语法):
;**************************
; Note OS, Experimental OS
;**************************
[org 0x7C00]
[bits 16]
start:
jmp loader ;jump to the actual start of bootloader
times 8 - ($ - $$) db 0 ;pad eight bytes
;*********************
;El Torito Boot Info Table
;*********************
;in nasm, I couldn't figure out how to reserve bytes, in the middle of .text
;so I zeroed it out.
times 56 db …Run Code Online (Sandbox Code Playgroud) 我最近在写一些实际上应该测试其他代码的代码,但偶然发现了一个令人惊讶的整数提升案例。这是最小的测试用例:
#include <cstdint>
#include <limits>
int main()
{
std::uint8_t a, b;
a = std::numeric_limits<std::uint8_t>::max();
b = a;
a = a + 1;
if (a != b + 1)
return 1;
else
return 0;
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,该程序返回1。一些调试和预感表明,b + 1在条件a + 1语句中实际上返回了256,而在赋值操作中产生了预期值0。
C ++ 17草案的第8.10.6节(关于等式/不等号运算符)指出:
如果两个操作数均为算术或枚举类型,则对两个操作数执行常规的算术转换;如果指定的关系为真,则每个运算符都将产生true;如果指定的关系为false,则每个运算符应产生false。
什么是“通常的算术转换”,在标准中它们在哪里定义?我的猜测是,它们隐式地将较小的整数提升为某些运算符int或unsigned int为某些运算符提升(这也得到以下事实的支持:用产生的结果替换std::uint8_t为unsigned int0,而且赋值运算符缺少“常规算术转换”子句)。
我刚刚读完这在ISO 9660文件系统读取文件的文章,我对我怎么会去读取文件到内存困惑.我知道根目录位于PVD的偏移量156处,如何使用它来查找驻留在根目录中的文件,一旦找到文件名,我将如何找到该文件所在的地址,这样我就可以将它加载到内存中(使用int 0x13 AH = 42)?