在为以下代码开发汇编语言指令时需要帮助。
a = 0;
i = 0;
while (i < 10) do
a = a + i;
i = i + 1;
endwhile
我对如何做到这一点感到非常困惑。我所拥有的这本书非常令人困惑,并且没有显示任何类型的示例来解决这个问题。任何帮助,将不胜感激。
在为以下代码开发汇编语言指令时需要帮助。
a = 0;
i = 0;
while (i < 10) do
a = a + i;
i = i + 1;
endwhile
我对如何做到这一点感到非常困惑。我所拥有的这本书非常令人困惑,并且没有显示任何类型的示例来解决这个问题。任何帮助,将不胜感激。
您可以使用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
提供程序集表示。
在 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
由于您尚未(在撰写本文时)指定您正在谈论的汇编器平台,这里有一些 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”之后进行了编辑,被善意地指出。;)
将使用 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