在公司开发的RT下没法使用C库,并且替代库函数没有几个,需要用到setjmp和longjmp函数,没办法,只能自己想办法了,上sourceforge淘换到一个小日本的工程,提供这两个函数的替代源码,名字叫libcont,下载下来发现实在Linux下编译的,查看Makefile文件,使用了GCC和NASM,郁闷了,但是实在找不到windows下的代码了,看看能不能移植到VC下吧!

千辛万苦,本想修改代码移植到VC下,无奈汇编格式差异较大,后经同事提醒,在VS2005下调用NASM总算把汇编嵌进来了,下面把步骤记录下来:

1.查看源文件,发现跟setjmp有关的有四个文件,分别是mysetjmp.h mysetjmp.c mysetjmp.asm macro.asm,把mysetjmp.h和mysetjmp.asm移进win32工程,mysetjmp.c不要了,其中的调用方式不适合VC。

2.sourceforge下载最新版NASM win32的那个,解压缩,将nasm.exe放到x:\windows\system32\目录下,在工程中,mysetjmp.asm上右键属性,配置属性下的自定义生成步骤,命令行参数填入:nasm -i $(InputDir) $(InputDir)$(InputName).asm  -f win32 -o $(IntDir)\$(InputName).obj 调用nasm将文件编译成win32格式的obj文件,-i $(InputDir) 参数是为了找到并调用本目录下的macro.asm文件;输出填入:$(IntDir)\$(InputName).obj。

3.打开mysetjmp.asm汇编文件,发现有两个函数,_mysetjmp 和_mylongjmp;打开mysetjmp.h,发现 int  _mysetjmp(myjmp_buf);void  _mylongjmp(myjmp_buf, int);两个函数,正好跟汇编函数对应,现在要对这两个文件稍作修改以适应VC环境,首先去掉每个函数前面的"_"这样在链接时VC才能找到汇编的两个函数,VC就是这么定的,然后添加_stdcall 之后两个函数声明变为:

int _stdcall mysetjmp(myjmp_buf);
void _stdcall mylongjmp(myjmp_buf, int);

4.修改mysetjmp.asm文件的两个函数名,分别添加后缀@4和@8,@后面跟的数字跟传递的参数有关,_mysetjmp改为_mysetjmp@4 因传递的参数为4字节的数组指针,_mylongjmp@8就是两个参数一共8字节了。

5.好了,编译工程吧,O了;使用时包含mysetjmp.h文件就可以了,跟调用C库函数一样。

附libcont三个文件修改后的代码:

----------------------------------------------------------------------------------------------------

mysetjmp.h

----------------------------------------------------------------------------------------------------

/*************************************************************
* Copyright (c) 2006 Shotaro Tsuji
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is     * furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*************************************************************/

/* Please send bug reports to
Shotaro Tsuji
4-1010,
Sakasedai 1-chome,
Takaraduka-si,
Hyogo-ken,
665-0024
Japan
negi4d41@yahoo.co.jp
*/

#ifndef _MY_SETJMP_H_
#define _MY_SETJMP_H_

#ifdef __cplusplus
extern "C" {
#endif

/*
* 銈枫偘銉娿儷銉炪偣銈劇瑕栥仐銇︺亰k锛? *
* setjmp銇с儸銈搞偣銈裤倰瑭般倎杈笺倱銇ongjmp銇у厓銇埢銇欍仹銇妅锛? * longjmp銇浜屽紩鏁般伅jmp_buf銇甧ax銇牬鎵€銇┌銈佽炯銇俱倢銈嬨倝銇椼亜銇? *
* 銉偢銈广偪涓€瑕? * EAX EBX ECX EDX ESI EDI EBP ESP EIP EFLAGS DS SS CS ES FS GS
* 32bit銉偢銈广偪16鍊? */

#define _JBLEN 16
#define _JBTYPE int
typedef _JBTYPE myjmp_buf[_JBLEN];

//#define mysetjmp _mysetjmp
//#define mylongjmp _mylongjmp

int _stdcall mysetjmp(myjmp_buf);
void _stdcall mylongjmp(myjmp_buf, int);

#ifdef __cplusplus
}
#endif

