首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ASM代码中的"Taco“转换成"ocaT”(DOSbox)的"ocac“整数

将ASM代码中的"Taco“转换成"ocaT”(DOSbox)的"ocac“整数
EN

Stack Overflow用户
提问于 2021-05-01 04:08:56
回答 1查看 42关注 0票数 0

我试图使这个代码反转"Taco“这个词,但我不明白为什么它总是在结果中把最后一个字母弄错了。(它一直输出"ocac")我还希望用户将"Taco“作为输入,这就是我在开头使用int21H的原因。

我尝试使用不同的值,如SI+3、SI+2,只是为了了解发生了什么,但我无法理解。

使用LEA可以完成这项工作吗?

代码语言:javascript
复制
.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

无论谁决定花时间回答这个问题,我都非常感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-01 06:15:14

正如Peter Cordes所提到的,AX处理的是两个字节。我把它切换到AL,使它只处理一个字节,最后得到"ocaT“。

我还将SI+4更改为SI+3,以便它正确地指向输入数组的最后一个字符,而不是后面。

代码语言:javascript
复制
AGAIN:
MOV AL, [SI+3]  ;changed
MOV [BX], AL    ;changed
INC BX          
SUB SI, 1       
LOOP AGAIN

现在工作得很好!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67342790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档