Assembly 将英特尔8086汇编中的小写转换为大写。如果已在大写字母中,则不执行任何操作并继续保存
);我创建了这个程序(英特尔8086汇编)来读取字符并存储和打印;将它们转换为大写后,按相反顺序排列。我知道你可以皈依上流社会;使用case(sub-AL,20h),但如何放置条件(IF)循环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
要有条件地进行转换,通常需要使用两个比较:
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