Hatena::ブログ(Diary)

hogeなlog

プロフィール

hogelog

hogelog

小室 直(こむろ すなお)。電気通信大学2003年入学。2010年修士卒業。プログラミングとかしてます。

カレンダー
1984 | 01 |
2006 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 |
2010 | 01 | 06 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 12 |
2012 | 01 | 04 | 06 |

July 31(Mon), 2006 アセンブラめも(2)

[][][] gccのアセンブリ出力を読んでみよう。 20:17

% cat main.c
int main(){exit(0);}
% gcc main.c -S -Os
% cat -n main.s 
     1:         #.file  1 "main.c"
     2:         .set    nobopt
     3:         .option pic2
     4:         .section .text,0x1,0x6,4,4
     5:         .text
     6:         .align  2
     7:         .globl  main
     8:         .ent    main
     9: main:
    10: .LFB3:
    11:         .frame  $sp,32,$31              # vars= 0, regs= 2/0, args= 0, extra= 16
    12:         .mask   0x90000000,-8
    13:         .fmask  0x00000000,0
    14:         subu    $sp,$sp,32
    15: .LCFI0:
    16:         sd      $31,24($sp)
    17: .LCFI1:
    18:         sd      $28,16($sp)
    19: .LCFI2:
    20:         .set    noat
    21:         lui     $1,%hi(%neg(%gp_rel(main)))
    22:         addiu   $1,$1,%lo(%neg(%gp_rel(main)))
    23:         daddu   $gp,$1,$25
    24:         .set    at
    25:         move    $4,$0
    26:         la      $25,exit
    27:         jal     $31,$25
    28: .LFE3:
    29:         .end    main

腐った俺にわかるのは、14行目でsubu $sp,$sp,32として32バイト分スタックフレームを確保しているということくらいです。.frame $sp,32,$31 # vars= 0, regs= 2/0, args= 0, extra= 16というのは何か大きなヒントのような気がするんですけど、たいして調べる気もありません。

トラックバック - http://d.hatena.ne.jp/hogelog/20060731

July 29(Sat), 2006 アセンブラめも(1)

[][][] 書こうとする度に、以前学んだことを忘れていることに気付く 19:54

  • gccの手続き呼び出し規約ではスタックフレームは6語(24バイト)以上確保することになっている。
  • スタックフレームは4語(16バイト)単位で確保するって聞いた。大学の講義で。

じゃあスタックフレームは最小でも32バイト確保しないといけないのかもしれない。

めんどくさいから確かめないけど、main関数でスタックフレームをケチって4バイトとかにしたらcore吐いて死んだりした記憶がある。

  • MIPS32の命令はきっと全部32bitの固定長。

全部適当なうろ覚え。よくわからん。

えーとレジスタは32bitだから、4バイトで1語。

なんか漠然とwebで資料探したくなったときにはgoogle:mips アセンブラ (講義資料|site:ac.jp)とかすると有意なデータが多い気がする。と思ったが、あらためてgoogle:mips アセンブラで検索してみたらそうでもない気がした。この日記はそのS/N比を下げる存在だと思うけど別にいいや。

階乗関数を書いてみた。ここからはどこの関数も呼び出さない末端の関数なので、スタックフレームを確保せず、一時変数をくるくるループさせてみた。普通に動いた。

    .text		# 以下は命令列ですよ
    .globl      fact	# factラベルはグローバル(外部から参照できる)
    .ent        fact	# こっからfactルーチンですよと明記。書かなくてもいい(と思う)。enterの略かな
fact:
    move    $8, $4	# $4(第一引数)の内容を$8(一時変数)に

    addu    $9, $0, 1	# $0(常に値0を持つレジスタ)+1を$9(一時変数)に代入。ようするに$9=1
factloop:
    beq     $8, $0, factdone	# $8=$0ならばfactdoneラベルの位置へ

    mul     $9, $9, $8	# $9*$8を$9に代入
    subu    $8, $8, 1	# $8-1を$9に代入
    b       factloop	# 無条件でfactloopラベルに行く(branchの略)

factdone:
    move    $2, $9	# $9の内容を$2(返り値)に

    j       $31		# $31(戻り先アドレス)に移動(jump)
    .end        fact	# ここでfactルーチン終了と明記。.entと対(だと思う)

[][][] 再帰関数を書いてみよう 19:54

    .text
    .globl      fact
    .ent        fact
fact:
    subu    $sp, 32	# $sp(スタックポインタ)-32を$spに代入。スタックフレームを32バイト確保ってこと
    sw      $31, 28($sp) # $31(戻り先アドレス)を$sp+28が示すメモリ(確保したスタックフレームの一個目)に退避。store word
    
    move    $8, $4

    bne     $8, $0, callrec # $8と$0の内容が違ったら(not equal)callrecに飛ぶ(branch)
    addu    $2, $0, 1	# $2(戻り値)に1を代入

    addu    $sp, 32	# $sp+32を$spに代入。スタックフレーム32バイトを開放
    j       $31		# $31(戻り先アドレス)にjump

