小编cod*_*ith的帖子

进位标志可以包含哪些值,以及如何在x86汇编中检查其状态?

  1. 进位标志可以包含哪些值?它只是0x00和0x01(布尔值)还是像其他CPU寄存器一样是16(或32/64)位?

  2. 我如何检查其状态?难道我只是用它喜欢像一个正常的CPU寄存器cmp cf, 0x00然后jg <jump destination>

  3. 我正在写一个迷你操作系统.将它用于我自己的目的是好的做法,还是应该为CPU的独占写权限保留,我所做的一切都是从它读取的?

x86 assembly nasm

11
推荐指数
1
解决办法
1万
查看次数

Bootloader奇怪的行为

我一直在尝试设计一个简单的操作系统,只是引导扇区,以及带有中断的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)

assembly operating-system nasm 16-bit bootloader

7
推荐指数
1
解决办法
569
查看次数

C ++意外整数提升

我最近在写一些实际上应该测试其他代码的代码,但偶然发现了一个令人惊讶的整数提升案例。这是最小的测试用例:

#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。

什么是“通常的算术转换”,在标准中它们在哪里定义?我的猜测是,它们隐式地将较小的整数提升为某些运算符intunsigned int为某些运算符提升(这也得到以下事实的支持:用产生的结果替换std::uint8_tunsigned int0,而且赋值运算符缺少“常规算术转换”子句)。

c++ integer-promotion language-lawyer

7
推荐指数
1
解决办法
227
查看次数

在ISO 9660文件系统上加载文件

我刚刚读完在ISO 9660文件系统读取文件的文章,我对我怎么会去读取文件到内存困惑.我知道根目录位于PVD的偏移量156处,如何使用它来查找驻留在根目录中的文件,一旦找到文件名,我将如何找到该文件所在的地址,这样我就可以将它加载到内存中(使用int 0x13 AH = 42)?

filesystems x86 assembly bios iso9660

4
推荐指数
1
解决办法
1294
查看次数