簡體   English   中英

將小寫字母轉換為大寫字母時的 AND vs SUB

[英]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這樣的jccsuband同樣能夠在 Intel Sandybridge 系列 CPU 上與它宏融合成一個uop,所以那里沒有優勢。

如果在以零結尾的 C 字符串的循環中使用它,您可能會在循環底部執行類似movzx edx, byte [rdi] / and edx, ~0x20 / jnz.loop的操作,因為所有字母字符都沒有- 除小寫位以外的零位。 ( 0x20是 ASCII 空間)。

在這種情況下使用sub可以讓您在任何小於空格的字符(即控制字符、制表符或換行符)上退出循環。 sub edx, 0x20 / ja.loopjae.loop甚至在空格上保持循環(但仍然不是制表符或換行符)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM