2015-11-14 78 views
-1

在以下代码中,我能够反转字符串,但我不知道如何在此代码中添加函数以获得以下结果:使用包含'emu8086.inc'的字符串的反向大小写和顺序

输入输出AbCDeF_XYz:Zyx_fEdcBa

name "REVERSE" 

include "emu8086.inc" 

     print "Enter a string:" 
     MOV DX,11 
     CALL get_string 
     printn 
     MOV DI,0x0 

ReadString: 

     MOV AL,[ds+di] 
     CMP AL,0x0 
     JE Reverse 
     INC DI 
     PUSH AX 
     JMP ReadString 
Reverse: 

     POP AX 
     MOV AH,0xE 
     INT 0x10 
     CMP AL,0x0 
     JNE Reverse 

HLT 

DEFINE_GET_STRING 
END 
+0

请人帮忙 – BhhooHD

+2

搜索很快变成了:http://stackoverflow.com/questions/33578121/emu8086-change-case-of-the-entered-string-and-reverse-it,这有一个答案。在推动角色之前,或在弹出角色之后,您可以对角色进行大小写交换。 (测试它们是否在ascii范围内,那么xor与0x20,因为'a' - 'A'= 0x20'。所以你只需要设置或清除该位在大写与小写之间变化。) –

+0

I删除我以前的评论,我现在看到相反的'case'大声笑 –

回答

1

我能为你的程序提出这些解决方案3:

  • 在您的循环,你也应该推零,因为现在你的流行循环将无法正确找到一个终点零!

    MOV DI,0x0 
    ReadString: 
        MOV AL,[ds+di] 
        INC DI 
        PUSH AX 
        cmp al, 0 
        jne ReadString 
    Reverse: 
    
  • 您可以通过仔细查看输入字符串来解决大小写切换问题。它只有下划线字符_,这会造成问题。你必须测试它,然后绕过的情况下互换:

    MOV DI,0x0 
    ReadString: 
        MOV AL,[ds+di] 
        INC DI 
        cmp al,"_" 
        je NoSwap 
        xor al,32 ;This toggles lowercase and uppercase 
    NoSwap: 
        PUSH AX 
        cmp al, 0 
        jne ReadString 
    Reverse: 
    
  • 在当前程序中打印终止零。这几乎不是你应该做的!

    Reverse: 
        POP AX 
        cmp al,0 
        je EndOfReverse 
        MOV AH,0xE 
        INT 0x10 
        Jmp Reverse 
    EndOfReverse: 
        HLT 
    
+1

像@#$%等其他符号怎么样?测试一下你想要改变大小写的字符是否首次落在字母字符的有效范围内,不是更为谨慎吗? –

+0

@MichaelPetch这肯定会提供更完整的解决方案。我真的专注于问题中的示例的快速解决方案。 – Fifoernik

相关问题