【发布时间】:2016-12-21 14:00:32
【问题描述】:
我将一个 UTF-8 字符存储在 eax 中,稍后,在处理过程中,我需要知道该字符由多少字节组成。
我已经缩小了范围,以最大限度地减少班次和蒙版,并想知道我是否在某处遗漏了一些巧妙的技巧?
选项 1:蛮力
mov r11, 4 ; Maximum bytes
bt eax, 31 ; Test 4th MSB
jc .exit
dec r11 ; Lets try 3
bt eax, 23 ; Test 3rd MSB
jc .exit
dec r11 ; Lets try 2
bt eax, 15 ; Test 2nd MSB
jc .exit
dec r11 ; It's straight up ascii (1 byte)
.exit:
注意:
- 正如大家指出的那样,我在
eax寄存器中的累积错误。 - Margaret 和 Ped7g 都提供了解决方案,我学到的东西比预期的还要多。
【问题讨论】:
-
AFAIK 你应该从另一个方向检查,但不清楚你的角色是如何开始的。
-
@Jester 在读取 UTF-8(或 ascii)时,我会按字符顺序移动,因此如果是 UTF-8,则控制字节(例如 0x11 ......)位于较高的位置位置后跟延续(例如 0x10 ......)。如果我明白你的意思,那么首先检查 ascii 或成本最低的 UTF-8 的低阶会更有效?
-
等等,那么
eax中的内容是什么,你能举一些例子吗?我确实期望ÉÉ出现类似0x89c389c3的内容(一个字符É以下一个字符开头,恰好也是É并适合eax的剩余两个字节)。在这种情况下,您的代码会读取什么? (文本有字节c3 89 c3 89)如果您要为每个长度提供示例,最好验证有关这些的任何建议。 (加上你在备用寄存器上有多紧) -
@Ped7g - 我在角色级别,你有两个(例如
É,然后是第二个É)。所以对于一 (1) 个字符:rax = 0x000000000000c3a1 -
是您的
c3a1(á) 错字,还是我仍然想念您的价值转换是如何工作的?如果您要按字符进行,则已经解析了该字符。顺便说一句,为什么有些东西没有提供长度?然后你“解析”它两次。如果您不介意,那么您为什么不介意第二次解析的性能,因为您不介意性能?我对此有点困惑。
标签: assembly utf-8 nasm x86-64 micro-optimization