assembly - 来自用户输入的 8086 简单十进制加法
问题描述
我正在创建一个 8086 汇编程序,要求用户输入一个十进制值,将 5 加到它上面,然后打印。但它使用十六进制值执行计算。
因此,例如,当我输入 5 时:它将是 0x35 + 0x35 = 0x6A 然后 Ox6a 将根据 ASCII 表打印为“j”
我目前使用此中断进行用户输入。
mov AH,01H
INT 21H
这是我到目前为止的代码
.MODEL SMALL
.STACK 300
.DATA
MSG DB "Enter a number: $"
msg2 DB 10,13, "Adding 5 to the number...$"
msg3 DB 10,13, "the number is: $"
.CODE
;init data segment
MOV AX,@DATA
MOV DS, AX
MOV ES, AX
;PRINT MSG
LEA DX,MSG
MOV AH,09H
INT 21H
;GET CHAR
mov AH,01H
INT 21H
MOV CL,AL
;PRINT MSG
LEA DX,MSG2
MOV AH,09H
INT 21H
;newl
MOV dl, 10
MOV ah, 02h
INT 21h
MOV dl, 13
MOV ah, 02h
INT 21h
;computations
ADD CL, 0x35
;PRINT MSG
LEA DX,MSG3
MOV AH,09H
INT 21H
;print char
MOV DL,CL
MOV AH,02H
INT 21H
EXIT:
MOV AH,4CH
INT 21H
END
如何从 8086 上的用户输入进行十进制计算?
解决方案
因此,例如,当我输入 5 时:它将是 0x35 + 0x35 = 0x6A
你需要区分数字和它的文本表示。
当您通过 DOS.GetCharacter 函数 01h 输入并按下5键盘时,DOS 返回一个代表文本字符“5”(0x35)的 ASCII 码。如果您要对输入的数字执行任何计算,您需要留下 ASCII 代码并开始使用 5 的“真实值”。转换只是减去 48 (0x30)。
加5
添加五个就是它的本质,而不是像您写的那样添加 0x35 (53)。
;GET CHAR
mov AH, 01H
INT 21H
sub al, 48 ; From character to number
MOV CL, AL
...
;computations
ADD CL, 5 ; Calculation on numbers
...
;print result
cmp cl, 10
jb IsSingleDigitResult
IsDoubleDigitResult:
mov dl, "1" ; Separately displaying the 'tens'
mov ah, 02h
int 21h
sub cl, 10 ; Isolating the 'ones'
IsSingleDigitResult:
add cl, 48 ; From number to character
MOV DL, CL
MOV AH, 02H
INT 21H
对于介于 5 之间的所有输入5,9加上 5 的结果将由 2 位数字组成。您的代码必须对此有所预见。
推荐阅读
- python - 当我在 tkinter 中调用我为 bind 创建的函数时,我应该给出什么参数
- sparql - SPARQL 端点和 GraphDB
- c# - 定义在 VS 2019 中通过上下文菜单成功发布项目后应执行的自定义 MSBuild 目标
- django - 将类别包含在 URL 中时的 Django urlpatterns
- flutter - Flutter:有多少听众?
- wordpress - AWS ELB 上的 Wordpress 错误 302
- ios - 在 UIDocumentInteractionController 中以编程方式滚动 pdf
- c++ - 当我使用 void 函数的返回值(通过转换函数指针)时,究竟会发生什么?
- typescript - 如何从接口中省略一个属性,而不是 TypeScript 中的类型?
- php - 使用 wp_set_object_terms 以编程方式创建和插入 wordpress 产品标签