精华内容
下载资源
问答
  • 将a段b段中的数据依次相加,结果存放在c段中 思路 先将asg的数据放进csg中 把bsg的数据与csg中的数据相加,存到csg中 注意 db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1 dw定义字类型变量...

    题目要求

    将a段和b段中的数据依次相加,结果存放在c段中

    思路

    先将asg的数据放进csg中
    把bsg的数据与csg中的数据相加,存到csg中

    注意

    db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1

    dw定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2

    dd定义双字类型变量,一个双字数据占4个字节单元,读完一个,偏移量加4

    易错:本题中用db定义,所以用ax接收时应该接收到al中,向csg中存放时,用al存放进去。如果直接将整个ax16位存进csg中,会导致溢出,csg中的下一个数据单元被ax的高8位字节覆盖

    注释写的很详细,细节写在注释里了

    执行过程记录

    循环执行前
    在这里插入图片描述
    p指令执行完第一个循环s1
    在这里插入图片描述
    p指令执行完第二个循环s2
    在这里插入图片描述

    代码

    在这里插入图片描述

    ;将a段和b段中的数据依次相加,结果存放在c段中
    
    assume cs:code,ds:asg,ds:bsg,ds:csg
    
    asg segment
    	db 1,2,3,4,5,6,7,8	;注意:db每个操作数占一个字节
    asg ends
    
    bsg segment
    	db 1,2,3,4,5,6,7,8
    bsg ends
    
    csg segment
    	db 0,0,0,0,0,0,0,0
    csg ends
    
    code segment
    
    start:	
    		;把asg的数据放进csg中
    		mov ax,asg	;asg地址放在ax中
    		mov dx,csg	;csg地址放在dx中
    		
    		mov ds,ax	;asg地址放在ds中
    		mov ss,dx	;csg地址放在ss中
    		mov bx,0	;偏移地址
    		mov cx,8	;循环8次
    		
    s1:		mov al,ds:[bx]	;把asg数据复制到al中
    		mov ss:[bx],al	;把al数据复制到csg中
    		inc bx			;偏移++
    		loop s1
    		
    		
    		;把bsg的数据加到csg中
    		mov ax,bsg	;bsg地址放在ax中
    		mov ds,ax	;bsg地址放在ds中
    		
    		mov bx,0	;控制偏移地址
    		mov cx,8	;循环8次
    		
    s2:		mov al,ds:[bx]	;把bsg数据复制到al中
    		mov ah,0h		;高位补0
    		mov dl,ss:[bx]	;把csg数据复制到dl中
    		mov dh,0h		;高位补0
    		add ax,dx		;把dx数据加上ax数据存在ax中
    		mov ss:[bx],al	;把al数据复制到csg中(注意不要用ax,否则溢出覆盖后面的数据)
    		inc bx
    		loop s2
    		
    		mov ax,4c00h
    		int 21h
    		
    code ends
    end start
    
    展开全文
  • C、C++ARM汇编语言之间的调用本节提供一些示例,显示如何从C++调用C和汇编语言代码,以及从C和汇编语言调用C++代码。其中包括调用约定和数据类型。主要包括下面内容:·相互调用的一般规则;·C++语言的特定信息;...

    12.4C' target='_blank' style='cursor:pointer;color:#D05C38;text-decoration:underline;'>C、C++和ARM汇编语言之间的调用

    本节提供一些示例,显示如何从C++调用C和汇编语言代码,以及从C和汇编语言调用C++代码。其中包括调用约定和数据类型。主要包括下面内容:

    ·相互调用的一般规则;

    ·C++语言的特定信息;

    ·调用示例。

    只要遵循正确的过程调用标准AAPCS,就可以混合调用C、C++和汇编语言例程。有关AAPCS的更多信息,请参阅ARM相关文档。

    12.4.1相互调用的一般规则

    以下一般规则适用于C、C++和汇编语言之间的调用。有关的详细信息,请参阅ARM开发相关文档。

    嵌入式汇编程序以及其与ARM嵌入式应用程序二进制接口(BSABI,ApplicationBinaryInterfacefortheARMArchitecture)的兼容使得混合语言编程更易于实现。它们可提供以下功能:

    ·使用__cpp关键字进行名称延伸;

    ·传递隐含this参数的方式;

    ·调用虚函数的方式;

    ·引用的表示;

    ·具有基类或虚成员函数的C++类的类型布局;

    ·非POD(PlainOldData)结构的类对象传递。

    以下一般规则适用于混合语言编程:

    ·使用C调用约定。

    ·在C++中,非成员函数可以声明为extern"C",以指定它们有C链接。带有C链接意味着定义函数的符号未延伸。C链接可以用于以一种语言实现函数,然后用另一种语言调用它。

    ·汇编语言模块所必须符合的AAPCS调用标准,应当适合于应用程序所使用的存储器模型。

    以下规则适用于从C和汇编语言调用C++函数:

    ·要调用全局(非成员)C++函数,应将它声明为extern"C",以提供C链接。

    ·成员函数(静态和非静态)总是有已延伸的名称。使用嵌入式汇编程序的__cpp关键字,可以不必手工寻找已延伸的名称。

    ·不能从C调用C++内联函数,除非确保C++编译器生成了函数的外联副本。例如,取得函数地址将导致生成外联副本。

    ·非静态成员函数接受隐含this参数作为r0中的第一个自变量,或作为r1中第二个自变量(如果函数返回非int类结构)。静态成员函数不接受隐含this参数。

    12.4.2C++的特定信息

    本节主要介绍一些专门适用于C++的内容。

    (1)C++调用约定

    ARMC++使用与ARMC相同的调用约定,但在下面的情况下,调用规则有所不同:

    ·调用非静态成员函数时,隐含的this参数是第一个自变量,或者是第二个自变量(如果被调用函数返回非int类的struct)。这可能在将来的版本中有所变化。

    (2)C++数据类型

    ARMC++使用与ARMC相同的数据类型,但在以下几种情况下,情况有所不同:

    ·如果struct或class类型的C++对象没有基类或虚函数,则它们的布局与ARMC相同。如果这样的struct没有用户定义的复制赋值运算符或用户定义的析构函数,则它是POD结构。

    ·引用表示为指针。

    ·C函数指针和C++(非成员)函数指针没有区别。

    (3)符号名称延伸

    链接程序将取消信息中符号名称的延伸。

    在C++程序中,C名称必须声明为extern"C"。ARMISOC头文件已经完成此操作。详细信息请参阅ARM相关文档。

    12.4.3混合编程调用举例

    汇编程序、C程序以及C++程序相互调用时,要特别注意遵守相应的AAPCS。下面一些例子具体说明了在这些混合调用中应注意遵守的AAPCS规则。这些示例程序默认为使用非软件栈检查的ATPCS规则,因为它们执行栈操作时不检查栈溢出。

    (1)从C调用汇编语言

    下面的程序显示如何在C程序中调用汇编语言子程序,该段代码实现了将一个字符串复制到另一个字符串。

    #include

    externvoidstrcopy(char*d,constchar*s);

    intmain()

    {constchar*srcstr="Firststring-source";

    chardststr[]="Secondstring-destination";

    /*下面将dststr作为数组进行操作*/

    printf("Beforecopying:\n");

    printf("%s\n%s\n",srcstr,dststr);

    strcopy(dststr,srcstr);

    printf("Aftercopying:\n");

    printf("%s\n%s\n",srcstr,dststr);

    return(0);

    }

    下面为调用的汇编程序。

    PRESERVE8

    AREASCopy,CODE,READONLY

    EXPORTstrcopy

    Strcopy ;r0指向目的字符串

    ;r1指向源字符串

    LDRBr2,[r1],#1 ;加载字节并更新源字符串指针地址

    STRBr2,[r0],#1 ;存储字节并更新目的字符串指针地址

    CMPr2,#0 ;判断是否为字符串结尾

    BNEstrcopy ;如果不是,程序跳转到strcopy继续拷贝

    MOVpc,lr ;程序返回

    END

    按以下步骤从命令行编译该示例:

    ①输入armasm-gscopy.s编译汇编语言源代码。

    ②输入armcc-c-gstrtest.c编译C源代码。

    ③输入armlinkstrtest.oscopy.o-ostrtest链接目标文件。

    ④将ELF/DWARF2兼容调试器与相应调试目标配合使用,运行映像。

    (2)汇编语言调用C程序

    下面的例子显示了如何从汇编语言调用C程序。

    下面的子程序段定义了C语言函数。

    intg(inta,intb,intc,intd,inte)

    {

    returna+b+c+d+e;

    }

    下面的程序段显示了汇编语言调用。假设程序进入f时,r0中的值为i。

    ;intf(inti){returng(i,2*i,3*i,4*i,5*i);}

    PRESERVE8

    EXPORTf

    AREAf,CODE,READONLY

    IMPORTg //声明C程序g()

    STRlr,[sp,#-4]! //保存返回地址lr

    ADDr1,r0,r0 //计算2*i(第2个参数)

    ADDr2,r1,r0 //计算3*i(第3个参数)

    ADDr3,r1,r2 //计算5*i

    STRr3,[sp,#-4]! //第五个参数通过堆栈传递

    ADDr3,r1,r1 //计算4*i(第4个参数)

    BLg //调用C程序

    ADDsp,sp,#4 //从堆栈中删除第5个参数

    LDRpc,[sp],#4 //返回

    END

    (3)从C++调用C

    下面的例子显示了如何从C++程序中调用C函数。

    下面的C++程序调用了C程序。

    structS{ //本结构没有基类和虚函数

    S(ints):i(s){}

    inti;

    };

    extern"C"voidcfunc(S*);

    //被调用的C函数使用extern“C”声明

    intf(){

    Ss(2); //初始化's'

    cfunc(&s); //调用C函数'cfunc'将改变's'

    returnsi*3;

    }

    下面显示了被调用的C程序代码。

    structS{

    inti;

    };

    voidcfunc(structS*p){

    /*定义被调用的C功能*/

    p->i+=5;

    }

    (4)从C++中调用汇编

    下面的例子显示了如何从C++中调用汇编程序。

    下面的例子为调用汇编程序的C++代码。

    structS{ //本结果没有基类和虚拟函数

    //

    S(ints):i(s){}

    inti;

    };

    extern"C"voidasmfunc(S*); //声明被调用的汇编函数

    intf(){

    Ss(2); //初始化结构体's'

    asmfunc(&s); //调用汇编子程序'asmfunc'

    returns.i*3;

    }

    下面是被调用的汇编程序。

    PRESERVE8

    AREAAsm,CODE

    EXPORTasmfunc

    asmfunc//被调用的汇编程序定义

    LDRr1,[r0]

    ADDr1,r1,#5

    STRr1,[r0]

    MOVpc,lr

    END

    (5)从C中调用C++

    下面的例子显示了如何从C++代码中调用C程序。

    下面的代码显示了被调用C++代码。

    structS{//本结构没有基类和虚拟函数

    S(ints):i(s){}

    inti;

    };

    extern"C"voidcppfunc(S*p){

    //定义被调用的C++代码

    //连接了C功能

    p->i+=5;//

    }

    调用了C++代码的C函数。

    structS{

    inti;

    };

    externvoidcppfunc(structS*p);

    /*声明将会被调用的C++功能*/

    intf(void){

    structSs;

    s.i=2;/*初始化S*/

    cppfunc(&s);/*调用cppfunc函数,该函数可能改变S的值*/

    returns.i*3;

    }

    (6)从汇编中调用C++程序

    下面的代码显示了如何从汇编中调用C++程序。

    下面是被调用的C++程序。

    structS{//本结构没有基类和虚拟函数

    S(ints):i(s){}

    inti;

    };

    extern"C"voidcppfunc(S*p){

    //定义被调用的C++功能

    //功能函数体

    p->i+=5;

    }

    在汇编语言中,声明要调用的C++功能,使用带连接的跳转指令调用C++功能。

    AREAAsm,CODE

    IMPORTcppfunc ;声明被调用的C++函数名

    EXPORTf

    f

    STMFDsp!,{lr}

    MOVr0,#2

    STRr0,[sp,#-4]! ;初始化结构体

    MOVr0,sp ;调用参数为指向结构体的指针

    BLcppfunc ;调用C++功能'cppfunc'

    LDRr0,[sp],#4

    ADDr0,r0,r0,LSL#1

    LDMFDsp!,{pc}

    END

    (7)在C和C++函数间传递参数

    下面的例子显示了如何在C和C++函数间传递参数。

    下面的代码为C++函数。

    extern"C"intcfunc(constint&);

    //声明被调用的C函数

    extern"C"intcppfunc(constint&r){

    //定义将被C调用的C++函数

    return7*r;

    }

    intf(){

    inti=3;

    returncfunc(i); //相C函数传参

    }

    下面为C函数。

    externintcppfunc(constint*);

    /*声明将被调用的C++函数*/

    intcfunc(constint*p){

    /*定义被C++调用的C函数*/

    intk=*p+4;

    returncppfunc(&k);

    }

    (8)从C或汇编语言调用C++

    下面的例子综合显示了如何从C或汇编语言中调用非静态、非虚的C++成员函数。可以使用编译器编译出的汇编程序查找已延伸的函数名。

    下面是被调用的C++成员函数。

    structT{

    T(inti):t(i){}

    intt;

    intf(inti);

    };

    intT::f(inti){returni+t;}

    //定义将被C调用的C++功能函数

    extern"C"intcfunc(T*);

    //声明将被C++调用的C函数

    intf(){

    Tt(5);//createanobjectoftypeT

    returncfunc(&t);

    }

    下面为调用C++的C语言函数。

    structT;

    externint_ZN1T1fEi(structT*,int);

    /*被调用的C++函数名*/

    intcfunc(structT*t){

    /*定义被C++调用的C函数*/

    return3*_ZN1T1fEi(t,2);/*实现3乘以t->f(2)功能*/

    }

    下面为调用C++的汇编函数。

    EXPORTcfunc

    AREAfoo,CODE

    IMPORT_ZN1T1fEi

    cfunc

    STMFDsp!,{lr} ;此时r0已经包含了指向对象的指针

    MOVr1,#2

    BL_ZN1T1fEi

    ADDr0,r0,r0,LSL#1 ;r0乘以3

    LDMFDsp!,{pc}

    END

    下面的例子显示了如何用嵌入式汇编语言实现上面的例子。在此例中,使用__cpp关键字引用该函数。因此,用户不必了解已延伸的函数名。

    structT{

    T(inti):t(i){}

    intt;

    intf(inti);

    };

    intT::f(inti){returni+t;}

    //定义被C++调用的汇编功能

    __asmintasm_func(T*){

    STMFDsp!,{lr}

    MOVr1,#2;

    BL__cpp(T::f);

    ADDr0,r0,r0,LSL#1;r0乘以3

    LDMFDsp!,{pc}

    }

    intf(){

    Tt(5);//创建T类型的对象

    returnasm_func(&t);

    }

    联系方

    展开全文
  • 12.4C、C++ARM汇编语言之间的调用本节提供一些示例,显示如何从C++调用C和汇编语言代码,以及从C和汇编语言调用C++代码。其中包括调用约定和数据类型。主要包括下面内容:·相互调用的一般规则;·C++语言的特定...

    12.4  C、C++ 和 ARM 汇编语言之间的调用

    本节提供一些示例,显示如何从C++调用C和汇编语言代码,以及从C和汇编语言调用 C++ 代码。其中包括调用约定和数据类型。主要包括下面内容:

    ·  相互调用的一般规则;

    ·  C++语言的特定信息;

    ·  调用示例。

    只要遵循正确的过程调用标准AAPCS,就可以混合调用C、C++和汇编语言例程。有关 AAPCS 的更多信息,请参阅ARM相关文档。

    12.4.1  相互调用的一般规则

    以下一般规则适用于C、C++和汇编语言之间的调用。有关的详细信息,请参阅ARM开发相关文档。

    嵌入式汇编程序以及其与ARM嵌入式应用程序二进制接口(BSABI,Application Binary Interface for the ARM Architecture)的兼容使得混合语言编程更易于实现。它们可提供以下功能:

    ·  使用__cpp关键字进行名称延伸;

    ·  传递隐含this参数的方式;

    ·  调用虚函数的方式;

    ·  引用的表示;

    ·  具有基类或虚成员函数的C++类的类型布局;

    ·  非POD(Plain Old Data)结构的类对象传递。

    以下一般规则适用于混合语言编程:

    ·  使用C调用约定。

    ·  在C++中,非成员函数可以声明为extern "C",以指定它们有C链接。带有C链接意味着定义函数的符号未延伸。C链接可以用于以一种语言实现函数,然后用另一种语言调用它。

    ·  汇编语言模块所必须符合的AAPCS调用标准,应当适合于应用程序所使用的存储器模型。

    以下规则适用于从C和汇编语言调用C++函数:

    ·  要调用全局(非成员)C++函数,应将它声明为extern "C",以提供C链接。

    ·  成员函数(静态和非静态)总是有已延伸的名称。使用嵌入式汇编程序的__cpp关键字,可以不必手工寻找已延伸的名称。

    ·  不能从C调用C++内联函数,除非确保C++编译器生成了函数的外联副本。例如,取得函数地址将导致生成外联副本。

    ·  非静态成员函数接受隐含this参数作为r0中的第一个自变量,或作为r1中第二个自变量(如果函数返回非int类结构)。静态成员函数不接受隐含this参数。

    12.4.2  C++的特定信息

    本节主要介绍一些专门适用于C++的内容。

    (1)C++调用约定

    ARM C++使用与ARM C相同的调用约定,但在下面的情况下,调用规则有所不同:

    ·  调用非静态成员函数时,隐含的this参数是第一个自变量,或者是第二个自变量(如果被调用函数返回非int类的struct)。这可能在将来的版本中有所变化。

    (2)C++数据类型

    ARM C++使用与ARM C相同的数据类型,但在以下几种情况下,情况有所不同:

    ·  如果struct或class类型的C++对象没有基类或虚函数,则它们的布局与ARM C相同。如果这样的struct没有用户定义的复制赋值运算符或用户定义的析构函数,则它是POD结构。

    ·  引用表示为指针。

    ·  C函数指针和C++(非成员)函数指针没有区别。

    (3)符号名称延伸

    链接程序将取消信息中符号名称的延伸。

    在C++程序中,C名称必须声明为extern "C"。ARM ISO C头文件已经完成此操作。详细信息请参阅ARM相关文档。

    12.4.3  混合编程调用举例

    汇编程序、C程序以及C++程序相互调用时,要特别注意遵守相应的AAPCS。下面一些例子具体说明了在这些混合调用中应注意遵守的AAPCS规则。这些示例程序默认为使用非软件栈检查的ATPCS规则,因为它们执行栈操作时不检查栈溢出。

    (1)从C调用汇编语言

    下面的程序显示如何在C程序中调用汇编语言子程序,该段代码实现了将一个字符串复制到另一个字符串。

    #include 

    extern void strcopy(char *d, const char *s);

    int main()

    {   const char *srcstr = "First string - source ";

    char dststr[] = "Second string - destination ";

    /* 下面将dststr作为数组进行操作 */

    printf("Before copying:\n");

    printf("  %s\n  %s\n",srcstr,dststr);

    strcopy(dststr,srcstr);

    printf("After copying:\n");

    printf("  %s\n  %s\n",srcstr,dststr);

    return (0);

    }

    下面为调用的汇编程序。

    PRESERVE8

    AREA    SCopy, CODE, READONLY

    EXPORT strcopy

    Strcopy ;r0指向目的字符串

    ;r1指向源字符串

    LDRB r2, [r1],#1 ;加载字节并更新源字符串指针地址

    STRB r2, [r0],#1 ;存储字节并更新目的字符串指针地址

    CMP r2, #0 ;判断是否为字符串结尾

    BNE strcopy ;如果不是,程序跳转到strcopy继续拷贝

    MOV pc,lr ;程序返回

    END

    按以下步骤从命令行编译该示例:

    ① 输入armasm -g scopy.s编译汇编语言源代码。

    ② 输入armcc -c -g strtest.c编译C源代码。

    ③ 输入armlink strtest.o scopy.o -o strtest链接目标文件。

    ④ 将ELF/DWARF2兼容调试器与相应调试目标配合使用,运行映像。

    (2)汇编语言调用C程序

    下面的例子显示了如何从汇编语言调用C程序。

    下面的子程序段定义了C语言函数。

    int g(int a, int b, int c, int d, int e)

    {

    return a + b + c + d + e;

    }

    下面的程序段显示了汇编语言调用。假设程序进入f时,r0中的值为i。

    ; int f(int i) { return g(i, 2*i, 3*i, 4*i, 5*i); }

    PRESERVE8

    EXPORT f

    AREA f, CODE, READONLY

    IMPORT g // 声明C程序g()

    STR lr, [sp, #-4]! // 保存返回地址 lr

    ADD r1, r0, r0 // 计算2*i(第2个参数)

    ADD r2, r1, r0 // 计算3*i(第3个参数)

    ADD r3, r1, r2 // 计算5*i

    STR r3, [sp, #-4]! // 第五个参数通过堆栈传递

    ADD r3, r1, r1 // 计算4*i(第4个参数)

    BL g // 调用C程序

    ADD sp, sp, #4 // 从堆栈中删除第5个参数

    LDR pc, [sp], #4 // 返回

    END

    (3)从C++调用C

    下面的例子显示了如何从C++程序中调用C函数。

    下面的C++程序调用了C程序。

    struct S { // 本结构没有基类和虚函数

    S(int s):i(s) { }

    int i;

    };

    extern "C" void cfunc(S *);

    // 被调用的C函数使用extern“C”声明

    int f(){

    S s(2); // 初始化 's'

    cfunc(&s); // 调用C函数 'cfunc' 将改变 's'

    return si*3;

    }

    下面显示了被调用的C程序代码。

    struct S {

    int i;

    };

    void cfunc(struct S *p) {

    /*定义被调用的C功能 */

    p->i += 5;

    }

    (4)从C++中调用汇编

    下面的例子显示了如何从C++中调用汇编程序。

    下面的例子为调用汇编程序的C++代码。

    struct S { // 本结果没有基类和虚拟函数

    //

    S(int s) : i(s) { }

    int i;

    };

    extern "C" void asmfunc(S *); // 声明被调用的汇编函数

    int f() {

    S s(2); // 初始化结构体 's'

    asmfunc(&s); // 调用汇编子程序 'asmfunc'

    return s.i * 3;

    }

    下面是被调用的汇编程序。

    PRESERVE8

    AREA Asm, CODE

    EXPORT asmfunc

    asmfunc                // 被调用的汇编程序定义

    LDR r1, [r0]

    ADD r1, r1, #5

    STR r1, [r0]

    MOV pc, lr

    END

    (5)从C中调用C++

    下面的例子显示了如何从C++代码中调用C程序。

    下面的代码显示了被调用C++代码。

    struct S {        // 本结构没有基类和虚拟函数

    S(int s) : i(s) { }

    int i;

    };

    extern "C" void cppfunc(S *p) {

    // 定义被调用的C++代码

    // 连接了C功能

    p->i += 5;                //

    }

    调用了C++代码的C函数。

    struct S {

    int i;

    };

    extern void cppfunc(struct S *p);

    /* 声明将会被调用的C++功能 */

    int f(void) {

    struct S s;

    s.i = 2;                /* 初始化S */

    cppfunc(&s);            /* 调用cppfunc函数,该函数可能改变S的值 */

    return s.i * 3;

    }

    (6)从汇编中调用C++程序

    下面的代码显示了如何从汇编中调用C++程序。

    下面是被调用的C++程序。

    struct S {           // 本结构没有基类和虚拟函数

    S(int s) : i(s) { }

    int i;

    };

    extern "C" void cppfunc(S * p) {

    // 定义被调用的C++功能

    // 功能函数体

    p->i += 5;

    }

    在汇编语言中,声明要调用的C++功能,使用带连接的跳转指令调用C++功能。

    AREA Asm, CODE

    IMPORT cppfunc ;声明被调用的 C++ 函数名

    EXPORT   f

    f

    STMFD  sp!,{lr}

    MOV    r0,#2

    STR    r0,[sp,#-4]! ;初始化结构体

    MOV    r0,sp ;调用参数为指向结构体的指针

    BL     cppfunc ;调用C++功能'cppfunc'

    LDR    r0, [sp], #4

    ADD    r0, r0, r0,LSL #1

    LDMFD  sp!,{pc}

    END

    (7)在C和C++函数间传递参数

    下面的例子显示了如何在C和C++函数间传递参数。

    下面的代码为C++函数。

    extern "C" int cfunc(const int&);

    // 声明被调用的C函数

    extern "C" int cppfunc(const int& r) {

    // 定义将被C调用的C++函数

    return 7 * r;

    }

    int f() {

    int i = 3;

    return cfunc(i); // 相C函数传参

    }

    下面为C函数。

    extern int cppfunc(const int*);

    /* 声明将被调用的C++函数 */

    int cfunc(const int *p) {

    /*定义被C++调用的C函数*/

    int k = *p + 4;

    return cppfunc(&k);

    }

    (8)从C或汇编语言调用C++

    下面的例子综合显示了如何从C或汇编语言中调用非静态、非虚的C++成员函数。可以使用编译器编译出的汇编程序查找已延伸的函数名。

    下面是被调用的C++成员函数。

    struct T {

    T(int i) : t(i) { }

    int t;

    int f(int i);

    };

    int T::f(int i) { return i + t; }

    // 定义将被C调用的C++功能函数

    extern "C" int cfunc(T*);

    // 声明将被C++调用的C函数

    int f() {

    T t(5);                    // create an object of type T

    return cfunc(&t);

    }

    下面为调用C++的C语言函数。

    struct T;

    extern int _ZN1T1fEi(struct T*, int);

    /* 被调用的C++函数名 */

    int cfunc(struct T* t) {

    /* 定义被C++调用的C函数 */

    return 3 * _ZN1T1fEi(t, 2);    /* 实现3乘以t->f(2)功能 */

    }

    下面为调用C++的汇编函数。

    EXPORT cfunc

    AREA foo, CODE

    IMPORT  _ZN1T1fEi

    cfunc

    STMFD   sp!,{lr} ;此时r0已经包含了指向对象的指针

    MOV r1, #2

    BL _ZN1T1fEi

    ADD r0, r0, r0, LSL #1 ;r0乘以3

    LDMFD sp!,{pc}

    END

    下面的例子显示了如何用嵌入式汇编语言实现上面的例子。在此例中,使用 __cpp 关键字引用该函数。因此,用户不必了解已延伸的函数名。

    struct T {

    T(int i) : t(i) { }

    int t;

    int f(int i);

    };

    int T::f(int i) { return i + t; }

    // 定义被C++调用的汇编功能

    __asm int asm_func(T*) {

    STMFD sp!, {lr}

    MOV r1, #2;

    BL __cpp(T::f);

    ADD r0, r0, r0, LSL #1 ;r0乘以3

    LDMFD sp!, {pc}

    }

    int f() {

    T t(5); // 创建T类型的对象

    return asm_func(&t);

    }

    联系方

    展开全文
  • C基础和数据类型

    2017-12-16 10:47:50
    2017-7-19 C基础和数据类型 复习完成时间2017-7-19 22点 复习知识点: 一、C基础内容 1、计算机语言分类: ①机器语言②汇编语言(可读性、移植性差)③高级语言(c,java等)④脚本语言(如Python) 2、C语言...

    2017-7-19 C基础和数据类型

    复习完成时间2017-7-19 22点

    复习知识点:

    一、C基础内容

    1、计算机语言分类:

    ①机器语言②汇编语言(可读性、移植性差)③高级语言(c,java等)④脚本语言(如Python)

    2、C语言特点:

    语言简洁,紧凑,灵活(32关键字,9控制语句);运算符丰富;结构化语言(函数);能够对硬件和内存进行操作;代码质量和效率高;移植性好;

    3、C文件可以由预处理命令、全局变量声明、函数和注释组成。

    4、一个C程序有且仅有一个main函数。

    5、函数由函数的首部(函数第一行)和函数体组成。

    6、函数体由声明部分和执行部分组成。

    7、多行注释用/*开始,用*/结束,一行注释用//标出

    函数前注释内容:函数名;函数功能;函数参数;函数的返回值。

    8、VC使用:

    文件新建Win32 Console Application空工程

    文件新建C++ Source File,建立.c文件

    ALT+F8 对齐快捷键

    shift+tab 批量缩进

    编译(ctrl+F7);组建(F7);运行(ctrl+F5);

    调试:Go(F5);debug(F9);step out(F10);step into(F11);

    查看变量,内存(memery)

    9、程序=算法+数据结构+程序设计方法+语言工具和环境

    二、数据类型

    10、数据类型分为四大类:

    (1)基本类型:整型,字符型,浮点型(单精度型,双精度型),枚举类型

    (2)构造类型:数组类型,结构体类型,共用体类型

    (3)指针类型

    (4)空类型(不能定义变量)

    11、符号常量:

    #define NUM 100    //编译后,所有NUM用100替换

    cons int NUM=100  //const常量具有不可变性, 节省空间,避免不必要的内存分配

    12、标识符:

    (1)标识符由字母、数字和下划线组成;

    (2)标识符的第一位必须是字母或者下划线,不能是数字;

    (3)区分大小写

    13、

    char 8位 ASCII码:空格 32;A 65;a 97。

    int 32位 值范围 -2^31~(-2^31-1)(根据系统位数决定位数)

    float 32位 7位有效数字

    double 64位

    14、进制转换

    十进制转其它进制:短除法,将余数逆序排列

    其它进制转十进制:按权展开相加

    二、八、十六进制转换以二进制为中间值转换,八进制3位,十六进制4位

    十进制无前缀,八进制前缀为0,十六进制前缀为0x。

    小数转换二进制:小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。0.8125的二进制是0.1101

    15、原码、反码、补码

    在计算机系统中,数值一律用补码来表示和存储。

    char字符用ASCII存储

    正数:原码=反码=补码

    负数:原码符号位为1;反码:符号位不变,其它取反;补码:反码+1.

    一个负整数(或原码)与其补数(或补码)相加,和为模。

    16、%lg根据double型数据自动选择以实数或科学计数法输出(自动适应小数位)

    %e 以科学计数法输出

    17、float在内存中的存储方式(178.125为例)

    第一步:将128.125表示成二进制数:(178.125)(十进制数)=(10110010.001)(二进制形式);

    第二步:将二进制形式的浮点实数转化为规格化的形式:(小数点向左移动7个二进制位可以得到)

    10110010.001=1.0110010001*2^7 因而产生了以下三项:

    符号位:该数为正数,故第31位为0,占一个二进制位.

    阶码:采用移位存储,指数为7,故其阶码为127+7=134=(10000110)(二进制),占从第30到第23共8个二进制位.

    尾数为小数点后的部分, 即0110010001.因为尾数共23个二进制位,在后面补13个0,即01100100010000000000000

    所以,178.125在内存中的实际表示方式为:

    0 10000110 01100100010000000000000

     

    取值范围看指数部分:

    float是有符号型,其中,8位指数位,2^8=(-128—127),因此实际的范围是-2^128—2^127,约为-3.4E38—3.4E38

    同理double范围约是-1.7E308—1.7E308,

    精度是看尾数部分:

    float尾数位23位,2^23=8.3E6,7位,所以不同的编译器规定不同,有些是7位,有些8位

    double尾数52位,2^52=4.5E15,15位,所以double的有效位数是15位

    18、数据在内存中存储方式:

    大端模式:高存低,低存高;小端模式:低低,高高;(一般默认小端)

    未理解的知识点:基本都理解了

    作业完成情况:已提交

    心得体会:因为之前有学过,所以刚开始比较轻松些,后面结构体以后部分没教过,进程这么快,估计要加把劲了。

    展开全文
  • 课程介绍 第1章 预备知识  1.1 汇编语言的由来及其特点  1 机器语言  2 汇编语言 ...第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题
  • 第1章 预备知识  1.1 汇编语言的由来及其特点  1 机器语言  2 汇编语言 ...第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题 附录
  • 汇编语言教程

    2015-12-29 14:44:50
    课程介绍 第1章 预备知识  1.1 汇编语言的由来及其特点  1 机器语言  2 汇编语言 ...第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题 附录
  • 数据类型: C/C++语言中,数据类型有很多,常用的:int、long、short、char以及他们的unsigned型。我们熟知,int、long都是占用32位(4字节)。short占16位(2字节)。intlong的范围为0x00000000~0x7FFFFFFF、0x...
  • 汇编语言学习大全

    2011-10-08 22:56:17
    课程介绍 第1章 预备知识  1.1 汇编语言的由来及其特点  1 机器语言  2 汇编语言 ...第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题 附录
  • 今天在群里有朋友问到编译器是怎么识别不同数据类型和处理他们的。如果学过汇编或者编译原理应该很好理解。 没学过的话也没关系,这里大概讲解一下。 在计算机内部其实是没有变量类型的,只有由 段地址+偏移地址构成...
  • table.c是符号表,g.c是转化成具体masm32代码,只支持char,short,int,double四种类型数据,其他的有兴趣的可以自己修改增加,由于masm32限制,目前该编译器只支持局部变量在函数开头定义,全局变量不能局部变量...
  • 课程介绍 第1章 预备知识  1.1 汇编语言的由来及其特点  1 机器语言  2 汇编语言 ...第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题 附录
  • PHP变量和数据类型

    2015-12-11 10:45:00
    PHP变量和数据类型 原文:PHP变量和数据类型编程语言可以分为三大类 1. 静态类型语言,比如:C/Java等,在静态语言类型中,类型的检查是在编译...3. 无类型语言,比如:汇编语言汇编语言操作的是底...
  • 免分下载(评价资源有1分得。) 教程目录: 第1章 预备知识  1.1 汇编语言的由来及其特点 ...第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题 附录
  • 3 数学运算指令  4 比较运算指令  5 超越函数运算指令  6 常数操作指令  7 协处理器控制指令  11.4 协处理器的编程举例  11.5 习题 第12章 汇编语言和C语言  12.1 汇编语言的嵌入...
  • 汇编语言中,需要访问的硬件资源主要有:CPU内部资源、存储器I/O端口。本章将 着重讲解CPU内部寄存器的命名、功能及其常见的用途,还要介绍存储器的分段管理模 式、存储单元地址的表示法以及其物理地址的形成...
  • 80x86汇编语言教程

    2011-01-26 21:36:37
    课程介绍 第1章 预备知识  1.1 汇编语言的由来及其特点  1 机器语言  2 汇编语言 ...第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题 附录
  • 汇编语言.chm电子书

    2011-01-20 10:07:06
    汇 编 语 言 ... 课程介绍 第1章 预备知识  1.1 汇编语言的由来及其特点 ...第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题 附录
  • 汇编语言教程.chm

    2010-12-07 08:24:56
    课程介绍 第1章 预备知识  1.1 汇编语言的由来及其特点  1 机器语言 ...第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题 附录
  • 汇编语言教程chm版本

    2010-04-08 14:03:44
    汇编语言教程chm版本 值得收藏。 课程介绍 第1章 预备知识  1.1 汇编语言的由来及其特点 ...第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题 附录
  • 汇编语言经典电子书

    热门讨论 2007-12-24 08:40:28
    3 数学运算指令  4 比较运算指令  5 超越函数运算指令  6 常数操作指令  7 协处理器控制指令  11.4 协处理器的编程举例  11.5 习题 第12章 汇编语言和C语言  12.1 汇编语言的嵌入...
  • 入门知识,基础教程 课程介绍 第1章 预备知识  1.1 汇编语言的由来及其特点 ...第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题 附录
  • 第1章 预备知识  1.1 汇编语言的由来及其特点  1 机器语言  2 汇编语言 ...第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题 附录

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 538
精华内容 215
关键字:

数据类型汇编语言和c