アセンブリで,
区切り文字で文字列を分割するにはどうすればいいですか?& T?スプリットストリングアセンブリAT&T
これは私が持っている文字列です:6、3、2431、7、9、1221
私は,
間のすべての番号に1を追加したいです。
結果は次のようになります。7, 4, 2432, 8, 10, 1222
私はubuntu14で働いている - 64、インテルのCPUやガスコンパイラ
アセンブリで,
区切り文字で文字列を分割するにはどうすればいいですか?& T?スプリットストリングアセンブリAT&T
これは私が持っている文字列です:6、3、2431、7、9、1221
私は,
間のすべての番号に1を追加したいです。
結果は次のようになります。7, 4, 2432, 8, 10, 1222
私はubuntu14で働いている - 64、インテルのCPUやガスコンパイラ
擬似コード:
; si = input string
di = output string
if 0 == [si] jmp NoNumberFound
NextNumberLoop:
rax = 0
ReadLoop:
bl = [si] & inc si
if 0 == bl jmp LastNumberFound
if ',' == bl jmp CommaFound
rax = rax*10 + (bl-'0') ; extend bl to 64b of course
jmp ReadLoop
CommaFound:
call StoreNumberPlusOne
[di]=',' & inc di
jmp NextNumberLoop
LastNumberFound:
call StoreNumberPlusOne
NoNumberFound:
[di]='0'
output resulting string and exit.
StoreNumberPlusOne:
inc rax (number+1)
print decimal formatted rax to [di] + make di point after it
ret
64bのプラットフォーム上
(ディ/ SIのポインタですもちろんrsi/rdiなど...それは文字通りではなく、アルゴリズムを示す擬似コードです。
他のオプションは、数値を解析せずに文字列自体で行うことです。
が十分に大きい割り当て文字列を結果のためにバッファ(あなたがn
回
9
として入力を入れた場合、出力バッファは
n
回
10
を含む、入力バッファとしてほぼ2倍長くなります)。
入力文字列をoutputBufferにコピーし、最後の文字にポインタptr
を置きます。
doIncrement = true
while (outputBuffer <= ptr) {
if ',' == [ptr] {
if doIncrement {
move by 1 byte further everything from ptr+1 onward:
in ASM you can do that by simple REP MOVSB, but as the
source overlap destination, make sure you use STD (DF=1)
together with end pointers.
[ptr+1] = '1'
}
doIncrement = true
} else {
; [ptr] should be between '0' to '9' (for valid input)
if doIncrement {
++[ptr]
if '9'+1 == [ptr] {
[ptr] = '0'
} else {
doIncrement = false
}
}
}
--ptr;
}
x86-64はSSE2を利用できることが保証されているので、 'pcmpeqb' /' pmovmskb'/'bsf'を使って次の'、 'の位置を探す傾向があります。文字列 - >整数(1、10、100、...のplace-valuesのベクトルを持つ 'pmaddwd')に対してもSSEを使用することができます。 SSSE3のpshufbが利用可能であれば、[IPv4のドット付きクワッド文字列を整数に変換する](http://stackoverflow.com/a/31683632/224132)のように、もっとクールなことができます。 –
これを行う最も良い方法は、カンマの文字列をスキャンし、ASCII数値を数値に変換して、必要なものを追加するコードを書くことです。あなたにこのコードを書くように頼んでいるのであれば、あなたは間違った場所にいます。 –
このカンマ区切りはソースファイル内の "文字列"ですか?ポインタとして渡されるかスタックに渡されるか?文字列要素のサイズと型?何を試しましたか? – jolati