主题:求助
windy0will
[专家分:2300] 发布于 2010-07-19 22:38:00
我学汇编不久,不知道怎样把它嵌入到C语言中。谁帮我举一个简单的例子,怎样在dev-c++中嵌入汇编代码?
最后更新于:2010-08-01 13:07:00
回复列表 (共7个回复)
沙发
强强 [专家分:4740] 发布于 2010-07-19 23:33:00
个人建议你不要混着学,汇编涉及到许多底层的东西比如内存分段,寻址,各种寄存器的使用,中断等等,想研究的话最好从DOS汇编入手,再转到保护模式,在C中嵌入的汇编已经不是真正意义上的汇编了.至于这个问题:
使用内嵌汇编,要先编写汇编指令模板,然后将C语言表达式与指令的操作数相关
联,并告诉GCC对这些操作有哪些限制条件。例如在下面的汇编语句:
__asm__ __violate__ ("movl %1,%0" : "=r" (result) : "m" (input));
"movl %1,%0"是指令模板;"%0"和"%1"代表指令的操作数,称为占位符,内嵌汇编
靠它们将C 语言表达式与指令操作数相对应。指令模板后面用小括号括起来的是C
语言表达式,本例中只有两个:"result"和"input",他们按照出现的顺序分别与
指令操作数"%0","%1"对应;注意对应顺序:第一个C 表达式对应"%0";第二个表
达式对应"%1",依次类推,操作数至多有10 个,分别用"%0","%1"...."%9"表示。
在每个操作数前面有一个用引号括起来的字符串,字符串的内容是对该操作数的限
制或者说要求。"result"前面的限制字符串是"=r",其中"="表示"result"是输出
操作数,"r"表示需要将"result"与某个通用寄存器相关联,先将操作数的值读入
寄存器,然后在指令中使用相应寄存器,而不是"result"本身,当然指令执行完后
需要将寄存器中的值存入变量"result",从表面上看好像是指令直接对"result"进
行操作,实际上GCC做了隐式处理,这样我们可以少写一些指令。"input"前面的
"r"表示该表达式需要先放入某个寄存器,然后在指令中使用该寄存器参加运算。
C表达式或者变量与寄存器的关系由GCC自动处理,我们只需使用限制字符串指导
GCC如何处理即可。限制字符必须与指令对操作数的要求相匹配,否则产生的汇编
代码将会有错,可以将上例中的两个"r",都改为"m"(m表示操作数放在内存,
而不是寄存器中)
板凳
windy0will [专家分:2300] 发布于 2010-07-19 23:46:00
对于ls的例子,先感激下......
不过,我不是混着学的,现在学的也正是dos汇编。只是自己想尝试实现一下几个常用的非标准库函数,如getch,getche等函数。
3 楼
强强 [专家分:4740] 发布于 2010-07-20 01:16:00
可以的话把代码放出来看看
4 楼
cgl_lgs [专家分:21040] 发布于 2010-07-20 07:15:00
gcc与masm/tasm汇编的格式不同,首先:操作数的源与目标是反的,且mov等关键字也不同,但在教材中的汇编都讲的是masm/tasm的。所以用gcc时你还会比较麻烦:)
5 楼
cgl_lgs [专家分:21040] 发布于 2010-07-20 07:17:00
建议可以如此学汇编:
看书,主要是基本的、常用的关键字,中断可以不用看了;
调试C程序,并在显示汇编代码的情况下调试,看看你写的语句对应的汇编是咋样儿的:)
6 楼
windy0will [专家分:2300] 发布于 2010-07-20 11:53:00
[quote]gcc与masm/tasm汇编的格式不同 [/quote]
很正确,试了好久还是不怎么会在c中嵌入汇编,写的代码也只能用masm编译才正确。
7 楼
强强 [专家分:4740] 发布于 2010-07-21 01:18:00
你很想嵌入的话可以用汇编写个DLL在C中调用或者用汇编写一个库
我来回复