[英]AND vs SUB when converting lowercase to uppercase assembly
我想知道為什么在將小寫 ASCII 字符轉換為大寫字符時使用and
指令而不是sub
指令。
mov dx, 'a'
sub dx, 32
比
mov dx, 'a'
and dx, 11011111b
哪一個都可以接受,這只是一個偏好問題。 我喜歡用and
我自己。 只要您首先檢查並確保您的角色位於'a'
和'z'
之間,就沒有關系。
如果您已經知道輸入是小寫字母字符,則沒有性能或正確性差異。 and
當您知道它是字母但它可能已經是大寫時具有優勢,因為它保留大寫字母未修改。 (或者作為檢測字母和歸一化為一種情況的一部分,使用and
使用~0x20
or
使用0x20
,如^= 32 背后的想法是什么,將小寫字母轉換為大寫字母,反之亦然? )
如果下一條指令是像jnz
這樣的jcc
, sub
和and
同樣能夠在 Intel Sandybridge 系列 CPU 上與它宏融合成一個uop,所以那里沒有優勢。
如果在以零結尾的 C 字符串的循環中使用它,您可能會在循環底部執行類似movzx edx, byte [rdi]
/ and edx, ~0x20
/ jnz.loop
的操作,因為所有字母字符都沒有- 除小寫位以外的零位。 ( 0x20
是 ASCII
空間)。
在這種情況下使用sub
可以讓您在任何小於空格的字符(即控制字符、制表符或換行符)上退出循環。 sub edx, 0x20
/ ja.loop
或jae.loop
甚至在空格上保持循環(但仍然不是制表符或換行符)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.