2016-03-30 5 views
1

追加を実行するためにn個の数値を受け入れるアセンブリコードを記述しています。 入力と出力を表示するときにshlとrol命令が使用されるのはなぜですか?アセンブリ入力と出力でのshlとrolの使用

コード:

takeno: 
print msg2,len2 ;calls a macro to display "Enter number" 
accept var2,17 ;accepts number in var2 
xor rbx,rbx 
mov rsi,var2  ;how rsi works as array or array pointer? 
mov ch,16 
mov cl,4 

up: 
shl rbx,cl  ;Why this step ? 
mov al,[rsi] 
call asciitohex ;convers ascii input to hex 
add bl,al 
inc rsi 
dec ch 
jnz up 

add [var3],rbx 
dec byte[var1] 
jnz takeno 

xor rbx,rbx 
mov rbx,[var3] 
mov rsi,var2 
mov ch,16 
mov cl,4 

display: 
rol rbx,cl   ;why rol? 
mov al,bl 
and al,0f   ;what this line does? 
call asciitohex 
mov [rsi],al 
inc rsi 
dec ch 
jnz display 
+2

あなたは 'rol'を使用しているなぜ私は...知らないのですか?これはテストですか?それがあなたのコードだと私たちに伝えています。 –

+0

4(in cl)ビットシフトし、0x0Fで 'anding'をシフトすると、blの上位ニブルが返されます。例えばBL = a3の場合は後でそれを表示するので、表示する16進値の上半分に16進数で変換することができます – Tommylee2k

+0

@ Tommylee2k shl rbx、clはrolの代わりに使えますrbx、cl? – daemon7osh

答えて

2
display: 
rol rbx,cl   ;why rol? 
mov al,bl 
and al,0f   ;what this line does? 
call asciitohex 
mov [rsi],al 
inc rsi 
dec ch 
jnz display 

これは、彼らが最も低いニブルとして表示されるように、六角形の16桁
上位4ビットはleftwise最初ロールとしてRBXの内容を表示する機能でありますその後、0x0fで "マスク"され、ちょうどこの1つのニブルを維持します。私は "asciitohex"が0〜15を0〜9とし、それを[SI] に格納して16回繰り返すと仮定します(ROLはすべてのデータをrBXに保持します) [SI + 15]

ROL sample: ROL rBX 
RBX before ROL  AEFD12349876CCDE 
    after ROL,4  EFD12349876CCDEA (a gets last nibble) 
      and 0x0f 000000000000000A --> first Digit 
    after ROL,4  FD12349876CCDEAE (a gets last nibble) 
      and 0x0f 000000000000000E --> second Digit 
    after ROL,4  D12349876CCDEAEF (a gets last nibble) 
      and 0x0f 000000000000000F --> 3rd Digit 

など

に上部機能がラウンド他の方法であり、それはhexStringを変換 - >全16桁[SI]に格納されている - 。、ちょうどそれらを並べ替えますレジスタBX BXの64ビット整数への[SI]の値はゼロにされ、各桁について現在の値は1ニブルでSHLされ、[SI]の現在の桁のビン値がそれに加算される。

xor rbx,rbx 
mov rsi,var2  ;how rsi works as array or array pointer? 
mov ch,16 
mov cl,4 

up: 
shl rbx,cl  ;Why this step ? 
mov al,[rsi] 
call asciitohex ;convers ascii input to hex 
add bl,al 
inc rsi 
dec ch 
jnz up 
012ここにも

、一例は、説明のトン以上のものを伝えます:

SI content "ac12...." 
rBX=0000000000000000 
        SHL rBX,4 0000000000000000 
"a" is added (after convert) 000000000000000a 
        SHL rBX,4 00000000000000a0 
"c" is added (after convert) 00000000000000ac 
        SHL rBX,4 0000000000000ac0 
"1" is added (after convert) 0000000000000ac1 
        SHL rBX,4 000000000000ac10 
"2" is added (after convert) 000000000000ac12 
... 
16 times for completely fill rBX 
+0

それは私の疑問をすべて解決します – daemon7osh

+0

@Deadpool: 'rol rbx、cl'は' cl rbx、4'と比べてclが常に4のときに完全に頭脳を吹きます。 'rol r、cl'はインテルCPU上の3-uop命令で、2サイクルのレイテンシを持ち、 'rol r、imm8'は1サイクルのレイテンシを持つ1 uop命令です。 imm8形式は1バイト長くなっていますが、 'mov cl、4'は2バイトですので、まったくダムです。それはさらに読みにくいです: 'cl'を使うことは、数が変わる可能性があることを意味します。また、 '4 'をソースコードの' 0x0f'マスクから遠ざけます。 –

+0

私は同意する、アルゴリズムは良い、実装 "最適化することができます"(フレンドリーな話し)です。例えば"read rbx"関数は長さをチェックしません。常に16桁です。一方、 "write rbx"は、後ろに15個のゼロがあっても、常に16桁の数字を出力します(おそらく、それはわかりません) – Tommylee2k