【发布时间】:2016-07-31 06:35:36
【问题描述】:
我对 Assembly 非常陌生 - 不到一周的经验。我试图从提示中接收一个字符,然后以十进制显示 ASCII 码。我已经为此工作了几个小时,并决定来这里。
当我在提示符中输入“a”时,我的模拟器显示我的 char 变量正在存储 61 十六进制,这是正确的。我似乎无法将其打印到屏幕上(十六进制或十进制)。
编辑:将代码更改为循环并除以十。我有正确的字符打印出来,但相反。数字 97 打印出 79
到目前为止,这就是我所拥有的:
; **************** MACROS *********************
; START PROGRAM
START MACRO
MOV AX, DATA ; Data Segment to AX Register
MOV DS, AX ; HAVE DS Point to Data Segment
ENDM
; END PROGRAM
END MACRO
MOV AH, 4CH ; END Program
INT 21H ; Call DOS Service
ENDM
; PRINT STRING TO OUTPUT
PSTRING MACRO STR
MOV AH,09H
LEA DX,STR
INT 21H
ENDM
; Creates a New Line
NEWLINE MACRO
MOV DX, 0AH ; Input of string to DX
MOV AH, 02H ; Write Char to standard output
INT 21H
MOV DL, 0DH ;
MOV AH, 02H ; Carriage Return
INT 21H ;
ENDM
; Get CHAR Input
GETINPUT MACRO INPUT
MOV AH, 01H ; Receive input
INT 21H ; Call DOS Service
MOV INPUT, AL ; Store into Input Variable
ENDM
; ********** END MACROS *******************
.MODEL
.DATA
MSG1 db 'Choose A Char to Convert To ASCII: $'
CHAR db ? ; Store Input Char
REM db ? ; Remainder 8-bit storate
QUOT db ? ; Quotient 8-bit storage
.CODE
MAIN PROC
START
PSTRING MSG1
GETINPUT CHAR
NEWLINE
MOV AX, 0 ; Clear AX Register
MOV AL, CHAR ; Move input to AL
MOV DX, 0 ; Clear DX Register
MOV DL, 10 ; Add 10 to DL Register
DIV DL ; Divide By Number of Students For Average
; ********************** ;
; QUOTIENT STORED IN AL ;
; REMAINDER STORED IN AH ;
; ********************** ;
myLoop:
MOV REM, AH ; Move Remainder into REM Variable
MOV QUOT, AL ; Move Quotient into QUOT Variable
MOV DL, REM ; Move Data we want printed into DL
ADD DL, '0' ; Make into Ascii Char
MOV AH,02H ; Output Char Service
INT 21H ; Call DOS Service
MOV AL, QUOT ; Place Quotient Into AL
MOV AH, 0 ; AH was altered, Zero it out
MOV DL, 10 ; Set Divisor to 10
DIV DL ; Divide AX by 10
CMP AH, 0 ; If No Quotient Remains we can exit
JNZ myLoop ; Jump if NOT zero
MOV AH, 4CH ; End Program
INT 21H
END
MAIN ENDP
END MAIN
【问题讨论】:
-
您的
PSTRING宏使用int 21h/ah=9 输出到控制台。从链接中,您将看到该字符串假定以$结尾。您可以做的是在您将角色写入的位置之后将$放入内存中。您应该可以通过将CHAR db ?更改为CHAR db ?, '$'来做到这一点。这应该可以解决显示垃圾的问题。 -
解决了一个问题,哈哈。主要问题是我现在正在做的事情。看看我修改后的代码。我做了一个循环将十六进制数除以 10,然后输出每个数字。问题是我的号码出来了 esrever ......对不起,我的意思是反向。例如,我可以得到 'a' 的值为 97,但结果是 79
-
我没有看到你的代码,但我猜你正在循环重复除以 10。它是倒退的,因为您正在处理从最低有效数字到最高有效数字的数字。有很多方法可以解决这个问题,如果您看的话,甚至在 StackOverflow 上也有一些示例(一种是基于堆栈的,另一种是将字符写入从右到左存储它们的输出缓冲区)
-
@MichaelPetch 忘记包含您的姓名,以便您看到回复。谢谢你的时间迈克尔
-
@MichaelPetch(抱歉,编辑时间比我想象的要长)我见过的大多数推送/弹出方法将数字推送到 ax,但尝试这样做时总是出错。任何方式您都可以向我展示 8086 中的 push/pop 示例。我会继续看
标签: assembly decimal ascii x86-16 emu8086