小编Sep*_*and的帖子

Intel GMA950 私有缓冲区中字节的含义,在 VGA 文本模式下

在文本屏幕(模式 3,80x25)上工作时,位于 B800h 的常用视频缓冲区和接近 4GB 地址空间末尾的线性帧缓冲区 (LFB) 都处于活动状态。我发现对于显示器上的每个字符单元格,LFB 使用8 bytes。第一个字节 (a) 表示 ASCII,第二个字节 (b) 表示属性。

在一个空的显示页面上,这 8 个字节看起来像:

20h,07h,00h,00h,00h,00h,00h,00h
(a) (b) (c) (d) (e) (f) (g) (h)    
Run Code Online (Sandbox Code Playgroud)

有谁知道额外的 6 个字节是做什么用的?我观察到只有这些神秘字节的第一个 (c) 和第五个 (g) 实际上刷新了对我来说似乎是随机的值。其他 4 个字节保持为零,但如果我将任何内容放入其中,即使设置了视频模式,它也能幸存下来。

assembly intel osdev vga video-memory

5
推荐指数
1
解决办法
226
查看次数

插入新线组件 8086

我正在学习汇编语言,我有一个疑问。我正在使用以下代码编写一个简单的“hello world”:

.model small
.stack
.data
    message db 'Hello world! $'
.code
start:
    mov dx,@data
    mov ds.dx

    lea dx,message
    move ah,09h
    int 21h

mov ax,4c00h
int 21h
end start
Run Code Online (Sandbox Code Playgroud)

我假设它message db 'Hello world! $'像一个字符串一样工作,现在我想知道是否可以添加像 \n 这样的东西来使输出分成两行,就像这样message db 'Hello\nworld! $'。那可能吗?

assembly x86-16

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

什么会在Int 13h中导致磁盘读取错误?

我一直在用NASM编写一个测试程序,该函数用于int 13h从引导磁盘读取扇区,但每次使用sudo qemu-system-i386 load_disk.bin运行汇编程序时,它都会为我提供以下输出:

磁盘读取错误!磁盘读取错误!磁盘读取错误!*磁盘读取错误!*磁盘读取错误!*

如果设置了进位标志(CF),则可以预期。我一直在寻找答案的几天,并尝试了许多不同的解决方案(跳转到ES:BX之后jc test,将启动驱动器保存在DL...中),但似乎没有任何效果。
这是我的程序:

[bits 16]                       ;real mode 
[org 0x7c00] 

mov [DISK], dl                  ;save boot drive value 

xor ax, ax                      ;setting up stack 
cli 
mov ss, ax 
mov sp, 0x7c00 
sti 

