社区
Linux/Unix社区
帖子详情
linux下汇编的问题
thinp
2004-12-04 05:25:43
我想编一个程序,主程序是用g++写的,里面有几个函数我想用汇编写,然后让C++的函数中来调用它,不知道该如何写?主要是汇编部分怎么写,谁有例子代码,对了,函数是有传入参数的
...全文
193
6
打赏
收藏
linux下汇编的问题
我想编一个程序,主程序是用g++写的,里面有几个函数我想用汇编写,然后让C++的函数中来调用它,不知道该如何写?主要是汇编部分怎么写,谁有例子代码,对了,函数是有传入参数的
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
thinp
2005-01-07
打赏
举报
回复
我想直接用汇编来写,函数,然后直接在C中调用汇编中的函数
wwwunix
2004-12-06
打赏
举报
回复
To thinp(孤类):
你想怎么做呢?
thinp
2004-12-06
打赏
举报
回复
wwwunix(木易) ,C中用汇编是可以,不过不方便,特别是有变量输入输出时,当程序大时,单单看变量就让人头痛得不得了
ahwgm
2004-12-05
打赏
举报
回复
不懂......
wwwunix
2004-12-05
打赏
举报
回复
Linux中用的是AT&T汇编:
at&t汇编语法简单说明
这些是从网上的一些资料整理而得,不知道说清楚了没有,或是有什么错误,请指正。
1:寄存器引用
引用寄存器要在寄存器号前加%,如 mov % eax, % ebx
2: 操作数顺序
操作数排列是从源(左)到目的(右),如
mov % eax(源), % ebx(目的)
3: 常数/立即数的格式
使用立即数,要在数前面加 $, 如 mov $4 , % ebx
符号常数直接引用 如 mov value , % ebx (value是一常数,已在前面定义)
引用符号地址在符号前加 $, 如 mov $value, % ebx (是将value的地址放到ebx中)
4:操作数的长度
操作数的长度用加在指令后的符号表示
b(byte), w(word), l(long) 如 movw %ax,%bx
5:寻址方式
内存寻址可以用
section:disp(base, index, scale) 表示,计算方法是
base + index*scale + disp, section在实模式下有用,保护模式下用线性地址,不用section。
例如:
call *SYMBOL_NAME(sys_call_table)(,% eax,4)
这是entry.S中的一句,对应应该是
% eax*4 + sys_call_table, 在sys_call_table中找到相应系统调用的地址。
二 基本的行内汇编
基本的行内汇编很简单,一般是按照下面的格式
asm("statements");
例如:asm("nop"); asm("cli");
asm 和 __asm__是完全一样的.
如果有多行汇编,则每一行都要加上 "\n\t"
例如:
asm( "pushl % eax\n\t"
"movl $0,% eax\n\t"
"popl % eax");
实际上gcc在处理汇编时,是要把asm(...)的内容"打印"到汇编
文件中,所以格式控制字符是必要的.
再例如:
asm("movl % eax,% ebx");
asm("xorl % ebx,% edx");
asm("movl $0,_booga);
在上面的例子中,由于我们在行内汇编中改变了edx和ebx的值,但是
由于gcc的特殊的处理方法,即先形成汇编文件,再交给GAS去汇编,
所以GAS并不知道我们已经改变了edx和ebx的值,如果程序的上下文
需要edx或ebx作暂存,这样就会引起严重的后果.对于变量_booga也
存在一样的问题.为了解决这个问题,就要用到扩展的行内汇编语法.
三 扩展的行内汇编
基本的格式是:
asm( statements : outputs : inputs : registers-modified);
statements是一些汇编语句,outputs是输出寄存器,inputs是输入寄存器,registers-modified
是在这个过程中改变的寄存器。
例如:
int i=0, j=1, k=0;
__asm__ __volatile__("
pushl %% eax\n
movl %1, %% eax\n
addl %2, %% eax\n
movl %% eax, %0\n
popl %% eax"
: "=g" (k)
: "g" (i), "g" (j)
); // k = i + j
在上面的这段代码中,输入寄存器用了"g"限定符,它的意思是将输入变量放入
eax,ebx,ecx,edx或内存变量其中之一,类似的限定还有:
"a" eax
"b" ebx
"c" ecx
"d" edx
"S" esi
"D" edi
"q" 从eax,ebx,ecx,edx分配寄存器
"r" 从eax,ebx,ecx,edx,esi,edi分配寄存器
"g" eax,ebx,ecx,edx或内存变量
"A" 把eax和edx合成一个64位的寄存器(use long longs)
"I" I是常数值,例如"1",它是把输出寄存器和输入寄存器由左到右,由上到下顺序往下数对应的寄存器
在上面这段代码中,%0对应k存放的寄存器,,%1对应i存放的寄存器,%2对应j存放的寄存器.
"i" 立即数
"m" 内存变量
输出寄存器要在前面加"=",指示输出的位置。
上面的代码展开大概是:
mov i, % eax
mov j, % ebx
pushl %% eax
movl % eax, %% eax
movl % ebx, %% eax
movl %% eax, % ecx
popl %% eax
又如:
do { \
int __d0, __d1; \
__asm__ __volatile__ ("movw %%dx,%%ax\n\t" \
"movw %4,%%dx\n\t" \
"movl %% eax,%0\n\t" \
"movl %% edx,%1" \
:"=m" (*((long *) (gate_addr))), \
"=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) \
:"i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
"3" ((char *) (addr)),"2" (__KERNEL_CS << 16)); \
} while (0)中
%3 对应edx, %2对应eax, %1是(*(1+(long *) (gate_addr))). 这段代码是将中断处理函数的地址填到
ldt(中断向量表)中。
tianxiangyuan
2004-12-04
打赏
举报
回复
在Linux内核中有例子
汇编
语言 基于
Linux
环境 第三版 z01
汇编
语言 基于
Linux
环境(24小时之后必须删除,否则后果自负)
深入分析
Linux
内核源码.chm
2.6
Linux
中的
汇编
语言 第三章中断机制 3.1 中断基本知识 3.2中断描述符表的初始化 3.3异常处理 3.4 中断处理 3.5中断的后半部分处理机制 第四章 进程描述 4.1 进程和程序(Process and Program) 4.2
Linux
中的进程...
linux
编译
汇编
,
linux
下的
汇编
教程
linux
下的
汇编
教程第一部分
Linux
下ARM
汇编
语法尽管在
Linux
下使用C或C++编写程序很方便,但
汇编
源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作 ARM的协...
Linux
汇编
行结构任何
汇编
行都是如下结构...
如何在
Linux
下写
汇编
目前
Linux
下的
汇编
器主要有:as、as86和gas,但是本文使用的是NASM(The Netwide Assembler)。它使用Intel形式的
汇编
格式,和Intel形式相对的是AT&T形式的
汇编
格式。 2.
Linux
下
汇编
介绍 2.1DOS和
Linux
下
汇编
的...
linux
下反
汇编
命令
linux
下反
汇编
命令
Linux/Unix社区
23,116
社区成员
74,506
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章