文字列の長さを数えるためのカウンタを作成する際に、アセンブリコードを記述しました。アセンブリ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
文字列は '-123'ですが、コードには' 123'(マイナスなし)が使用されていることに注意してください。しかしそれは問題ではない。 –
以前の質問のうち重複したものはありますか?私はそこに私の答えをコピーし、ここでそれを削除します。 (その後、あなた自身の質問を削除することができます)。もう1つの選択肢は、前の質問を削除するか、単にこれを複製したものとしてマークすることです。 –
あなたがPeterの助言に従って、古いものを古いものの複製物として、この1つまたはこのものの複製物として閉じてもよい。他の質問へのリンクを投稿するだけです。しかし、誰かがそれに答えようと努力したことを考えれば、この質問の文章を絶対に消すことはできません。 –