2016-03-30 32 views
1

Ekleme yapmak için kullanıcılardan n numaraları kabul etmek için derleme kodu yazıyorum. Giriş ve çıkış çıkışı çekilirken neden ve yön talimatları kullanılır?Montaj giriş ve çıkışında shl ve rulo kullanımı

Kodu: bunlar gibi en düşük yarım bayt görünmesi için bu, hex
üst 4 bit leftwise birinci rulo 16 basamak olarak RgX içeriğini görüntülemek için bir fonksiyonudur

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

Neden 'rol' kullandığınız

:

burada da, bir örnek açıklayan bir ton daha söyler? Bu bir test mi? Bize kodun olduğunu söylüyorsun. 4 (cl) bitler tarafından kaydırılan –

+0

, artı ve '' 0x0F ile kaydırır, bl üst nibble değerini döndürür. Örneğin. Eğer BL = a3 ise, daha sonra bir, bu yüzden onaltılık değerin üst yarısına kadar – Tommylee2k

+0

@ Tommylee2k shl rbx görüntülemek isteyebilirsiniz, cl rol rbx, cl yerine çalışabilir mi? – daemon7osh

cevap

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 

, Daha sonra, bu tek parçacığı tutmak için 0x0f ile "maskelenir". "Asciitohex" in 0-15 ila "0" - '9', 'a' - 'f' olduğunu ve daha sonra [SI] 'da saklandığını varsayalım, bu 16 kez tekrarlanır, (ROL tüm verileri rBX'de tutar. , onları yeniden düzenlenir -. 16 basamaklı [SI] depolanır> -

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 

ve bu

üst fonksiyon tersi olan, bir hexString dönüştürür [SI 15 +] [SI] 'da BX BX registerında 64bit int sıfırlanır ve her bir rakam için akım değeri bir nibble ile SHL'lenir, sonra [SI]' daki mevcut hanesinin bin değeri buna eklenir

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 Ben bilmiyorum ...
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

Tüm şüphelerimi temizler – daemon7osh

+0

@Deadpool: cl her zaman 4 olduğunda, 'roll rbx, cl' kullanarak 'roll rbx, 4' kullanılarak tamamen braindead kullanılır. 'roll r, cl', 2 döngü gecikmesi ile Intel CPU'larda 3-uop talimatıdır, 'roll r, imm8' ise 1 döngü gecikmeli 1 uop komutudur. Imm8 formu bir bayt daha uzun, ancak 'mov cl, 4' iki byte, bu yüzden tamamen aptal. Daha okunabilir değil: 'cl' kullanarak sayımın değişebileceğini ima eder. Ayrıca, kaynak kodunda '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'maske '' '' 'nden' 'uzağa koyar. –

+0

Katılıyorum, algoritma iyi bir uygulama, uygulama "optimize edilebilir" (güler yüzlü konuşma). Örneğin. "rbx oku" işlevi bir uzunluk için kontrol etmez, her zaman 16 basamak okunur. öte yandan, "rbx yaz" her zaman 16 basamak çıkarır, 15 tane sıfır varsa bile (muhtemelen bu istenirse, emin değilim) – Tommylee2k