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