【问题标题】:Reverse case and order of a String using include 'emu8086.inc' [duplicate]使用 include 'emu8086.inc' 反转字符串的大小写和顺序 [重复]
【发布时间】:2015-11-14 02:11:10
【问题描述】:

在以下代码中,我可以反转字符串,但我不知道如何在此代码中添加函数以获得以下结果:

输入 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

【问题讨论】:

  • 搜索很快就会出现:stackoverflow.com/questions/33578121/…,它有一个答案。您可以在推送字符之前或在弹出字符之后对字符进行大小写交换。 (测试它们是否在 ascii 范围内,然后与 0x20 进行异或,因为 'a' - 'A' = 0x20。所以您只需设置或清除该位即可在大写和小写之间切换。)
  • 我删除了我之前的评论,我现在看到了相反的case 哈哈

标签: assembly x86 dos x86-16 emu8086


【解决方案1】:

我可以为您的程序推荐以下 3 个解决方案:

  • 在您的 push 循环中,您还应该推动零,因为现在您的 pop 循环将无法正确找到最终零!

      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
    

【讨论】:

  • @#$% 等其他符号呢?首先测试您要更改大小写的字符是否在字母字符的有效范围内会更谨慎?
  • @MichaelPetch 这肯定会提供更完整的解决方案。我真的专注于问题中示例的快速解决方案。
猜你喜欢
  • 1970-01-01
  • 2016-05-03
  • 2020-09-16
  • 2011-01-16
  • 1970-01-01
  • 2021-12-19
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多