在公司开发的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. RobotFramework AppiumLibrary 用户关键字

    RobotFramework AppiumLibrary 用户关键字 最近在用robotframework搞安卓app 的自动化,其中用到了 AppiumLlibrary 的关键字,我都映射成了用户关 ...

  2. 以多进程读取oss符合条件的数据为例,综合使用多进程间的通信、获取多进程的数据

    import datetime import sys import oss2 from itertools import islice import pandas as pd import re im ...

  3. suffix ACM-ICPC 2017 Asia Qingdao

    Consider n given non-empty strings denoted by s1 , s2 , · · · , sn . Now for each of them, you need ...

  4. Surface Shader(表面着色器)

    Shader "Custom/Surface_Shadeer" { Properties {                                             ...

  5. js的事件冒泡

    先来段代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  6. C#开发微信公众号.NET平台MVC微信开发Demo解决收不到消息的问题

    不得不说现在微信非常火,微信开放平台可以自己写程序跟用户交互,节省了前台开发成本,免去用户装客户端的烦恼.于是今天兴致来潮,想做一个试试. 首先找到了开发者文档,看了看,蛮简单的.(公众号早已申请,有 ...

  7. c#获取目录

    获取程序目录 string s = System.IO.Directory.GetCurrentDirectory(); Console.WriteLine(s);// C:\Users\r-\doc ...

  8. jeecg3.8在子表页面中使用WebUploader组件

    bcAbout-update.jsp改动如下: 因为默认子表的上传组件不能回显,所以改造成WebUploader 1.在更新页面注销掉生成代码 <%--<script type=" ...

  9. Hibernate课程 初探多对多映射2-1 创建数据库表

    --创建表 -- 创建项目表 create table project(  proid int(10) not null comment '项目Id',  proname varchar(30) co ...

  10. 粗看ES6之JSON

    标签: es6 ES6新增JSON特性不是特别多,只是针对JSON某些情况下的写法上有一些优化: 当key值和value值对应变量名相同时 json对像中的方法书写 示例代码如下: <!DOCT ...