首页 > 解决方案 > 打印装配图

问题描述

我正在组装 tasm ms-dos 中创建一个注册页面和一个登录页面。我正在尝试在屏幕上打印“名称:”,但只要屏幕上有绘图,它就不起作用。你知道我做错了什么吗?这是我的代码:


proc SignUpPage
    mov ah, 0   ; set display mode function.
    mov al, 13h ; mode 13h = 320x200 pixels, 256 colors.
    int 10h     ; set it!
    mov al, 0Fh
    mov cx, -1  ;col
    mov dx, -1 ;row
    mov ah, 0ch ; put pixel
    ;jmp WRITE
    signUpTopBar:
    inc cx
    int 10h
    cmp cx, 640
    jne signUpTopBar

    mov cx, 10  ; reset to start of col
    inc dx      ;next row
    cmp dx, 30
    jne signUpTopBar

    mov al, 0h
    mov cx, 0  ;col
    mov dx, 5  ;row
    mov ah, 0ch ; put pixel


    loginButton:
    inc cx
    int 10h
    cmp cx, 60
    jne loginButton

    mov cx, 0  ; reset to start of col
    inc dx      ;next row
    cmp dx, 30
    jne loginButton

    call printNewLine
    call printNewLine
    mov dx, offset LoginMessage
    mov ah, 09h
    int 21h

    mov ax, 0h
    int 33h
    mov ax, 1h
    int 33h
    pressLogin:
    mov ax, 3h
    int 33h
    cmp bx, 01h
    jne pressLogin
    shr cx, 1
    sub dx, 2
    cmp cx, 60
    ja pressLogin
    cmp dx, 5
    jb pressLogin
    cmp dx, 30
    ja pressLogin
    mov si, 0
    mov cx, 200
    BREAKLINE_SIGNUP:
        call printNewLine
        inc si
        loop BREAKLINE_SIGNUP
    call LoginPage
    WRITE:
    MOV  DL, 0   ;SCREEN COLUMN.
    MOV  DH, 7     ;SCREEN ROW.
    MOV  AH, 2     ;SERVICE TO SET CURSOR POSITION.
    MOV  BH, 0     ;PAGE NUMBER.
    INT  10H       ;BIOS SCREEN SERVICES.
    mov dx, offset nameMessage
    mov ah, 09h 
    int 21h
    
    
    ret
endp SignUpPage

proc LoginPage
    mov ah, 0   ; set display mode function.
    mov al, 13h ; mode 13h = 320x200 pixels, 256 colors.
    int 10h     ; set it!
    mov al, 0Fh
    mov cx, -1  ;col
    mov dx, -1 ;row
    mov ah, 0ch ; put pixel

   
    loginTopBar:
    inc cx
    int 10h
    cmp cx, 640
    jne loginTopBar

    mov cx, 10  ; reset to start of col
    inc dx      ;next row
    cmp dx, 30
    jne loginTopBar

    mov al, 0h
    mov cx, 0  ;col
    mov dx, 5  ;row
    mov ah, 0ch ; put pixel


    signUpButton:
    inc cx
    int 10h
    cmp cx, 70
    jne signUpButton

    mov cx, 0  ; reset to start of col
    inc dx      ;next row
    cmp dx, 30
    jne signUpButton

    call printNewLine
    call printNewLine
    mov dx, offset SignUpMessage
    mov ah, 09h
    int 21h

    mov ax, 0h
    int 33h
    mov ax, 1h
    int 33h
    pressSignUp:
    mov ax, 3h
    int 33h
    cmp bx, 01h
    jne pressSignUp
    shr cx, 1
    sub dx, 2
    cmp cx, 60
    ja pressSignUp
    cmp dx, 5
    jb pressSignUp
    cmp dx, 30
    ja pressSignUp
    mov si, 0
    mov cx, 200
    call SignUpPage
    ret
endp LoginPage

调用 printNewLine 是一个从程序集库中打印新行的函数

标签: assemblyprintingx86dostasm

解决方案


WRITE永远不会执行!

就在您尝试此WRITE之前,您callLoginPage但它永远不会返回,因为它以有效地创建无限循环callSignUpPage结束!

你有很多未定义的行为!

您使用的屏幕水平为 320 像素,垂直为 200 像素。尽管如此,您的代码要求 BIOS 在 X 范围 [0, 640 ] 和 Y 范围 [ -1 ,29] 中绘制像素。


推荐阅读