-2

次のコードのアセンブリ言語命令の開発に助けが必要です。

a = 0;
i = 0;
while (i < 10) do
a = a + i;
i = i + 1;
endwhile

これを行う方法について非常に混乱しています。私が持っている本は非常に紛らわしく、これを理解するための例を示していません. どんな助けでも大歓迎です。

4

4 に答える 4

1

(執筆時点で) どのアセンブラー プラットフォームについて話しているかを指定していないため、機能を複製する 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」を正しく区別できないことが親切に指摘された後、編集されました。;)

于 2013-10-31T12:57:14.580 に答える
1

を使用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これにより、アセンブリ表現が得られます。

于 2013-10-31T13:21:28.960 に答える
1

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
于 2013-10-31T12:53:51.693 に答える
0

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
于 2013-10-31T14:18:56.523 に答える