私は、符号なしlongをとるアセンブリで関数を書いています。 このlongはUTF-8文字です。アセンブリAT&Tのx86 - どのように特定のバイトを比較するには?
1,2,3,4バイトのUTF-8文字かどうかをチェックしたいと思います。これまでのところ私はこれを持っている:(私はコードに変更されましたエンディアンの影響を受けることがないように、私が思うに...)
movl 12(%ebp),%eax # Move long u to %eax
movl %eax,buff # Move long u to buff
andl $128,buff # &-mask 1 MSB (from LSByte)
cmpl $0,buff # Compare buff to 0
je wu8_1byte # If 0, 1 byte UTF8
movl 12(%ebp),%eax # Move long u to %eax
movl %eax,buff # Move long u to buff
andl $0xE000,buff # &-mask 3 MSB (from byte LSByte 2)
cmpl $0xC000,buff # Compare the 3 MSB to binary 110
je wu8_2byte # If =, 2 byte UTF8
movl 12(%ebp),%eax # Move long u to %eax
movl %eax,buff # Move long u to buff
andl $0xF00000,buff # &-mask 4 MSB (from byte MSByte 3)
cmpl $0xE00000,buff # Compare the 4 MSB to binary 1110
je wu8_3byte # If =, 3 byte UTF8
jmp wu8_4byte # If no, 4 byte UTF8
12(%のEBP)で長い私が仕事をしたいです。 Buffは4バイトの変数です。
これは1バイトで動作しますが、他の動作では動作しません。
どのようなタイプのUTF-8 charがあるかを知るためのヒントを教えてください。
UTF-8エンコーディング:
0xxxxxxx # 1 byte
110xxxxx 10xxxxxx # 2 byte
1110xxxx 10xxxxxx 10xxxxxx # 3 byte
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx # 4 byte
「このロングはUTF-8文字です」と言うと、間違いなくビッグエンディアン形式でエンコードされていますか? Intelではこれが珍しいからです。 –
私はそれがどのようなエンディアンであるかを確認しています。私はgcc -m32を使ってそれをコンパイルしています。そして、私はCプログラムでassemby関数をテストします。 –
先頭のバイトの部分をテストするために13ビットをシフトしているという事実は、ビッグエンディアンの順序で格納されたUTF-8バイトシーケンスを持っていると思っていることを私に伝えます。あなたのシステムのアーキテクチャはリトルエンディアンです。それが私にとって奇妙に見える理由です。 –