在文本屏幕(模式 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 个字节保持为零,但如果我将任何内容放入其中,即使设置了视频模式,它也能幸存下来。
我正在学习汇编语言,我有一个疑问。我正在使用以下代码编写一个简单的“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! $'。那可能吗?
我一直在用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) 我帮助我的一个朋友调试他的程序,我们把它缩小到一个甚至在这里发生的问题:
.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线,再次执行它循环往复.
有没有人对此有任何解释?
我试图将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) 我正在 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)
为什么我会收到此错误?
我刚刚开始在 VMware 中的 Kali Linux 中学习汇编语言。我有一个锐龙 5 CPU。在下面的代码片段中,我有一些不明白的地方。
\nlea rax, [rip \xc2\xb1 0xeb3]at <main + 17>是什么意思?我明白是什么lea意思,但是 \xc2\xb1 的含义是什么?(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) 我正在尝试用 ASM 组装一小段代码。此代码将 CX 设置为零,将 AX 设置为 1。我的代码:
mov cx, 0000h
mov ax, ffffh
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误:
Run Code Online (Sandbox Code Playgroud)$ nasm foo.asm foo.asm:2: error: symbol `ffffh' not defined
我可以通过编写mov ax, 0ffffh来解决此错误。但为什么不明白ffffh语法呢?NASM 文档中的哪个位置指定了允许使用哪些十六进制语法,不允许使用哪些十六进制语法?
我读了https://nasm.us/doc/nasmdoc3.html#section-3.4.1但找不到任何不允许的内容ffffh语法的内容。我缺少什么?
我也阅读了作为对此问题的评论提供的其他一些类似问题。但它们似乎都没有指出一些权威文档或规范来确认数字必须以数字开头。如果有人可以指出 NASM 文档中的确切摘录或某些规范来证实这一点,那就可以回答这个问题。
我是一个初学者,正在学习组装基础知识。现在,在阅读此问题时,我来到了这一段。它说明了如何将浮点数存储在内存中。
浮点数的指数是8位字段。为了允许存储大数或小数,将指数解释为正数或负数。实际指数是8位字段的值减去127。127是32位浮点数的“指数偏差”。浮点数的分数字段让人有些意外。由于将0.0定义为所有设置为0的位,因此无需担心将0.0表示为等于127的指数字段并将小数字段设置为所有O。所有其他数字至少具有一个1位,因此IEEE 754格式使用隐式1位来节省空间。因此,如果小数字段为00000000000000000000000,则将其解释为1。00000000000000000000000。这允许分数字段有效地为24位。
我一点都不明白。
您能解释一下它们如何存储在内存中吗?我不需要参考,我只需要一个很好的解释即可轻松理解。
假设我有这样的代码,称之为版本 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) assembly ×9
x86-16 ×4
nasm ×2
x86 ×2
x86-64 ×2
amazon-ecs ×1
bios ×1
bootloader ×1
c ×1
debugging ×1
disassembly ×1
dockerfile ×1
dos ×1
dosbox ×1
flask ×1
gdb ×1
hex ×1
ieee-754 ×1
intel ×1
interrupt ×1
optimization ×1
osdev ×1
performance ×1
python-3.x ×1
syntax ×1
tasm ×1
vga ×1
video-memory ×1