文字列の反転
Posted feedbacks - Other
Mac OS X (PowerPC) アセンブリで。引数の文字列を破壊的に反転します。 コードを reverse_string.s として保存し、アセンブル後に任意のオブジェクトファイルとリンクしてください。
% as -o reverse_string.o reverse_string.s
Cのソース内では次のように宣言しといてください。
char *reverse_string(char *);
see: 玄箱でアセンブリ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | .machine ppc
.globl _reverse_string
_reverse_string:
;; r3: 引数 char *
mr r6, r3
;; 文字列の終端をスタックに積んでおく(ループ終了用)
li r0, 0
subi r1, r1, 1
stb r0, 0(r1)
_push_char:
;; 一文字ずつレジスタに置いていく
lbz r0, 0(r6)
addi r6, r6, 1
;; 文字をスタックへ追加する
;; Shift-JISの判断
;; 0x80 <= c <= 0x9F or 0xE0 <= c <= 0xFF
cmpli cr7, r0, 0xE0
bge cr7, _push_2b_char
cmpli cr7, r0, 0x80
blt cr7, _push_1b_char
cmpli cr7, r0, 0x9F
ble cr7, _push_2b_char
_push_1b_char:
;; 1バイト文字をスタックに追加
subi r1, r1, 1
stb r0, 0(r1)
b _term
_push_2b_char:
;; 2バイト文字を2, 1バイト目の順にスタックに追加
lbz r2, 0(r6) ; 2バイト目を取り出す
addi r6, r6, 1
subi r1, r1, 1 ; 2バイト目を追加
stb r2, 0(r1)
subi r1, r1, 1 ; 1バイト目を追加
stb r0, 0(r1)
_term:
;; 文字が終端かどうか判別
cmpli cr7, r0, 0
bne cr7, _push_char
addi r1, r1, 1 ; 最後に追加された文字列の終端を捨てる
mr r6, r3 ; 再度 r6 に作業用ポインタをコピー
_overwrite:
;; スタックの最後から一文字ずつ取り出す
lbz r0, 0(r1)
addi r1, r1, 1
;; 元の文字列に上書き
stb r0, 0(r6)
addi r6, r6, 1
cmpli cr7, r0, 0
bne cr7, _overwrite
;; 関数から戻る
blr
|


にしお
#3414()
Rating0/2=0.00
サンプル入出力
>>> print reverse_string("Hello") olleH >>> print reverse_string("こんにちは") はちにんこ >>> print reverse_string("濁点(だくてん)") )んてくだ(点濁[ reply ]