assembly - 在汇编中读写过程和宏
问题描述
我需要定义一个宏来帮助我从键盘读取一个无符号整数,以及一个包含在库中的过程来将数字打印到控制台。这是我的代码:
; READ UNSIGNED NUMBER
READNUM MACRO NUM
LOCAL MAINLOOP, FINISH
MOV DX, 10
MAINLOOP:
MOV AH, 01H
INT 21H ; echo read a single key
CMP AL, 0DH ; when ENTER, finish reading
JE FINISH
SUB AL, '0' ; subtract 48, ASCII code of 0, to get numeric value
MOV CL, AL ; place what we read in CL
XOR CH, CH ; CH = 0
MOV AX, BX ; get the existing number (stored in BX)
MUL DL ; multiply it by 10
ADD AL, CL ; add the newly read digit
MOV BX, AX ; place the completed number in BX
JMP MAINLOOP
FINISH:
MOV NUM, BL ; place the current number
ENDM
; PRINT UNSIGNED NUMBER
DATAP SEGMENT PARA PUBLIC 'DATA'
COUNT DB 0
DATAP ENDS
CODEP SEGMENT PARA PUBLIC 'CODE'
PUBLIC PRINTNUM ; public declaration for PRINTNUM
ASSUME DS: DATAP, CS: CODEP
PRINTNUM PROC FAR
HEXTODEC: ; convert nr from HEX to decimal
XOR DX, DX
MOV BX, 10
; NUMBER TO BE DIVIDED IS IN AX
DIV BX ; divide the number by 10, quotient is in AL, remainder is in AH if BYTE, else DX
MOV BH, 0
MOV BL, AH
PUSH BX ; push remainder onto stack
INC COUNT ; count nr of digits of number
CMP AL, 0 ; check if quotient is 0
JNE HEXTODEC ; if != 0, keep dividing
MOV AH, 02H ; prepare for printing
PRINT:
POP DX ; take remainders from stack (in rev order they were obtained)
ADD DL, '0' ; obtain ASCII value from numeric value
INT 21H ; print
DEC COUNT ; decrement number of digits left
CMP COUNT, 0 ; check if there are no more digits left
JNE PRINT ; if != 0, keep printing
RET
PRINTNUM ENDP
CODEP ENDS
END
在我的主文件中,我有这个:
IF 1
INCLUDE C:\TASM\MRNUM.ASM
ENDIF
EXTRN PRINTNUM: FAR
DATA SEGMENT PARA PUBLIC 'DATA'
NUM DB 0
DATA ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
START PROC FAR
ASSUME CS:CODE, DS:DATA
PUSH DS
XOR AX, AX
PUSH AX
MOV AX, DATA
MOV DS, AX
READNUM NUM
MOV AH, 0
MOV AL, NUM
CALL PRINTNUM
RET
START ENDP
CODE ENDS
END START
在 TASM 中运行代码时,我输入的每个数字后都会显示一个字符,因为输出完全是垃圾。我只需要了解问题所在并可能找到可行的解决方案。
解决方案
推荐阅读
- javascript - 从具有相同名称的多个输入类型 =“文本”中获取值
- npm - 我希望能够用 nuxt 构建
- github - Eclipse 导入 github C 项目错误。为什么?
- python - 在 tkinter 中迭代复选框
- file - talend tsendmail 如何使用正则表达式过滤文件?
- caching - 如何查看最后一级缓存中有多少片?
- html - iOS 上显示的 HTML 表格单元格之间的线条问题
- laravel - 注销并重新登录后 Laravel 出现 419 错误(多个选项卡)
- c# - HTML 电子邮件中的 CSS 和图像
- ios - 不推荐使用 unarchiveobjectwithdata