c语言汇编程序设计,c语言对应汇编语句_c语言程序设计试题汇编答案_汇编语言和c语言区别...

39c6b29bb8fa6bca3cea3d8544abc972.png

313e8caf1cf28257265888b0488f7e16.png

#include

int main()

{

int result = 0;

int input = 1;

int a = 1;

int b = 2;

asm volatile (

"movl %1, %0\n" // 通过占位符指定交互的变量

: "=r"(result) // 输出变量,与汇编交互

: "r"(input) // 输出变量,与汇编交互

// 这里的r指示编译器自动将通用寄存器关联到变量

);

printf("result = %d\n", result);

printf("input = %d\n", input);

asm volatile (

"movl %%eax, %%ecx\n"

"movl %%ebx, %%eax\n"

"movl %%ecx, %%ebx\n"

: "=a"(a), "=b"(b) // 这里指明a变量使用a寄存器

: "a"(a), "b"(b)

);

printf("a = %d\n", a);

printf("b = %d\n", b);

return 0;

}

对于上述例子,编译器做了如下工作:

1.将result关联至某个合适的寄存器

f2e87833f64465a826f0b986ce7cbdbf.png

2.将input关联至某个合适的寄存器

3.通过通用寄存器间接操作函数

注意:

汇编语言不支持存储到内存的直接操作,要使用寄存器作为后面角色。

7-810-jpg_6-1080-0-0-1080.jpg

8fae0d8e72cf6bc2bd47ec3cee0f8216.png

可以直接通过内置汇编使用平台服务。通过INT 80H使用内核服务

1.INT指令用于使用Linux内核服务(中断指令)

2.80H是一个中断向量号,用于执行系统调用

6-810-jpg_6-1080-0-0-1080.jpg

3.可以借助寄存器指定确切的平台调用以及参数(如sys_write服务)

char* s = "D.T.Software\n";

int l = 13;

asm volatile(

"movl $4, %%eax\n" //

"movl $1, %%ebx\n"

"movl %0, %%ecx\n"

"movl %1, %%edx\n"

"int $0x80 \n"

:

: "r"(s), "r"(l)

: "eax", "ebx", "ecx", "edx"

);

asm volatile(

"movl $1, %eax\n"

"movl $42, %ebx\n"

"int $0x80 \n"

);

注意:

5c8a58e5687e7ad1f52ecd38a3edacf1.png

1.内嵌汇编时,除汇编模板外c语言对应汇编语句,其余参数都可以省略

2.当省略的参数在后面时c语言对应汇编语句,对应分隔符":"不可省略

3.当省略保留列表时,对应得到分隔符":"可以省略

4.当省略可选参数时,寄存器前使用单个%作为前缀

当存在可选参数时,寄存器前使用两个%%作为前缀

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-138773-1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值