次のコードのアセンブリ言語命令の開発に助けが必要です。
a = 0;
i = 0;
while (i < 10) do
a = a + i;
i = i + 1;
endwhile
これを行う方法について非常に混乱しています。私が持っている本は非常に紛らわしく、これを理解するための例を示していません. どんな助けでも大歓迎です。
次のコードのアセンブリ言語命令の開発に助けが必要です。
a = 0;
i = 0;
while (i < 10) do
a = a + i;
i = i + 1;
endwhile
これを行う方法について非常に混乱しています。私が持っている本は非常に紛らわしく、これを理解するための例を示していません. どんな助けでも大歓迎です。
(執筆時点で) どのアセンブラー プラットフォームについて話しているかを指定していないため、機能を複製する 6502 を次に示します。
LDA #$00 ; initialise tally (a = 0)
LDX #$09 ; initialise counter (i = 9)
.LOOP STX .COUNT ; save counter for addition
CLC ; clear carry flag before addition
ADC .COUNT ; add counter to tally (a = a + i)
DEX ; decrement counter
BPL .LOOP ; keep adding until counter drops below zero
RTS ; finished, return (.A contains result)
.COUNT DS #$00 ; counter work area
質問で「1」と「i」を正しく区別できないことが親切に指摘された後、編集されました。;)
を使用gcc
して、C コードからアセンブリを生成できます。たとえば、次のように作成main.c
します。
main() {
int a = 0;
int i = 0;
while (i < 10) {
a = a + i;
i = i + 1;
}
}
次に実行します
gcc -c -S main.c
main.s
これにより、アセンブリ表現が得られます。
x86 アセンブリでは、コードを次のように変換できます (通常の目的の 16 ビット レジスタを 2 つだけ使用)。
mov ax, 0 # a = 0
mov cx, 0
.label: # a label so you can jump later
add ax, cx # add CX to AX(a = a + i)
inc cx # increase CX(i = i + 1)
cmp cx, 10 # compare CX with 10
jl .label # if CX < 10 then jump to label
CX はループに使用されます。上記のコードは、コードの 100 コピーです。10 から 1 に減らしても構わない場合、コードは次のようになります。
mov ax, 0 # a = 0
mov cx, 10
.label: # a label so you can jump later
add ax, cx # add CX to AX(a = a + i)
loop label # CX = CX - 1. If CX > 0 jump to label
GNU ツール チェーン、AT&T 構文を使用して IA-32 用に同様のコードが生成されます...
movl $0, -4(%ebp) # local variable a
movl $0, -8(%ebp) # local variable i
jmp condition
while:
# a = a + i
movl -8(%ebp), %eax # move i to %eax
addl %eax, -4(%ebp) # add %eax to a
# i = i + 1
addl $1, -8(%ebp) # add 1 to i
condition:
movl -8(%ebp), %eax # move i to %eax
cmpl $10, %eax # compare %eax with 10
jl while # jump if i < 10