Assembly 将英特尔8086汇编中的小写转换为大写。如果已在大写字母中,则不执行任何操作并继续保存

Assembly 将英特尔8086汇编中的小写转换为大写。如果已在大写字母中,则不执行任何操作并继续保存,assembly,uppercase,x86-16,Assembly,Uppercase,X86 16,);我创建了这个程序(英特尔8086汇编)来读取字符并存储和打印;将它们转换为大写后,按相反顺序排列。我知道你可以皈依上流社会;使用case(sub-AL,20h),但如何放置条件(IF)循环 要有条件地进行转换,通常需要使用两个比较: cmp al, 'a' jl not_lower cmp al 'z' jg not_lower sub al, 20h not_lower: 根据情况,还有另一种可能更可取: mov bl, al

);我创建了这个程序(英特尔8086汇编)来读取字符并存储和打印;将它们转换为大写后,按相反顺序排列。我知道你可以皈依上流社会;使用case(sub-AL,20h),但如何放置条件(IF)循环


要有条件地进行转换,通常需要使用两个比较:

    cmp al, 'a'
    jl  not_lower
    cmp al 'z'
    jg  not_lower

    sub al, 20h

not_lower:
根据情况,还有另一种可能更可取:

    mov bl, al
    sub bl, 'a'
    cmp bl, 'z'-'a'   ; 25
    ja  not_lower

    sub al, 20h

not_lower:

让您只需使用一个jmp而不是两个jmp,这有助于使其更加可预测。

如果您知道您的字节是字母(不是
0..9
或其他非字母),则可以跳过If部分

您无条件地设置或清除位5(ASCII字符:位编号7,…,位编号0),而不是使用
20h
作为ASCII中大写和小写之间的区别

通过将ASCII字符的第5位设置为1,可以得到小写字母。通过将位5设置为0,可以得到大写字母。()

获取大写字母。通过与设置了所有其他位的掩码进行ANDing,清除位5至0

and al, 0xdf   ; you may use 0dfH instead of 0xdf in your notation, or ~0x20
获取小写字母。将位5设置为1:

or al, 0x20    ; 20h

这对于检查字符是否为字母也很有用。您只需将所有字母设置为大写即可。之后,使用“cmp”检查字符是在“A”之下还是在“Z”之上。如果不是,那就是一封信。甚至更好

and   al, 0xdf      ; force uppercase (if it was a letter to start with)

sub   al, 'A'       ; letters turn into AL in [0..25]
cmp   al, 'Z'-'A'
ja   non_letter     ; unsigned compare: lower ASCII codes wrap to high values

;现在我的读写块看起来像这样;但这似乎不起作用?你知道吗?读写:;读/写回路顶部mov AH,01h;准备阅读一个字符int 21h;将字符读入AL mov bl,AL sub bl,'a'cmp bl,26 ja not_lower not_lower:sub AL,20h mov[BX],AL;将AL移动到DS处的内存中:BX添加CX,1;增量计数器加BX,1;增量偏移量cmp AL,“$”;将输入值与$jg readwrite进行比较;如果(C>0)循环;这是我对这件事的最终解决方案,但它将两者都转化为上;小写,条件不帮助读写:;读/写回路顶部mov AH,01h;准备阅读一个字符int 21h;将字符读入AL cmp AL,“a”jg不低于cmp AL,“z”jl不低于sub AL,20h不低于:;如果输入小写字母,则转换为大写字母sub al,20h mov[BX],al;将AL移动到DS处的内存中:BX添加CX,1;增量计数器加BX,1;增量偏移量cmp AL,“$”;将输入值与$jg readwrite进行比较;如果(C>0)loop@user1598734:抱歉,当代码串成这样的注释时,我无法破译代码。相关:有关无符号比较技巧的更多详细信息。另外,您可以
leaebx[rax-'a']
而不是mov/sub,但我想这是一个16位的问题。
and   al, 0xdf      ; force uppercase (if it was a letter to start with)

sub   al, 'A'       ; letters turn into AL in [0..25]
cmp   al, 'Z'-'A'
ja   non_letter     ; unsigned compare: lower ASCII codes wrap to high values