小编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
查看次数

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
查看次数

如何将汇编代码与C程序中的确切行关联?

以下是通过装配网站找到的示例.这是C代码:

 int main()
 {
     int a = 5;
     int b = a + 6;
     return 0;
 }
Run Code Online (Sandbox Code Playgroud)

这是相关的汇编代码:

    (gdb) disassemble
    Dump of assembler code for function main:
    0x0000000100000f50 <main+0>:    push   %rbp
    0x0000000100000f51 <main+1>:    mov    %rsp,%rbp
    0x0000000100000f54 <main+4>:    mov    $0x0,%eax
    0x0000000100000f59 <main+9>:    movl   $0x0,-0x4(%rbp)
    0x0000000100000f60 <main+16>:   movl   $0x5,-0x8(%rbp)
    0x0000000100000f67 <main+23>:   mov    -0x8(%rbp),%ecx
    0x0000000100000f6a <main+26>:   add    $0x6,%ecx
    0x0000000100000f70 <main+32>:   mov    %ecx,-0xc(%rbp)
    0x0000000100000f73 <main+35>:   pop    %rbp
    0x0000000100000f74 <main+36>:   retq   
    End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

我可以放心地假设这行汇编代码:

  0x0000000100000f6a <main+26>:   add    $0x6,%ecx
Run Code Online (Sandbox Code Playgroud)

与此C行相关:

     int b = a …
Run Code Online (Sandbox Code Playgroud)

c debugging assembly gdb

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

使用DOS或BIOS显示字符

通过Ralph Brown的中断列表,我发现有许多不同的方法可以将文本字符输出到屏幕上.

ROM BIOS API提供以下功能:

  • AH = 09h - 在光标位置写字符和属性
  • AH = 0Ah - 仅在光标位置写入字符
  • AH = 0Eh - 电传输出
  • AH = 13h - 写字符串

DOS API提供以下功能:

  • AH = 02h - 将字符写入标准输出
  • AH = 06h - 直接控制台输出
  • AH = 09h - 将字符串写入标准输出

这些功能有什么作用?我怎么称呼他们?我如何在它们之间做出选择?

x86 assembly dos bios

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

NASM 汇编程序 - 生成的机器代码中不需要 66

  • 操作系统:Windows 10
  • CPU:英特尔酷睿i5-5300U
  • 架构:x64

我刚开始学习汇编语言。我用的是在线编译器,但今天我下载了NASM。我试图组装这个简单的代码,将 10 乘以 15:

mov eax, 0xa
mov edx, 0xf
imul eax, edx
ret
Run Code Online (Sandbox Code Playgroud)

尝试执行由 NASM 生成的机器代码失败,因此我在十六进制编辑器中打开此代码并将其与我可以成功执行的在线汇编程序生成的代码进行比较。

纳姆:

66 b8 0a 00 00 00 66 ba 0f 00 00 00 66 0f af c2 c3
Run Code Online (Sandbox Code Playgroud)

在线编辑:

b8 0a 00 00 00 ba 0f 00 00 00 0f af c2 c3
Run Code Online (Sandbox Code Playgroud)

这两个代码之间的唯一区别66是 NASM 生成的代码中不需要的 。谁能帮我?

x86 assembly nasm

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

如何在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
查看次数

反汇编旧的 .COM 文件。卡在 48 字节以内。字节序问题?

我有一个老游戏... Starflight。我认为它是在 86 年推出的。好 ol' IBM PC jr 日子。我想我会打开一个反汇编器,看看它是如何工作的。我可以在我解码的小部分中看到,代码大小确实得到了优化……但我最终跳转到了文件之外的地址。这是没有意义的。

我在下面的列表中添加了评论;他们是我的“想法”。

在加载其他文件之前,我假设,int 0x3d或者int 0x0f...因为所有段寄存器都指向同一个内存段......并且该段是代码段,.COM文件,每个内存引用或跳转都应该留在文件。是的?

星际迷航

00000000 FA                       CLI                     ;Prevent interrupts
00000001 8CC8                     MOV AX,CS               ;Copy code segment to all segments
00000003 8ED0                     MOV SS,AX
00000005 8EC0                     MOV ES,AX
00000007 8ED8                     MOV DS,AX
00000009 BE2901                   MOV SI,word 0x0129      ;SI = 0x0129
0000000C 8B7C02                   MOV DI,word [SI+0x02]   ;DI = 0x3c15 (SI+2)
0000000F 47                       INC DI
00000010 47                       INC DI                  ;DI = 0x3c17
00000011 BB0507                   MOV BX,word 0x0705      ;BX = …
Run Code Online (Sandbox Code Playgroud)

assembly dos disassembly x86-16

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

指令解码器如何区分前缀和主要操作码之间的区别?

我正在尝试围绕 x86 指令编码格式。我阅读的所有资料仍然使这个主题变得混乱。我开始有点理解它,但我无法理解的一件事是 CPU 指令解码器如何区分操作码前缀和操作码。

我知道指令的整个格式基本上取决于操作码(当然在操作码中定义了额外的位字段)。有时指令没有前缀,操作码是第一个字节。解码器怎么知道?

我假设指令解码器能够分辨出差异,因为操作码字节和前缀字节不会共享相同的二进制值。因此解码器可以判断字节中唯一的二进制数是指令还是前缀。例如(在本例中,我们将坚持使用单字节操作码)REXLOCK前缀不会与架构指令集中的任何操作码共享相同的字节值。

x86 assembly cpu-architecture machine-code instruction-encoding

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

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万
查看次数

错误的单线程内存带宽基准

为了测量主存储器的带宽,我提出了以下方法。

代码(针对英特尔编译器)

#include <omp.h>

#include <iostream> // std::cout
#include <limits> // std::numeric_limits
#include <cstdlib> // std::free
#include <unistd.h> // sysconf
#include <stdlib.h> // posix_memalign
#include <random> // std::mt19937


int main()
{
    // test-parameters
    const auto size = std::size_t{150 * 1024 * 1024} / sizeof(double);
    const auto experiment_count = std::size_t{500};
    
    //+/////////////////
    // access a data-point 'on a whim'
    //+/////////////////
    
    // warm-up
    for (auto counter = std::size_t{}; counter < experiment_count / 2; ++counter)
    {
        // garbage data allocation and memory page loading …
Run Code Online (Sandbox Code Playgroud)

c++ benchmarking assembly performance-testing memory-bandwidth

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