汇编语言说明

时间:2013-10-31 12:51:33

标签: assembly

需要帮助开发以下代码段的汇编语言指令。

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

我对如何做到这一点非常困惑。我所拥有的这本书非常令人困惑,并没有展示任何有关这方面的例子。任何帮助,将不胜感激。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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'之后进行了编辑。 ;)

答案 2 :(得分: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提供汇编表示。

答案 3 :(得分:0)

使用GNU工具链,AT&amp; 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