assembly 在图形显示器的PAGE-2中间用不同颜色在两条50象素长的水平线之间显示字符r的ALP程序

lsmepo6l  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(113)
    • 问题**开发一个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.

这个程序有什么问题,我该如何修复?

1aaf6o9v

1aaf6o9v1#

简短回答

删除行section .datasection .text。你不需要这些,因为提到org 100h表明你的目标是一个. COM可执行文件。只要确保你把数据放在代码下面,就像我下面展示的那样:

ORG 256

  ; Set up graphics mode
  mov  ax, 000Dh
  int  10h

  ...

  ; Exit program
  mov  ah, 4Ch
  int  21h

msg db '123456', 0

长答案

在图形显示器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绘制水平线的示例:

; Draw top line
  mov  dx, 95           ; Y
  mov  cx, 135          ; X
  mov  bh, 2            ; Page 2
draw_top_line:
  mov  ax, 0C0Fh        ; AH=0Ch WritePixel, AL=0Fh White
  int  10h
  inc  cx               ; Next X
  cmp  cx, 185
  jb   draw_top_line
    • 显示您的注册号在两条50像素长的水平线之间用不同的颜色**在图形显示器PAGE-2的中间,使用BIOS中断写入像素和字符

因为屏幕是在彩色图形模式下,所以BIOS.Teletype函数0Eh可以用彩色写入。但是从外观上看,似乎您提供了许多针对另一个BIOS函数(WriteString 13h)的参数。您不能只是混合这些参数。
下面是如何使用BIOS编写消息的示例:

; Write registration number
  mov  si, offset msg
  mov  bx, 020Ah        ; BH=0 Page, BL=10 Cyan
print_msg:
  lodsb                 ; Load character from memory
  cmp  al, 0            ; Check for end of string
  je   end_print
  mov  ah, 0Eh          ; Teletype
  int  10h
  jmp  print_msg
end_print:

现在这个电传功能开始从光标所在的位置显示字符,所以你必须先用BIOS定位光标。SetCursorPosition功能02h:

mov  dx, 0C11h        ; DH=12 Row, DL=17 Column
  mov  bh, 2            ; Page
  mov  ah, 02h          ; BIOS.SetCursorPosition
  int  10h

最后,由于所有输出都转到了显示页面2(而显示页面0显示在屏幕上),现在是实际切换到显示页面2的时候了:

mov  ax, 0502h
  int  10h

当然,在切换回文本视频模式之前,给自己一个机会看看结果。只需等待用户按下一个键:

mov  ah, 00h
  int  16h
  mov  ax, 0003h
  int  10h
  mov  ah, 4Ch
  int  21h

最后备注:如果您的模拟器不支持多个显示页面,那么继续使用页码0,并向您的老师抱怨emu8086的无意义任务要求...

相关问题