Assembly 汇编语言指令

Assembly 汇编语言指令,assembly,Assembly,需要帮助为以下代码段开发汇编语言指令 a = 0; i = 0; while (i < 10) do a = a + i; i = i + 1; endwhile a=0; i=0; 而(我

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

a = 0;
i = 0;
while (i < 10) do
a = a + i;
i = i + 1;
endwhile
a=0;
i=0;
而(我<10)是这样做的
a=a+i;
i=i+1;
循环结束

我很困惑如何做到这一点。我所拥有的这本书非常令人困惑,没有任何类型的例子来解释这一点。任何帮助都将不胜感激

在x86汇编中,您的代码可以转换为以下内容(仅使用2个常规用途的16位寄存器):

由于您(在撰写本文时)尚未指定所讨论的汇编器平台,因此这里有一些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”和“我”之后,编辑人员亲切地指出了这一点

您可以使用
gcc
从C代码生成程序集。例如,使用以下命令创建
main.c

main() {
    int a = 0;
    int i = 0;
    while (i < 10) {
        a = a + i;
        i = i + 1;
    }
}

这将为您提供带有汇编表示的
main.s

类似的代码将使用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
movl$0,-4(%ebp)#局部变量a
movl$0,-8%(ebp)#局部变量i
jmp条件
而:
#a=a+i
movl-8(%ebp),%eax#将i移动到%eax
添加%eax,-4(%ebp)#将%eax添加到
#i=i+1
加1美元-8%(ebp)#加1到i
条件:
movl-8(%ebp),%eax#将i移动到%eax
cmpl$10,%eax#将%eax与10进行比较
jl而#如果我<10,则跳转

那么,你的书描述了什么?听起来你好像看错了书。汇编语言不止一种。请指定您的目标CPU和汇编程序,并显示您迄今为止所做的尝试。@Michael Oops很好地发现了这一点。我想是时候换新规格了。答案(严重)相应地修改。只是一个注释:如果在32位模式下组装,这段代码可能会有问题,因为循环指令将使用ECX,其中上限字未定义。所以要么它必须组装成一个16位程序,要么它应该是
mov ecx,10
@Devolus它可能是。它可能是循环标签中的一个错误,就像在某些汇编器中它应该是loop.label一样,在其他汇编器中也是如此。label是一个本地标签,只有“label”是可能的。在任何一种情况下,我都假设OP甚至不知道如何执行该任务。汇编程序将抛出一个语法错误。这个不是
main() {
    int a = 0;
    int i = 0;
    while (i < 10) {
        a = a + i;
        i = i + 1;
    }
}
gcc -c -S main.c
            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