在文本屏幕(模式 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 个字节保持为零,但如果我将任何内容放入其中,即使设置了视频模式,它也能幸存下来。
我帮助我的一个朋友调试他的程序,我们把它缩小到一个甚至在这里发生的问题:
.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的指令,这对于一些原因,修改cs和ip登记,并经过两次看似随意指令恢复它们指向idiv线,再次执行它循环往复.
有没有人对此有任何解释?
以下是通过装配网站找到的示例.这是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) 通过Ralph Brown的中断列表,我发现有许多不同的方法可以将文本字符输出到屏幕上.
ROM BIOS API提供以下功能:
DOS API提供以下功能:
这些功能有什么作用?我怎么称呼他们?我如何在它们之间做出选择?
我刚开始学习汇编语言。我用的是在线编译器,但今天我下载了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 生成的代码中不需要的 。谁能帮我?
我试图将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) 我有一个老游戏... 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) 我正在尝试围绕 x86 指令编码格式。我阅读的所有资料仍然使这个主题变得混乱。我开始有点理解它,但我无法理解的一件事是 CPU 指令解码器如何区分操作码前缀和操作码。
我知道指令的整个格式基本上取决于操作码(当然在操作码中定义了额外的位字段)。有时指令没有前缀,操作码是第一个字节。解码器怎么知道?
我假设指令解码器能够分辨出差异,因为操作码字节和前缀字节不会共享相同的二进制值。因此解码器可以判断字节中唯一的二进制数是指令还是前缀。例如(在本例中,我们将坚持使用单字节操作码)REX或LOCK前缀不会与架构指令集中的任何操作码共享相同的字节值。
x86 assembly cpu-architecture machine-code instruction-encoding
我正在 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)
为什么我会收到此错误?
为了测量主存储器的带宽,我提出了以下方法。
代码(针对英特尔编译器)
#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
assembly ×9
x86 ×4
dos ×3
x86-16 ×3
amazon-ecs ×1
benchmarking ×1
bios ×1
c ×1
c++ ×1
debugging ×1
disassembly ×1
dockerfile ×1
dosbox ×1
flask ×1
gdb ×1
intel ×1
interrupt ×1
machine-code ×1
nasm ×1
osdev ×1
python-3.x ×1
tasm ×1
vga ×1
video-memory ×1