我必须将以下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}发布于 2019-02-03 11:38:43
对于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:顺便说一句:在编写汇编程序代码时,你通常会有这样的印象,那就是你在编写超级高效的代码,因为你在最底层处理每一个细节。但是,编译器在这方面做得更好(除非一个非常精通的人需要大量时间来优化代码)。
优化编译器将为a)和b创建以下代码(假设数据已经在寄存器中并将通过寄存器返回)。在这两种情况下,它都不用使用分支就可以逃脱。试着打败它!
a)
mov r3, r0
cmp r0, r1
addgt r0, r0, r1
addle r1, r1, r2
subgt r0, r0, r2
mulle r0, r1, r3b)
sub r1, r1, #1
cmp r1, #24
movcs r0, #1发布于 2019-02-04 14:26:18
为此,我强烈推荐哥德波特的编译器浏览器(https://godbolt.org/z/AoYRcm)
此工具将显示您的高级语言编译到的程序集代码。编写一些样例c/c++代码。看看它能编译成什么。研究装配中使用的每一条指令。然后,您将能够编写纯粹在汇编中使用您所学到的新程序。
是的,从现代编译器的角度来看,程序集可能有点复杂。
不,不应该逐字复制编译器资源管理器的输出
优化后的代码将不会被转换为程序集指令。
https://stackoverflow.com/questions/54500875
复制相似问题