我正在探索使用内存映射图形绘制像素和线条。我在Windows的Textpad中使用TASM。当我单击运行时,整个屏幕变成蓝色,仅此而已,没有绘制像素。.model small.stack.datasaveMode db ?xVal dw ?yVal dw ?.codemain procmov ax, @datamov ds, axcall SetVideoModecall SetScreenBackgroundcall Draw_Some_Pixelscall RestoreVideoModemov ax, 4c00hint 21hmain endpSetScreenBackground proc mov dx, 3c8h mov al, 0 out dx, al mov dx, 3c9h mov al, 0 out dx, al mov al, 0 out dx, al mov al, 35 out dx, al retSetScreenBackground endpSetVideoMode proc mov ah, 0fh int 10h mov saveMode, al mov ah, 0 mov al, 13h int 10h push 0A00h pop es retSetVideoMode endpRestoreVideoMode proc mov ah, 10h int 16h mov ah, 0 mov al, saveMode int 10h retRestoreVideoMode endpDraw_Some_Pixels proc mov dx, 3c8h mov al, 1 out dx, al mov dx, 3c9h mov al, 63 out dx, al mov al, 63 out dx, al mov al, 63 out dx, al mov xVal, 160 mov yVal, 100 mov ax, 320 mul yVal add ax, xVal mov cx, 10 mov di, ax DP1: mov BYTE PTR es:[di], 1 add di, 5 Loop DP1 retDraw_Some_Pixels endp 最佳答案 问题似乎与video mode 13h关联的段有关。 设置视频模式后,下一步是在屏幕上绘制一些内容。 VGA内存位于物理地址0xA0000您的代码可以:SetVideoMode proc mov ah, 0fh int 10h mov saveMode, al mov ah, 0 mov al, 13h ; Video mode 13h int 10h push 0A00h ; Incorrect should be 0A000h pop es retSetVideoMode endp视频模式13h将以segment:offset(在您的情况下为ES:0)为0A000h:0寻址。 0A000h:0是物理地址(0A000h 0A0000h。可以通过将代码更改为以下内容来修复该代码: push 0A000h pop es
09-20 18:18