2016-06-25 8 views
0

文字列の長さを数えるためのカウンタを作成する際に、アセンブリコードを記述しました。アセンブリAT&T - ネガティブフラグ&ループ+文字列の内容の取得

文字列は-123です。

私がいるただ一つの問題:

私の負のチェックが(/ je Negative_counter cmp %r15, %r14が)私は負の整数を持っている場合でも、バイパスされている

  .data 
S:   .string "123" 
Result:  .quad 

      .text 
      .globl main 

main: 
    mov  $S,%rdx    #Storage of string 
    mov  $S,%rbx 
    mov  Result, %rax  #Location of result storage 

    mov  $10, %r8 


    mov  $1, %r11   #-1 counter creation with 2s complement 
    not  %r11    #negation of 1 
    add  $1, %r11   #2's complement complete 

    mov  $1, %r12   #-1 counter creation with 2s complement 
    not  %r12    #negation of 1 
    add  $1, %r12   #2's complement complete, -1 established 


#R[rbx] is used here. 
Loop1:       #loop string from end to beginning 
    cmp  $0, (%rbx)   #compare base addresss value with null 
    je  Counter_Made  #if null, branch to end loop. 
    add  $1, %r11   #increment %r11 by 1 for each digit thats not null (creates counter for 2nd loop) 
    add  $1, %rbx   #Next string digit 
    jmp  Loop1    #reinitiate loop 

#Counter of string made -149, would given counter value of 3 

#R[rdx] and r14 is used here. 
Counter_Made: 
    cmp  $0,%r11    #check if %r11 is zero 
    je  Output    #End program, output null result 

    mov  $S, %r14   #move into register 14 
    sub  $7, %r14   #Shift to least significant bit 

    mov  $13, %r15 
    and  $15, %r15 


    cmp  %r15, %r14   #Determine negativity/positivity of integer, if <0 value is negative 
    je  Negative_counter 
    jmp  Positive_loop 

Positive_loop: 
    cmp  %r12,%r11   #End of loop check 
    je  Output    #Store result if loop end condition satisfied 

    mov  (%rdx), %r10  #grab first byte in address string 
    sub  $30,(%rdx)   #Conversion from 8bitASCII to 2Bit Binary 
    and  $15, %r10   #initialize size to match 

Positive_inner_loop: 
    mov  %r11, %r9 
    cmp  $0, %r9    #Compare loop length with 0 to see if it needs multiplication 
    je  InnerLoopDone  #Jump to inner loop done once length = 0 
    imul %r8, %r10   #Place holder multiplication 


InnerLoopDone: 
    add  %r10,%rax 
    sub  $1, %r11   #Decrease Length to grab next ten multiplication place holder position 
    mov  1(%rdx), %rdx   #next digit position 
    jmp  Positive_loop 



Negative_counter: 
    add  $1,%rdx 
    jmp  Negative_loop 

Negative_loop: 
    cmp  %r12,%r11 
    je  Negative_Complement 
    jmp  Negative_loop 

Negative_Complement: 
    not  %rdx    #Convert to 2's complement with negation and then + 1 
    add  %r14,%rdx 
    jmp  Output 

Output: 
    ret 
+0

文字列は '-123'ですが、コードには' 123'(マイナスなし)が使用されていることに注意してください。しかしそれは問題ではない。 –

+0

以前の質問のうち重複したものはありますか?私はそこに私の答えをコピーし、ここでそれを削除します。 (その後、あなた自身の質問を削除することができます)。もう1つの選択肢は、前の質問を削除するか、単にこれを複製したものとしてマークすることです。 –

+1

あなたがPeterの助言に従って、古いものを古いものの複製物として、この1つまたはこのものの複製物として閉じてもよい。他の質問へのリンクを投稿するだけです。しかし、誰かがそれに答えようと努力したことを考えれば、この質問の文章を絶対に消すことはできません。 –

答えて

1

私はあなたがこのコードブロックについて話していると思います。私はあまり役に立たないコメントでそれを再コメントしました。例えばmove into register 14は、mov $S, %r14命令自体からは通知できないことを教えてくれません。コメントは、アルゴリズムで何が起こっているのかを説明する必要があります。コメントを読んでいる人には、使用可能な命令リファレンスマニュアルのコピーがあると仮定します。 (まだいくつかの指示から設定されているフラグを使用するのと同じように)。

mov  $S, %r14   # r14 = pointer to the start of the string 
    sub  $7, %r14   # r14 = pointer to 7 bytes before the beginning of the string 

    mov  $13, %r15 
    and  $15, %r15   # r15 = 13 & 0xF = 13 


    cmp  %r15, %r14   # 
    je  Negative_counter # jump if (S-7) == 13 

    # jmp  Positive_loop  # this is totally redundant, you don't need a jmp to jump over the blank line before the next block of code. 

Positive_loop: 

明らかにS-7(すなわち、C構文で&S[-7])決して.dataセクションや.rodataセクションで物事のアドレスは、Linux上で0に近いものになることはありませんので、13に等しくなるように起こっていません。


あなたは簡単にあなたがCMP/JEに着くまで、ブレークポイントやシングルステップを設定し、それらのREGの内容を見ることで、デバッガでこれを見ている可能性があります。

gdbをlayout regモードにする簡単な説明については、タグwikiの下を参照してください。ここでは、シングルステップでレジスタの値が表示されます。


あなたのコードにはおそらく他にも多くの問題がありますが、長いですが、私はそれをすべて読まなかったのです。

+0

'sub $ 7、%r14'の元のコメントは「最下位ビットへのシフト」です。私は、OPがこれを何か変えたと思うのはなぜか馬鹿げている。これは、アドレスの誤解のようなものかもしれませんが、インデックス-7ではSのアドレスの最下位バイト(Sが最上位バイトを指していると仮定します)とそれが何とか最初のバイトであると仮定します。アドレスと文字列の完全な誤解のようです。 –

関連する問題