callrec:
    subu    $4, $8, 1	# $8-1を$4に代入
    sw      $8, 24($sp)	# $8を$sp+24(スタックフレームの二個目)に退避
    jal     fact	# (たぶん)$31にこれの次の命令のアドレスを入れて、factに飛ぶ
    lw      $8, 24($sp)	# $8に$sp+24(スタックフレームの二個目)の値を戻す。load word
    mul     $2, $2, $8	# $2(戻り値)に$2(factが返してきた戻り値)*8を代入

    lw      $31, 28($sp) # $31に$sp+28が示すメモリ(確保したスタックフレームの一個目)の値を復帰
    addu    $sp, 32	# $sp=$sp+32。スタックフレームの開放
    j       $31		# $31にjump
    .end        fact

とりあえず動いた。要求が簡単だからこっちの方が長くなる。Cなら

int fact(int x){
   if(x == 0) return 1;
   return x*fact(x - 1);
}

で済むのにね。これってfact(0)したらひどいことになるね。

書き直した。

なんとなく適当なコメントをつけてみた。

トラックバック - http://d.hatena.ne.jp/hogelog/20060729

July 28(Fri), 2006

[] ブログという言葉 09:38

今まで、「ブログ」という言葉はかたくなに拒んできた。猫も杓子もブログブログの中、WEB日記とかそんな言葉を使い続け。それでもはてなは、はてなダイアリーだけは、そう信じていた。

ロゴに「はてなのブログ」って書いてあった。

ちょっとショック。もう諦めて俺もブログブログ言おうかと思った。

[] ロシア語 21:44

ボルシチかピロシキあたりが、ロシア語でなんか失礼な意味の隠語になるんだったと思う。たしかマトリョーシカじゃあない。だから日本人に「フジヤマ! ニンジャ、ニンジャ! カラーテ! スシ!」とか言う感じでロシアの人に「ボルシチ! ピロシキ! モスクワ!」とか言ったら失礼になるかもしれないから気をつけよう。言わねえけど。

発音が全然違った気がするけど。たしかボルシチは「ぼるしー」、モスクワは「ますくばー」みたいな発音だったような。

京都という街

俺の京都観というものは、いつだか読んだ、誰が書いたんだかもよく知らない以下のテキストを鵜呑みにしてできている

http://nicosia.is.s.u-tokyo.ac.jp/pub/essay/hagiya/h/kyoto

トラックバック - http://d.hatena.ne.jp/hogelog/20060728

July 27(Thu), 2006 sshメモ(1)

[][][] .ssh/config 23:11

Compression yes
ForwardX11 yes
ForwardX11Trusted yes
Ciphers arcfour, blowfish-cbc, aes128-cbc, 3des-cbc

Host unko
Hostname unko.host.ne.jp
User unkouser
ForwardAgent yes

Compressionでデータのgzip圧縮on。ForwardX11でX転送許可。Ciphersの設定で暗号アルゴリズムの優先度をarcfour>>blowfish-cbc>>aes128-cbc>>3des-cbcに。ここまでは全体の設定。

追記

リモートのemacsをローカルのXに繋いでアレコレしようとしたら、X protocol error: BadAtom (invalid Atom parameter) on protocol request 20とか言われてfuck damn。ForwardX11Trusted yesを付けてフルアクセスを許すと、エラーを出さなくなった。ちなみにVine Linux 3.2のOpenSSH 3.9p1。VMware 4.5.3上でVMware-Toolsを走らせていることは関係あるだろうか。

host unko以下はunkoホストの設定。ssh unkoで、ssh unkouser@unko.host.ne.jpと同等。

opensslで各暗号化の速度を計測してみる。環境はAthlon XP(1800+)でメモリは128M、ただしVMware内のVine Linux。

% openssl speed rc4 blowfish aes-128-cbc des-ede3
(略)
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
rc4              72035.85k    80926.03k    80402.25k    83678.21k    82844.37k
des ede3          8307.02k     8296.81k     8639.23k     8570.20k     8486.91k
blowfish cbc     45308.17k    50091.69k    51774.38k    52825.09k    53116.93k
aes-128 cbc      31520.70k    33533.63k    33502.55k    33518.93k    33350.79k

しばらく前にblowfishはえーと聞いてからblowfish使ってたが、arcfour(rc4)の方が速かった。

3des(des-ede3)は評判通りしっかり遅い。

トラックバック - http://d.hatena.ne.jp/hogelog/20060727
最近のコメント