需要帮助开发以下代码段的汇编语言指令。
a = 0;
i = 0;
while (i < 10) do
a = a + i;
i = i + 1;
endwhile
我对如何做到这一点非常困惑。我所拥有的这本书非常令人困惑,并没有展示任何有关这方面的例子。任何帮助,将不胜感激。
答案 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