【发布时间】:2017-12-08 01:30:47
【问题描述】:
我正在尝试制作一个用户必须输入字符串并获得反向输出的程序。此外,它应该将所有小写字母变为大写,将大写变为小写。我已经完成了可以输入 1 个字符的程序。我的下一个目标是获得尽可能多的角色。
我做了一些研究并想出了这个代码:
org 100h
include emu8086.inc
.DATA
STR1 DB 0DH,0AH, 'Input: $'
STR2 DB 0DH,0AH, 'Output: $'
nl db 0dh,0ah,'$'
.CODE
START:
MOV AX, @DATA
MOV DS, AX
cmp al, 0x41h
JGE IsInLowerCaseRange
Disp:
LEA DX,STR1
MOV AH,09H
INT 21H
MOV CL,00
MOV AH,01H
Read:
INT 21H
MOV BL,AL
PUSH BX
inc cx
CMP AL,0DH
JZ DISPLAY
JMP READ
Display:
LEA DX,STR2
MOV AH,09H
INT 21H
lea dx, nl
mov ah,09h
int 21h
ANS:
MOV AH,02H
POP BX
MOV DL,BL
INT 21H
LOOP ANS
IsInLowerCaseRange:
cmp al, 0x5Ah
jle DisplayLowerCaseLetter
cmp al, 0x61h
jge IsInUpperCaseRange
jmp NotALetter
DisplayLowerCaseLetter:
add al, 0x20h
mov ah, 0xEh
int 10h
jmp exit
IsInUpperCaseRange:
cmp al, 0x7Ah
jle DisplayUpperCaseLetter
jmp NotALetter
DisplayUpperCaseLetter:
sub al, 0x20h
mov ah, 0xEh
int 10h
jmp exit
NotALetter:
printn
print "The input character is not a letter."
exit:
hlt
.EXIT
END START
现在我得到一个错误的输出。例如,如果您输入Hello,它将返回olleHh。我完全困惑,因为我无法弄清楚我的错误。另外,我是大会的新手。我期望的输出是OLLEh。
工作代码:
org 100h
include emu8086.inc
.DATA
STR1 DB 0DH, 0AH, 'Input: $'
STR2 DB 0DH, 0AH, 'Output: $'
Nl DB 0Dh, 0Ah,'$'
.CODE
START:
MOV AX, @DATA
MOV DS, AX
DISP:
LEA DX,STR1
MOV AH,09H
INT 21H
MOV CL,00
MOV AH,01H
READ:
INT 21H
MOV BL, AL
PUSH BX
INC CX
CMP AL, 0DH
JZ DISPLAY
CMP AL, 'A' ; < then A
JB NotALetter
CMP AL, 'Z' ; > then Z
JA AGAIN ; repeat again
JMP CONTINUE1
AGAIN:
CMP AL, 'a' ; < then a
JB NotALetter
CMP AL, 'z' ; > then z
JA NotALetter
CONTINUE1:
JMP READ
DISPLAY:
LEA DX, STR2
MOV AH, 09h
INT 21H
LEA DX, NL
MOV AH, 09h
INT 21h
POP BX ; pop enter key
ANS:
MOV AH, 02h
POP BX ; pop the character
CMP BL, 'a' ; check if its in upper case
JB toLower ; if yes then jmp to toLower
SUB BL, 32 ; if not in upper case then convert to upper case
JMP CONTINUE2
toLower:
ADD BL, 32 ; convert to lower case
; Probably have to subtract 32 if BL = 20h
CONTINUE2:
MOV DL, BL
INT 21H
LOOP ANS
JMP EXIT ; if everything is fine jmp to exit
NotALetter:
printn
print "The input character is not a letter."
EXIT:
hlt
.EXIT
END START
【问题讨论】:
-
使用您的模拟器单步执行代码。错误应该很明显。提示:
ANS循环中发生了什么? PS:注释你的代码,特别是如果你想让别人理解它(它也可以帮助你发现你自己的错误)。 -
@Jester 非常感谢。会听从你的建议!
-
相关:case flip an ASCII string (skipping non-alphabetic characters)。在反向循环中使用该逻辑。
-
在很
START:你有废话cmp al, 0x41hJGE IsInLowerCaseRange没有任何评论,它应该做什么。它表明您根本不了解源代码中的内容,而且如果没有您的 cmets(显示您的人类意图),就不可能看到您为什么不理解它,以及您的实际错误是什么。你刚刚忘记加载al了吗?你相信mov ax,@DATA是魔法,它会为你的al加载字符值吗?等等... 使用 emu8086 内置调试器缓慢地跳过单个指令,并推理它们中的每一个,它为什么存在以及它的作用。 -
仅仅运行您的代码并在屏幕上接收正确的输出肯定不足以验证您的代码。即使代码包含基本问题,并且几乎每次其他输入更改都会中断,您也可以通过纯粹的运气和意外多次获得正确的输出。仔细调试添加到代码中的每条指令并对其进行推理,是正确验证汇编代码的唯一方法。
标签: assembly reverse uppercase lowercase emu8086