-2

在为以下代码开发汇编语言指令时需要帮助。

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

我对如何做到这一点感到非常困惑。我所拥有的这本书非常令人困惑,并且没有显示任何类型的示例来解决这个问题。任何帮助,将不胜感激。

4

4 回答 4

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 汇编中,您的代码可以翻译成这样(仅使用 2 个常规用途的 16 位寄存器):

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 回答
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 回答
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 回答