#endif

----------------------------------------------------------------------------------------------------

mysetjmp.asm

----------------------------------------------------------------------------------------------------

bits 32
;;  Copyright (c) 2006 Shotaro Tsuji
section .bss
section .data
section .text
%include "macro.asm"

cglobal _mysetjmp@4
cglobal _mylongjmp@8

; jmp_buf:
;    eax ebx ecx edx esi edi ebp esp eip
;    0   4   8   12  16  20  24  28  32

_mysetjmp@4:    ; int _setjmp(jmp_buf env);
push    ebp
mov    ebp, esp

push    edi    ; edi銈掍繚瀛?
mov    edi,    dword [ebp+8]    ; env銇偄銉夈儸銈广倰edi銇唬鍏?
mov    dword [edi+0],    eax
mov    dword [edi+4],    ebx
mov    dword [edi+8],    ecx
mov    dword [edi+12],    edx
mov    dword [edi+16],    esi
mov    eax,    dword [ebp-4]
mov    dword [edi+20], eax
mov    eax,    dword [ebp]
mov    dword [edi+24], eax
mov    eax, esp
add    eax, 12
mov    dword [edi+28], eax
mov    eax,    dword [ebp+4]
mov    dword [edi+32], eax
pop    edi
mov    eax, 0
leave
ret

_mylongjmp@8:    ; void _longjmp(jmp_buf env, int retval);
push    ebp
mov    ebp, esp

mov    edi,    dword [ebp+8]
mov    eax,    dword [ebp+12]
mov    dword [edi],    eax
mov    ebp,    dword [edi+24]

;cli

mov    esp,    dword [edi+28]
push    dword [edi+32]
mov    eax,    dword [edi]
mov    ebx,    dword [edi+4]
mov    ecx,    dword [edi+8]
mov    edx,    dword [edi+12]
mov    esi,    dword [edi+16]
mov    edi,    dword [edi+20]

;sti

ret

----------------------------------------------------------------------------------------------------

macro.asm

----------------------------------------------------------------------------------------------------

%ifdef MONA
%macro cglobal 1
global _%1
%define %1 _%1
%endmacro

%macro cextern 1
extern _%1
%define %1 _%1
%endmacro

%macro cexport 1
global _%1
export %1
%define %1 _%1
%endmacro
%else
%macro cglobal 1
global %1
%endmacro

%macro cextern 1
extern %1
%endmacro

%macro cexport 1
global %1
%endmacro
%endif

