2016-06-20 3 views
-2

アセンブリで,区切り文字で文字列を分割するにはどうすればいいですか?& T?スプリットストリングアセンブリAT&T

これは私が持っている文字列です:6、3、2431、7、9、1221

私は,間のすべての番号に1を追加したいです。

結果は次のようになります。7, 4, 2432, 8, 10, 1222

私はubuntu14で働いている - 64、インテルのCPUやガスコンパイラ

+2

これを行う最も良い方法は、カンマの文字列をスキャンし、ASCII数値を数値に変換して、必要なものを追加するコードを書くことです。あなたにこのコードを書くように頼んでいるのであれば、あなたは間違った場所にいます。 –

+1

このカンマ区切りはソースファイル内の "文字列"ですか?ポインタとして渡されるかスタックに渡されるか?文字列要素のサイズと型?何を試しましたか? – jolati

答えて

1

擬似コード:

; 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など...それは文字通りではなく、アルゴリズムを示す擬似コードです。


他のオプションは、数値を解析せずに文字列自体で行うことです。

が十分に大きい割り当て文字列を結果のためにバッファ(あなたが n9として入力を入れた場合、出力バッファは n10を含む、入力バッファとしてほぼ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; 
} 
+1

x86-64はSSE2を利用できることが保証されているので、 'pcmpeqb' /' pmovmskb'/'bsf'を使って次の'、 'の位置を探す傾向があります。文字列 - >整数(1、10、100、...のplace-valuesのベクトルを持つ 'pmaddwd')に対してもSSEを使用することができます。 SSSE3のpshufbが利用可能であれば、[IPv4のドット付きクワッド文字列を整数に変換する](http://stackoverflow.com/a/31683632/224132)のように、もっとクールなことができます。 –

関連する問題