Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 编写汇编程序以从1添加到100_Assembly_Logic_Ias - Fatal编程技术网

Assembly 编写汇编程序以从1添加到100

Assembly 编写汇编程序以从1添加到100,assembly,logic,ias,Assembly,Logic,Ias,所以我试着加上1+2+3。。。等等…不用暴力。Y=∑_1^100▒Xi i,数字席在存储在位置100的连续存储器位置中存储。我正在使用IAS指令集: 我似乎无法完成这件事。 我甚至不知道从哪里开始,没有真正的循环或if语句。你有4种不同的可能方法,我将用x86编写,因为我对IAS的了解非常有限,但你可以应用相同的逻辑 1/暴力 xor eax, eax mov ecx, 100 .myloop: add eax, ecx dec ecx jnz .myloop 2/通过蛮力逻辑,您可以在内

所以我试着加上1+2+3。。。等等…不用暴力。Y=∑_1^100▒Xi i,数字席在存储在位置100的连续存储器位置中存储。我正在使用IAS指令集:

我似乎无法完成这件事。
我甚至不知道从哪里开始,没有真正的循环或if语句。你有4种不同的可能方法,我将用x86编写,因为我对IAS的了解非常有限,但你可以应用相同的逻辑

1/暴力

xor eax, eax
mov ecx, 100

.myloop:
add eax, ecx
dec ecx
jnz .myloop
2/通过蛮力逻辑,您可以在内存地址加载值(这似乎是您想要做的事情?我从100添加到1)

xor eax, eax
mov ecx, 100

.myloop:
lea edx, [100+ecx*4-4]       ; assuming integer array
add eax, [edx]
dec ecx
jnz .myloop
3/一种更有效的方法,假设数字彼此跟随,从1开始,你可以使用著名的公式
res=n(n+1)/2
。如果你考虑一个骰子,从1到6的和是21,正好是6*7/2。为了避免INT_MAX溢出,我建议测试是否设置了n位,如果设置了,则将n+1除以2,否则将n除以2

mov edx, [100+99*4]      ; load value 100 in register edx
test edx, 1
jnz .planb

mov eax, edx
shr eax
inc edx
imul eax, edx
leave
ret

.planb:
mov eax, edx
inc eax
shr eax
imul eax, edx
leave
ret

4/在您的注册表中硬编码n(n+1)/2。(等于5050)

您所说的“不使用暴力”是什么意思?你可以使用求和公式,或者干脆对结果进行硬编码……我的意思是我不想在累加器中加载1,然后一行一行地添加2和3。Q:你能给我们展示一下你的尝试吗?Q:你是否碰巧有一个IAS模拟器来测试?Q:示例有帮助吗?…然后一行一行地添加2和3”那么,你想使用一个循环吗?我们也会考虑蛮力,但是你真的问我们如何编写程序的等价于<代码>求和=0,对于i=1到100 {SUM=和+i} /代码>?我甚至不知道如何回答个别的响应(IM是这样的Kutuz ^ ^).Im正在单击,但我甚至看不到任何要单击的内容。作为对@Andreas的响应,我只想使用imgur链接中提供的指令集。如果指令集提供更多选项,如循环和ifs,对我来说就很容易了。IAS显然没有按位操作。但它有
div
,因此您可以使用它来测试奇数/甚至对于通过分支避免溢出的封闭形式实现,相比之下,clang的封闭形式模式()使用加宽乘法,并执行扩展精度右移,以从乘法的低33得到32位结果。(显然,IAS有一个加宽的乘法,但在一个新的高位移动可能是一个很大的痛苦,所以分支看起来不错)。代码片段2只需要添加eax,[100+ecx*4-4]。您忘记了实际读取内存(在
添加eax,edx上缺少[])。另外,第100个元素位于数组索引
ECX=99
。代码片段3也存在同样的问题。您需要
mov-edx,[100+99*4]
。否则将向上投票…Snippet 3无法使用
LEA
指令。您需要使用
MOV
从内存实际加载。我看到了您的聊天邀请。抱歉,我将在几分钟后注销。