如何解决在 ASM 代码中反转“Taco”使“ocac”而不是“ocaT”DOSbox
我试图让这段代码反转“Taco”这个词,但我不明白为什么结果中的最后一个字母总是出错。 (它不断输出“ocac”) 我还希望用户写“Taco”作为输入,这就是我在开始时使用 INT 21H 的原因。
我尝试使用不同的值,例如 [SI+3]、[SI+2],只是为了了解发生了什么,但我无法弄清楚。
是否可以使用 LEA 来完成这项工作?
.model small
.stack 32
.data
VALUE DB 51 DUP('$')
RE LABEL BYTE
MAXLEN DB 50
ACTLEN DB ?
ARR DB 51 DUP('$')
.code
MAIN proc FAR
;Load Data;
MOV AX,@data
MOV DS,AX
;Get input
MOV AH,0AH
LEA DX,RE
INT 21H
;Load Pointers to arrays
LEA SI,ARR
LEA BX,VALUE
;Setup CX register for loop.
MOV CX,0
MOV CL,ACTLEN
AGAIN:
MOV AX,[SI+4] ;+4 because "Taco" has 4 letters.
MOV [BX],AX ;Moving character to resulting array
INC BX ;Move new array to next index
SUB SI,1 ;Move original array to prevIoUs index.
LOOP AGAIN
;Clearing last line
MOV AX,0601H
MOV BH,70H
INT 10H
;Printing resulting array on screen
LEA DX,VALUE
MOV AH,09H
INT 21H
;Termination
MOV AX,4C00H
INT 21H
MAIN endp
END MAIN
谁决定花时间回答这个问题,我非常感谢!
解决方法
正如 Peter Cordes 所提到的,AX 处理的是 2 个字节。我把它切换到 AL,这样它只处理 1 个字节,最后得到“ocaT”
我还将 [SI+4] 更改为 [SI+3],以便它正确指向输入数组的最后一个字符,而不是之后。
AGAIN:
MOV AL,[SI+3] ;changed
MOV [BX],AL ;changed
INC BX
SUB SI,1
LOOP AGAIN
现在效果很好!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。