在 ASM 代码中反转 "Taco" 使 "ocac" 而不是 "ocaT" (DOSbox)
Reversing "Taco" in ASM code makes "ocac" intead of "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
现在效果很好!
我试图让这段代码反转单词“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
现在效果很好!