C语言与汇编语言混合编程实验
<p><strong>混合编程方法:</strong></p><ol>
<li>模块链接法</li>
<li>汇编指令嵌入法</li>
</ol>
<h2>1: 模块链接法则</h2>
<p>模块链接法是指分别用汇编语言和C语言实现独立的模块(或子程序),再用链接程序把各模块生成的obj文件连接成一个可执行程序。</p>
<ul>
<li> 1:C语言调用汇编语言子程序:即由汇编语言实现子程序,C语言实现主程序。</li>
<li> 2: 汇编语言调用C语言子程序:即由C语言实现子程序,汇编语言实现主程序。</li>
</ul>
<h3>1.1 C语言调用汇编语言子程序</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">首先准备汇编语言子程序,如下(采用了简化段定义方式):
.</span><span style="color: rgba(128, 0, 128, 1)">386</span><span style="color: rgba(0, 0, 0, 1)">
.model flat, C
.STACK
.CODE
getmax PROC </span><span style="color: rgba(0, 128, 128, 1)">Param1:</span>SDWORD, <span style="color: rgba(0, 128, 128, 1)">Param2:</span><span style="color: rgba(0, 0, 0, 1)">SDWORD
</span><span style="color: rgba(0, 0, 255, 1)">MOV</span><span style="color: rgba(0, 0, 0, 1)"> EAX, Param1
</span><span style="color: rgba(0, 0, 255, 1)">CMP</span><span style="color: rgba(0, 0, 0, 1)"> EAX, Param2
</span><span style="color: rgba(0, 0, 255, 1)">JG</span><span style="color: rgba(0, 0, 0, 1)"> EXIT
</span><span style="color: rgba(0, 0, 255, 1)">MOV</span><span style="color: rgba(0, 0, 0, 1)"> EAX, Param2
</span><span style="color: rgba(0, 128, 128, 1)">EXIT:</span>
<span style="color: rgba(0, 0, 255, 1)">RET</span><span style="color: rgba(0, 0, 0, 1)">
getmaxENDP
END</span></pre>
</div>
<p>用新的汇编程序ML汇编源文件,格式为:ML /c /coff 源文件名<br> 这样就会生成一个Win32下支持的格式的obj文件</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1160484/201911/1160484-20191129150413673-267712544.png" alt=""></p>
<p> </p>
<p> </p>
<p><strong> 成功生成 ok.obj</strong></p>
<p>在VC6中创建一个项目,添加C语言源文件到项目,再把汇编生成obj文件也添加到项目(跟源文件一样),然后编译即可。<br><br></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">extern</span><span style="color: rgba(0, 0, 255, 1)">int</span> getmax(<span style="color: rgba(0, 0, 255, 1)">int</span> a, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> b);
#include </span><stdio.h>
<span style="color: rgba(0, 0, 255, 1)">int</span> main(<span style="color: rgba(0, 0, 255, 1)">int</span> argc, <span style="color: rgba(0, 0, 255, 1)">char</span>*<span style="color: rgba(0, 0, 0, 1)"> argv[])
{
</span><span style="color: rgba(0, 0, 255, 1)">int</span> m = getmax(<span style="color: rgba(128, 0, 128, 1)">12</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">);
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%d</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,m);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
}</span></pre>
</div>
<p><strong>如何添加OBJ文件:</strong></p>
<p><strong>方式一: 右键你创建的项目添加文件到工程即可正常链接</strong></p>
<p><strong>方式二: 工程选项》设置</strong></p>
<p><img src="https://img2018.cnblogs.com/i-beta/1160484/201911/1160484-20191129153011149-369319681.png" alt=""></p>
<p> </p>
<p> </p>
<p> 将刚才的ok.obj 这个可以是你的汇编程序生成的任何obj文件,添加到</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1160484/201911/1160484-20191129153135259-1102532113.png" alt=""></p>
<p> </p>
<p> </p>
<p><strong> 注意:ok.obj 必须在当前工程的目录下</strong></p>
<p> 运行</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1160484/201911/1160484-20191129153347568-1486634405.png" alt=""></p>
<p> </p>
<p> </p>
<p> </p>
<h3>1.2汇编语言调用C语言子程序</h3>
<p> 在VC6下编译c程序为obj或lib(注意在C++下定义C函数要加extern “C”前缀表明是一个C语言函数,而不是C++);</p>
<p><em id="__mceDel"> 在汇编里使用proto申明c函数的原型,使用<strong>invoke</strong>伪指令调用c函数;</em></p>
<p> 声明调用者代码:</p>
<div class="cnblogs_code">
<pre>.<span style="color: rgba(128, 0, 128, 1)">386</span><span style="color: rgba(0, 0, 0, 1)">
.model flat, stdcall
printf PROTO C </span><span style="color: rgba(0, 128, 128, 1)">param1:</span>ptr sbyte, <span style="color: rgba(0, 128, 128, 1)">param2:</span><span style="color: rgba(0, 0, 0, 1)">vararg ; 声明调用函数
.data
szMsg byte </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello World!</span><span style="color: rgba(128, 0, 0, 1)">'</span>, 0ah, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
.code
</span><span style="color: rgba(0, 128, 128, 1)">start:</span>
<span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> eax, OFFSET szMsg
invoke printf, eax
</span><span style="color: rgba(0, 0, 255, 1)">ret</span><span style="color: rgba(0, 0, 0, 1)">
end start</span></pre>
</div>
<p>用新的汇编程序ML汇编源文件,格式为:ML /c /coff 汇编程序文件名</p>
<p>用link32.exe将编译c程序生成的obj/lib与汇编生成的obj文件链接在一起即可,格式如下:</p>
<div class="cnblogs_code">
<pre>link32 汇编生成的obj文件名 c程序生成的obj/lib文件 /<span style="color: rgba(0, 128, 128, 1)">subsystem:</span><span style="color: rgba(0, 0, 0, 1)">console
如果直接调用C语言库函数,直接连接msvcrt.lib文件<br>例如:<br>link32 testmix.obj msvcrt.lib /subsystem:console<br>/subsystem:console表示生成的控制台程序,不是图形窗口程序<br></span></pre>
</div>
<p>C语言调用者程序:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">extern</span><span style="color: rgba(0, 0, 255, 1)">int</span> getmax(<span style="color: rgba(0, 0, 255, 1)">int</span> a, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> b);
</span><span style="color: rgba(0, 0, 255, 1)">int</span> main(<span style="color: rgba(0, 0, 255, 1)">int</span> argc, <span style="color: rgba(0, 0, 255, 1)">char</span>*<span style="color: rgba(0, 0, 0, 1)"> argv[])
{
</span><span style="color: rgba(0, 0, 255, 1)">int</span> m = getmax(<span style="color: rgba(128, 0, 128, 1)">12</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">);
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%d</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,m);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
}</span></pre>
</div>
<p> </p>
<h2>2: X86汇编指令嵌入法</h2>
<p>指令意思差异还是很大的</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1160484/201912/1160484-20191213132436649-1766180258.png" alt=""></p><br><br>
来源:https://www.cnblogs.com/dgwblog/p/11958065.html
頁:
[1]