mov di, 5       `               ;counter for number of tries 
read_disk:                      
mov ah, 0x00                    ;resetting disk 
int 0x13 
mov bx, 0x9000                  ;data buffer 
mov es, bx 
mov bx ,0x0000                   
mov ah, 0x02                    ; function number …
Run Code Online (Sandbox Code Playgroud)

assembly bios nasm bootloader x86-16

5
推荐指数
1
解决办法
577
查看次数

DOSBox上的8086汇编:带有idiv指令的Bug?

我帮助我的一个朋友调试他的程序,我们把它缩小到一个甚至在这里发生的问题:

.MODEL small
.STACK 16
.CODE
start:
    mov ax, 044c0h
    mov bl, 85
    idiv bl
exit:
    mov ax, 4c00h
    int 21h

end start
Run Code Online (Sandbox Code Playgroud)

用tasm 4.1组装它,然后在DOSBox 0.74上运行它,它进入一个无限循环.当涡轮调试器检查它人们可以看到它之后发生idiv的指令,这对于一些原因,修改csip登记,并经过两次看似随意指令恢复它们指向idiv线,再次执行它循环往复.

有没有人对此有任何解释?

x86 assembly tasm dosbox x86-16

5
推荐指数
1
解决办法
809
查看次数

如何在DOS程序集中正确挂接Interrupt 28h并将其还原?

我试图将Interrupt 28h的处理程序设置为我自己的例程,恢复所有涉及的寄存器和标志,并恢复原始的Interrupt处理程序。我在VirtualBox中的DOSBox和MS-DOS 6.22下使用NASM汇编器。

我已经考虑过调试,但是在TSR程序上进行调试听起来似乎是不可能的。我尝试将数据段推到代码段上,并保存原始数据段以供以后还原,但是即使还原了数据段后,它似乎仍挂起了计算机。

section .text   ;Code Section
org 100h        ;DOS Executable Start
mov ah,35h      ;Get Interrupt Vector
mov al,28h      ;Of Interrupt 28h
int 21h         ;Call DOS Kernel
push cs         ;Push Code Segment
pop ds          ;Onto Data Segment
mov [oldseg],es ;Save Old Interrupt Vector Segment
mov [oldoff],bx ;Save Old Interrupt Vector Offset
mov ah,25h      ;Set Interrupt Vector
mov dx,resstart ;To Resstart
int 21h         ;Call DOS Kernel
mov dx,resend   ;Set Data Offset to Resend
sub dx,resstart ;Subtract Resstart
shr dx,4h       ;Shift …
Run Code Online (Sandbox Code Playgroud)

assembly dos interrupt x86-16

5
推荐指数
1
解决办法
197
查看次数

ImportError:无法从“collections”导入名称“MutableMapping”(/usr/local/lib/python3.10/collections/__init__.py)

我正在 vs code 中运行这个简单的 Flask 应用程序。将其 Docker 化并加载到 ECS。任务正在退出并出现以下错误:

ImportError:无法从“collections”导入名称“MutableMapping”(/usr/local/lib/python3.10/collections/ init .py)

我使用的基础镜像是python3.10。

以下是dockerfile代码:

FROM python:3.10
WORKDIR /usr/src/app
COPY . .
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 5000
Run Code Online (Sandbox Code Playgroud)

为什么我会收到此错误?

amazon-ecs flask python-3.x dockerfile

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

为什么lea rax[rip±0xeb3]中有一个“±”?

我刚刚开始在 VMware 中的 Kali Linux 中学习汇编语言。我有一个锐龙 5 CPU。在下面的代码片段中,我有一些不明白的地方。

\n
    \n
  • lea rax, [rip \xc2\xb1 0xeb3]at <main + 17>是什么意思?我明白是什么lea意思,但是 \xc2\xb1 的含义是什么?
  • \n
  • 那么RDI更新后的用途是什么?
  • \n
\n
(gdb) list\n1       #include<stdio.h>\n2\n3       int main(){\n4               int i;\n5               for(i = 0 ; i < 10 ; i++){\n6                       printf("Hello World!\\n");\n7               }\n8               return 0;\n9       }\n(gdb) disassemble main\nDump of assembler code for function main:\n   0x0000000000001139 <+0>:     push   rbp\n   0x000000000000113a <+1>:     mov    rbp,rsp\n   0x000000000000113d <+4>:     sub    rsp,0x10\n   0x0000000000001141 <+8>:     mov    DWORD PTR [rbp-0x4],0x0\n   0x0000000000001148 <+15>:    jmp    0x115d <main+36>\n …
Run Code Online (Sandbox Code Playgroud)

debugging assembly gdb x86-64 disassembly

5
推荐指数
1
解决办法
366
查看次数

NASM 规范中的哪些位置不允许使用十六进制数的语法 FFFFh?

我正在尝试用 ASM 组装一小段代码。此代码将 CX 设置为零,将 AX 设置为 1。我的代码:

mov cx, 0000h
mov ax, ffffh
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

$ nasm foo.asm
foo.asm:2: error: symbol `ffffh' not defined
Run Code Online (Sandbox Code Playgroud)

我可以通过编写mov ax, 0ffffh来解决此错误。但为什么不明白ffffh语法呢?NASM 文档中的哪个位置指定了允许使用哪些十六进制语法,不允许使用哪些十六进制语法?

我读了https://nasm.us/doc/nasmdoc3.html#section-3.4.1但找不到任何不允许的内容ffffh语法的内容。我缺少什么?

我也阅读了作为对此问题的评论提供的其他一些类似问题。但它们似乎都没有指出一些权威文档或规范来确认数字必须以数字开头。如果有人可以指出 NASM 文档中的确切摘录或某些规范来证实这一点,那就可以回答这个问题。

syntax x86 assembly hex nasm

5
推荐指数
1
解决办法
264
查看次数

如何在CPU内部存储浮点数?

我是一个初学者,正在学习组装基础知识。现在,在阅读此问题时,我来到了这一段。它说明了如何将浮点数存储在内存中。

浮点数的指数是8位字段。为了允许存储大数或小数,将指数解释为正数或负数。实际指数是8位字段的值减去127。127是32位浮点数的“指数偏差”。浮点数的分数字段让人有些意外。由于将0.0定义为所有设置为0的位,因此无需担心将0.0表示为等于127的指数字段并将小数字段设置为所有O。所有其他数字至少具有一个1位,因此IEEE 754格式使用隐式1位来节省空间。因此,如果小数字段为00000000000000000000000,则将其解释为1。00000000000000000000000。这允许分数字段有效地为24位。

我一点都不明白。

您能解释一下它们如何存储在内存中吗?我不需要参考,我只需要一个很好的解释即可轻松理解。

floating-point assembly ieee-754

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

循环中复制与去重相同条件代码的性能

假设我有这样的代码,称之为版本 1:

while (some_condition) {
    // .. work that may trigger rare_condition ...

    if (rare_condition) {
        // .. rare work here ..
        continue;
    }

    // .. work that may trigger rare_condition ...

    if (rare_condition) {
        // .. rare work here ..
        continue;
    }

    // .. more work
}
Run Code Online (Sandbox Code Playgroud)

假设这两种情况下的“稀有作品”是相同的。我们可以等效地编写版本 2:

while (some_condition) {
    // .. work that may trigger rare_condition ...

    if (rare_condition) {
        goto rare_work;
    }

    // .. work that may trigger rare_condition ...

    if (rare_condition) {
        goto rare_work; …
Run Code Online (Sandbox Code Playgroud)

c optimization performance assembly x86-64

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