旧文备份:VC中嵌入NASM编写的汇编函数的更多相关文章

  1. 旧文备份:CANopen中SYNC的功能和使用

    SYNC是CANopen管理各节点同步数据收发的一种方法,相当于网络节拍,基于同步的PDO按照这个网络节拍来执行实时数据的收发.SYNC属于生产/消费型通讯方式,网络中有且只有一个SYNC生产者,一般 ...

  2. 旧文备份:简单CANOpen 协议说明

    (十年前的旧文,不舍等扔) 创建日期:2005-11-17 修改日期:2005-11-17 文件名称:简单CANOpen 协议说明.doc 作者:winshton 版本:V1.0 (注:本文以24in ...

  3. 旧文备份:在CANopen网络中通过LSS服务设置节点地址和网络波特率

    CANopen专有个子协议用来描述怎样去通过网络设置节点地址和波特率,就是CiA DSP-305,大伙都叫LSS协议,是Layer Setting Services的缩写,不太好翻译,可以叫底层设置服 ...

  4. 旧文备份:CANopen协议中SDO服务

    SDO是服务数据对象接口(Service Data Obiect)的缩写,顾名思义提供服务数据的访问接口,服务数据就是一些实时性要求不高的数据,一般是指节点配置参数,因此,SDO一般用来配置和获得节点 ...

  5. 旧文备份:rtlinux安装手册

    前段时间接触了几天RTLinux,折腾了好几天才总算把它安装上,得益于Prof. Chang-Gun Lee的安装建议,觉得该文档可能会对准备尝试安装RTLinux的朋友们有帮助,本人英语很烂,也比较 ...

  6. MFC单文档视图中嵌入GLFW窗口

    开始学习OpenGL由于有一段时间,但是glfw只有窗口区,虽然通过某种手段(移步这里)可以加入工具栏,但仍然无法作为一个标准的GUI,而直接在MFC或Qt里面使用OpenGL API感觉有诸多制肘, ...

  7. 旧文备份:FFTW介绍

    1. FFTW介绍 FFTW由麻省理工学院计算机科学实验室超级计算技术组开发的一套离散傅立叶变换(DFT)的计算库,开源.高效和标准C语言编写的代码使其得到了非常广泛的应用,Intel的数学库和Sci ...

  8. 旧文备份:windows下编译和使用IT++

    1.下载IT++最新版:<a href="http://sourceforge.net/projects/itpp/">http://sourceforge.net/p ...

  9. 旧文备份:AVR读写EEPROM分析

    由于AVR的EEPROM写周期比较长(一般为毫秒级),因此在编程使用过程中要特别注意.对于读EEPROM没什么好说的,读一个字节的数据要耗费4个时钟周期,可以忍受,写就比较麻烦了,虽然放在EEPROM ...

随机推荐

  1. RTT之POSIX

    POSIX:可移植操作系统接口,是一个标准. 创建线程:如果线程创建成功,线程立刻进入就绪态,参与系统的调度,如果线程创建失败,则会释放之前线程占有的资源int pthread_create (pth ...

  2. Gradient Boosting算法简介

    最近项目中涉及基于Gradient Boosting Regression 算法拟合时间序列曲线的内容,利用python机器学习包 scikit-learn 中的GradientBoostingReg ...

  3. 自定义Qt组件-通讯模块(P1)

    通讯模块Communicator 通讯模块是整个项目设计中位于最底层的模块,用于处理与串口或网络等设备的通讯,所有设备的通讯通过CommManager类完成,上层软件设计时需要根据comm模块(主要是 ...

  4. Scroller类的使用总结

    Scroll类之所以不好理解是因为没有搞清楚View的绘制流程. 1)简单来讲 viewgroup重绘时依次会调用  dispatchDraw -- drawChild --child.compute ...

  5. jq案例中遇到的知识点总结(会飞的小鸟和三级联动)

    1.会飞的小鸟 ,按键盘的上下左右键,小鸟会上下左右的飞 知识点:1.keyCode 键盘按键对应的数字 比如 左上右下键 对应 37 38 39 40: 2.小鸟的位置:var bBird=$(&q ...

  6. 报表XtraReport创建是实现

    1.创建XtraReport报表程序 一般设计这个程序是分着的,为了方便我就把他们合到一起 首先创建一个Winform Application 在form1中放一个button,右键程序,添加新项 如 ...

  7. AWS的redhat7中安装jdk8

    下载jdk8 wget https://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/ ...

  8. Vue.js基础语法(一)

    vue学习的一系列,全部来自于表哥---表严肃,是我遇到过的讲课最通透,英文发音最好听的老师,想一起听课就去这里吧 https://biaoyansu.com/i/hzhj1206 前言: 前端解析数 ...

  9. collides with another import statement解决办法

    如我要导入的两个包名为: import com.tesla.gateway.core.filter.Filter import ch.qos.logbak.core.filter.Filter 这样就 ...

  10. maven课程 项目管理利器-maven 3-3 maven中的坐标和仓库

    本节主要讲了两大方面: 1 maven坐标 1.0  构件定义 任何依赖,插件,项目构建输出 都称之为构件. 1.1 maven坐标概念 groupid 公司或组织的域名倒序+当前项目名称 artif ...