- 问题**开发一个ALP,使用BIOS中断写入像素和字符,在图形显示器第2页中间的两条50像素长的水平线之间以不同颜色显示您的注册号。
- 代码**
org 100h
section .data
; The registration number to display
msg db 'Your Registration Number$'
section .text
; Set up graphics mode
mov ax, 0013h
int 10h
; Draw top line
mov cx, 50
mov bx, 0
mov ah, 0Ch ; Set up to draw pixel
mov al, 0Fh ; Set color to white
draw_top_line:
int 10h
inc bx ; Move to next pixel
loop draw_top_line ; Repeat for entire line
; Write registration number
mov si, offset msg
mov bh, 0
mov bl, 0Ah ; Set text color to cyan
mov ah, 0Eh ; Set up to write character
mov cx, 24 ; Set number of characters to write
mov dx, 140 ; Set starting X position
mov dh, 90 ; Set starting Y position
print_msg:
lodsb ; Load character from memory
cmp al, '$' ; Check for end of string
je end_print ; Exit loop if end of string
int 10h ; Write character
inc dh ; Move cursor down
jmp print_msg ; Loop to next character
end_print:
; Draw bottom line
mov cx, 50
mov bx, 1900h ; Set starting address of bottom line
mov ah, 0Ch ; Set up to draw pixel
mov al, 0Fh ; Set color to white
draw_bottom_line:
int 10h
add bx, 320 ; Move to next row of pixels
loop draw_bottom_line ; Repeat for entire line
; Clean up and restore text mode
mov ax, 0003h
int 10h
; Exit program
mov ah, 4Ch
int 21h
使用emu8086时出现这些错误。
(3) illegal instruction: section .data or wrong parameters.
(7) illegal instruction: section .text or wrong parameters.
这个程序有什么问题,我该如何修复?
1条答案
按热度按时间1aaf6o9v1#
简短回答
删除行
section .data
和section .text
。你不需要这些,因为提到org 100h
表明你的目标是一个. COM可执行文件。只要确保你把数据放在代码下面,就像我下面展示的那样:长答案
在图形显示器PAGE-2中间两条50像素长的水平线之间以不同颜色显示注册号使用BIOS中断写入像素和字符
您使用BIOS. WritePixel函数0Ch和BIOS. Teletype函数0Eh是可以的。但是您没有查阅手册了解这些函数所需的参数吗?您不能在任何寄存器中提供任何奇数值!例如,BIOS. WritePixel函数0Ch要求X坐标在CX寄存器中,Y坐标在DX寄存器中。根本不是你要传递的BX,而且BIOS.teletype函数0Eh不期望DL和DH寄存器中有任何东西,你用一些位置信息来填充。
使用BIOS中断写入像素和字符,在图形显示器的第2页中间的两条50像素长的水平线之间以不同颜色显示注册号
该任务希望您使用彩色图形模式,实际上模式13h是320x200 256色图形模式,但该任务还提到使用"PAGE-2",而这对模式13h不可用。
为了遵守任务描述,您可以在传统视频模式中选择模式0Dh(320x200 16色,8页)或模式0Eh(640x200 16色,4页)。
在下面的代码片段中,我将假设视频模式为模式0Dh。
使用BIOS中断写入像素和字符,在图形显示器PAGE-2中间的两条50像素长的水平线之间以不同颜色显示您的注册号
下面是如何使用BIOS绘制水平线的示例:
因为屏幕是在彩色图形模式下,所以BIOS.Teletype函数0Eh可以用彩色写入。但是从外观上看,似乎您提供了许多针对另一个BIOS函数(WriteString 13h)的参数。您不能只是混合这些参数。
下面是如何使用BIOS编写消息的示例:
现在这个电传功能开始从光标所在的位置显示字符,所以你必须先用BIOS定位光标。SetCursorPosition功能02h:
最后,由于所有输出都转到了显示页面2(而显示页面0显示在屏幕上),现在是实际切换到显示页面2的时候了:
当然,在切换回文本视频模式之前,给自己一个机会看看结果。只需等待用户按下一个键:
最后备注:如果您的模拟器不支持多个显示页面,那么继续使用页码0,并向您的老师抱怨emu8086的无意义任务要求...