assembly - 打印装配图
问题描述
我正在组装 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 是一个从程序集库中打印新行的函数
解决方案
WRITE永远不会执行!
就在您尝试此WRITE之前,您call
是LoginPage但它永远不会返回,因为它以有效地创建无限循环call
的SignUpPage结束!
你有很多未定义的行为!
您使用的屏幕水平为 320 像素,垂直为 200 像素。尽管如此,您的代码要求 BIOS 在 X 范围 [0, 640 ] 和 Y 范围 [ -1 ,29] 中绘制像素。
推荐阅读
- javascript - 使用 React useState 访问嵌套数组数据时遇到问题
- c++ - 为什么递归函数以预期的方式更改其参数(C++)?
- python - 在线使用Airtable Python Wrapper文档问题
- java - MySQL trigger working through direct insert, but not when committing through Hibernate
- javascript - 每次进行更改时都需要运行“npm run build”吗?
- c++ - 函数调用中的参数顺序重要吗?
- c# - 有没有办法预测 `Marshal.GetExceptionForHR(code, pointers)` 会抛出 `AccessViolationException`
- opencv - GPS到像素坐标
- reactjs - HTML Canvas,带有 React 钩子和 Typescript
- c - 如何从用户输入和 txt 文件中读取 - C 控制台