assembly 尝试使用TASM和DOSBox输出字符串并设置背景颜色时出错

1szpjjfi  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(110)

我正在测试一个TASM程序来设置背景颜色并输出一个字符串。但我犯了错误。

.model small
.stack 100h

.data
    prompt db 13, 10, 'Hello Gaiz!', '$'

.code
    start:

        call color    ; Call the color procedure to set the background color
        call output

        mov ax, 4C00h  ; Exit program
        int 21h
        
output proc
    mov ah, 09h
    lea dx, prompt
    int 21h
    ret
output endp

color proc
    MOV AH, 06h    ; Scroll up function
    XOR AL, AL     ; Clear entire screen
    XOR CX, CX     ; Upper left corner CH=row, CL=column
    MOV DX, 184FH  ; lower right corner DH=row, DL=column 
    MOV BH, 42H   ; Red and Green
    INT 10H
    ret
color endp

end start

运行时,随机字符和不正确执行.

8ulbf1ek

8ulbf1ek1#

mov ah, 09h
lea dx, prompt
int 21h

你传递给DOS的指针实际上是DS:DX。遗憾的是,您忘记在程序开始时初始化DS段寄存器。对于这个使用small模型的**.EXE程序**,DS默认将指向PSP(程序段前缀)。只需在您的程序旁边添加:

.code
    start:
        mov     ax, @data     ; Setup DS
        mov     ds, ax        ;
        call    color

也可以简单一点

开始开发**.COM程序**。设置段寄存器没有问题,因为它们开始时彼此相等(CS=DS=ES=SS):

ORG 256

  call color      ; Call the color procedure to set the background color
  call output
  mov  ax, 4C00h  ; Exit program
  int  21h
        
output:
  mov  ah, 09h
  lea  dx, prompt
  int  21h
  ret

color:
  MOV  AH, 06h    ; Scroll up function
  XOR  AL, AL     ; Clear entire screen
  XOR  CX, CX     ; Upper left corner CH=row, CL=column
  MOV  DX, 184FH  ; lower right corner DH=row, DL=column 
  MOV  BH, 42H    ; Red and Green
  INT  10H
  ret

prompt db 13, 10, 'Hello Gaiz!', '$'

相关问题