我必须将以下C语言转换为汇编语言。 谁能帮我 ? a)
if a>b
x=(a+b)-c
else
x=a*(b+c)
我对a)的回答是
ADR R0,a
ADR R1,b
ADR R2,c
ADR R3,x
LDR R0,[R0]
LDR R1,[R1]
LDR R2,[R2]
ADD R4,R0,R1
ADD R5,R1,R2
branch1 {SUBs R6,R4,R2
STR R6,[R3]}
branch2 {MULs R7,R5,R0
STR R7,[R3]}
CMP R0,R1
BGT branch1
BGT branch2
问题b),我不知道该怎么做
if(x<=0 OR x>=25){a=1}
答案 0 :(得分:1)
对于a),您需要遵循以下原则。对于 if 的两个部分,都使用 r4 存储中间结果和 x 值。
adr r0, a
adr r1, b
adr r2, c
adr r3, x
ldr r0, [r0]
ldr r1, [r1]
ldr r2, [r2]
cmp r0, r1
ble .L1
add r4, r0, r1
rsb r4, r2, r4
str r4, [r3]
b .L2
.L1:
add r4, r1, r2
mul r4, r4, r0
str r4, [r3]
.L2:
对于b),我们假定 OR 的行为与大多数编程语言相同,即条件的第二部分仅在第一部分导致 false 。
adr r0, a
adr r1, x
ldr r1, [r1]
cmp r1, #0
ble .L1
cmp r1, #24
ble .L2
.L1:
mov r2, #1
str r2, [r0]
.L2:
BTW:在编写汇编代码时,您常常会觉得自己正在编写超高效的代码,因为您会在最低层处理所有细节。但是,编译器的性能更好(除非非常熟练的人花费大量时间来优化代码)。
优化的编译器将为a)和b)创建以下代码(假设数据已经在寄存器中,并且将通过寄存器返回)。在这两种情况下,它都无需使用分支就可以摆脱。尝试击败它!
a)
mov r3, r0
cmp r0, r1
addgt r0, r0, r1
addle r1, r1, r2
subgt r0, r0, r2
mulle r0, r1, r3
b)
sub r1, r1, #1
cmp r1, #24
movcs r0, #1
答案 1 :(得分:0)
为此,我强烈推荐Godbolt的编译器资源管理器(https://godbolt.org/z/AoYRcm)
此工具将向您显示您的高级语言被编译为的汇编代码。编写一些示例c / c ++代码。看看它编译成什么。研究汇编中使用的每个指令。然后,您将能够使用所学的知识,纯粹用汇编语言编写新程序。
是的,对于现代编译器来说,汇编可能会有些复杂
不,您不应逐字复制编译器资源管理器的输出
经过优化的代码将不会转换为汇编指令。