用汇编语言编写C程序

时间:2016-02-19 05:09:11

标签: c gcc assembly

我正在尝试学习汇编语言,但我不确定自己是否走在正确的轨道上。我有一个汇编语言的程序,我需要转换为C。

addq    %rsi, %rdi
addq    %rdi, %rdx
movq    %rdx, %rax
ret

尝试自己解决这个问题,我想出了一些基于

的内容
long p1(long x, long y, long z)
{
 x = x + y;
 z = z + x;
 long a = z;
 return a;
}

无论我以哪种方式看待它,我觉得我很接近,但是当我进行观察时,我什么也得不到。寻找一些指导..谢谢!

1 个答案:

答案 0 :(得分:3)

您的C代码看起来很好,据我所知,它与汇编代码完全相同。

您不应期望编译C代码将提供与示例完全相同的程序集。有许多不同的方法可以将C转换为汇编。

例如,如果我用gcc -O2编译你的C代码(没有优化),我会得到更长的汇编,它将所有函数参数和变量存储到堆​​栈中。这是不必要的(并且速度较慢),但使调试器更容易。如果我使用 leaq (%rdi,%rsi), %rax addq %rdx, %rax ret 进行编译,我会得到

Import UIKit

class TestUpload: UIViewController {


@IBOutlet weak var progress: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    progress.text = "Hello"

    // submit some jobs ….        
    // * I have omitted this code as I don't think it has a problem. * //

    let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 10 * Int64(NSEC_PER_SEC))
    dispatch_after(time, dispatch_get_main_queue()) {

        self.showProgress()
    }

}

func showProgress() {

    while Int(session.operationQueue.operationCount) > 0 {
        sleep(10)
        print(session.operationQueue.operationCount)
        progress.text = String(session.operationQueue.operationCount)
    }

    let confirmUpload = UIAlertController(title: "Your Tasks have been performed.", message: "Congratulation!", preferredStyle: UIAlertControllerStyle.Alert)
    confirmUpload.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action: UIAlertAction!) in  self.navigationController?.popViewControllerAnimated(true)}))

    presentViewController(confirmUpload, animated: true, completion: nil)


}

在这里,编译器巧妙地使用lea instruction在一条指令中进行添加和移动。