【问题标题】:In x8086 Assembly Language, how do I check if a char is an uppercase letter?在 x8086 汇编语言中,如何检查 char 是否为大写字母?
【发布时间】:2016-02-26 18:45:13
【问题描述】:

我目前正在编写一个程序,它接收密码并根据某些标准检查强度,我无法确定我的逻辑是否适合检查大写字母。

    mov cx, count
    mov bx, OFFSET pw

    upper_loop:

        mov ax, [bx]
        cmp dx, count
        je  upper_msg ; prompt user that no uppercase letter was entered
        sub ax, 'A'
        cmp ax, 'Z' - 'A'
        jle lower_check
        inc bx
        inc dx

        jmp upper_loop

【问题讨论】:

  • 是的,看起来是正确的,除了你处理的是 16 位而不是 8 位。我不认为你在这里处理 unicode?所以在任何地方都将ax 更改为al
  • 哪个字符集和编码? ('A' - 'Z' 不太可能是您的程序从中获取输入的字符集中唯一的大写字母。这就是为什么有 isupper() 的库。)(如果您只想考虑 'A'-' Z',让你的用户 [以及你的代码维护者] 休息一下,告诉他们。)
  • 应该是 8086 或 x86 而不是 x8086,其中 x 是通配符,因此 x86 表示 8086、80186、80286、80386、80486、80586、80686 甚至 8088。这些也是统称为 IA-32 处理器。 [现在,X64 完全不同了:一个在扩展 64 位架构上包含 x86 指令的处理器。我想这就是您透明地运行 x86 程序的原因。]

标签: assembly x86 masm uppercase


【解决方案1】:

您的程序不正确,当密码包含例如“@”(0x40)而不是大写字母时,它可能会给出误报。从 '@' 中减去 'A' 得到 -1 (0xFF),它低于 'Z'-'A' (0x19),因此尽管实际上没有遇到大写字母,但仍跳转到 lower_check .我的建议是避免将字符作为有符号数字进行比较:

  mov cx, count
  mov si, OFFSET pw
  cld
upper_loop:
  lodsb
  cmp al,'A'
  jb not_u
  cmp al,'Z'
  jbe lower_check ; Break if at least one uppercase letter is present.
not_u:loop upper_loop
upper_msg ; prompt user that no uppercase letter was entered

【讨论】:

    【解决方案2】:
    • 我没有看到您在运行循环之前清除了 DX。
    • 您需要从字符串中检索字节,因为您清楚地在每次迭代中将其指针提高了 1。
    • 您必须以无符号方式解释比较结果,否则从 0 到 64 的所有 ASCII 将被视为大写字母!

    坚持你的例子,结果如下:

        xor dx, dx
        mov cx, count
        mov bx, OFFSET pw
    upper_loop:
        mov al, [bx]
        cmp dx, count
        je  upper_msg ; prompt user that no uppercase letter was entered
        sub al, 'A'
        cmp al, 'Z' - 'A'
        jbe lower_check
        inc bx
        inc dx
        jmp upper_loop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 2012-03-07
      相关资源
      最近更新 更多