迪文科技论坛

 找回密码
 立即注册
搜索
查看: 1259|回复: 4

C编译器的struct是对齐到什么宽度?

[复制链接]

13

主题

28

回帖

218

积分

中级会员

Rank: 3Rank: 3

积分
218
发表于 2019-11-6 22:40:34 | 显示全部楼层 |阅读模式
问题1:
struct默认对其到什么宽度,可以不可以对其到字节宽带,支持pack(1)吗,语法怎么写?
问题2:
是不是不支持bool变量,变异报错?
问题3:
dmemcpy这函数,如果目的地址数组和源地址数组有重叠,也能保证复制正确吗?
回复

使用道具 举报

0

主题

42

回帖

703

积分

高级会员

Rank: 4

积分
703
发表于 2019-11-7 11:29:07 | 显示全部楼层
本帖最后由 KeveinPrince 于 2019-11-7 11:33 编辑

楼主,struct是四字节对齐,不支持#pragma pack   ,不支持bool   , 楼主能把源程序发一下吗?

回复

使用道具 举报

13

主题

28

回帖

218

积分

中级会员

Rank: 3Rank: 3

积分
218
 楼主| 发表于 2019-11-7 11:46:26 | 显示全部楼层
KeveinPrince 发表于 2019-11-7 11:29
楼主,struct是四字节对齐,不支持#pragma pack   ,不支持bool   , 楼主能把源程序发一下吗?

...

哦,收到了,谢谢。最后一个问题是C函数库中的memcpy和memmove去呗,dmemcpy它是如何实现的?
回复

使用道具 举报

0

主题

42

回帖

703

积分

高级会员

Rank: 4

积分
703
发表于 2019-11-7 12:00:16 | 显示全部楼层
无痕幽雨 发表于 2019-11-7 11:46
哦,收到了,谢谢。最后一个问题是C函数库中的memcpy和memmove去呗,dmemcpy它是如何实现的? ...

;*******************************************************************************
;   memcpy函数
;实现C语言中的memcpy函数,将p2中的内容赋值到p1指向的地址中,复制个数有len决定
;void memcpy(char *p1,char *p2,int len)
;无返回值
;参数说明:char *p1: 目的地址  R60-R61
;    char *p2:源地址  R62-R63
;   int  len:复制长度单位是字节 R64-R67
;*******************************************************************************
   ORG  0664H
_memcpy:
     ;将函数中使用到的寄存器进行入栈
            PUSH R68,4;
            PUSH R0,4;
            PUSH R9,1;
            MOV  R60,R68,2;
            OR  R68,R62,2;
            LDBR R69,0XF0,1;
            AND  R68,R69,1;    //20181008
            IJNE R68,0,_memcpy_01;
            ;说明两个地址都是寄存器
_memcpy_02:            
            MOV  R62,R0,2;
            MOV  R60,R2,2;
            LDWR R68,0X0100;
            JS  R68,R66,3;
            MOV  R67,R9,1;
            MOVA 0X01;
            GOTO _memcpy_stop;
            LDBR R9,0,1;
            MOVA 0X01;
            DEC  R66,0,1;
            INC  R60,0,1;
            INC  R60,0,1;
            GOTO _memcpy_02;
_memcpy_01:            
            MOV  R60,R68,2;
            AND  R68,R62,2;
            IJNE R68,0,_memcpy_VP;
_memcpy_04:            
            ;说明一个VP地址一个寄存器地址
             LDWR R68,0;
            JS  R68,R66,1;
            GOTO _memcpy_stop;
            LDWR R68,0XF000;
            AND  R68,R62,2;
            IJNE R68,0,6;
            ;寄存器空间
            MOV  R62,R0,2;
            LDWR R2,70;
            LDBR R9,2,1;
            MOVA 0X01;
            INC  R62,1,2;
            GOTO _memcpy_03;
     ;VP空间
            MOV  R62,R0,2;
            MOVXR R70,1,1;
            INC  R62,1,1;
_memcpy_03:            
            LDWR R68,0XF000;
            AND  R68,R60,2;
            IJNE R68,0,_memcpy_05;
            ;寄存器空间
   LDWR R68,1;
            TESTS R68,R66,2;
            IJNE R0,0,5;
            LDWR R0,70;
            MOV  R60,R2,2;
            LDBR R9,1,1;
            MOVA 0X01;
            GOTO _memcpy_stop;
            LDWR R0,70;
            MOV  R60,R2,2;
            LDBR R9,2,1;
            MOVA 0X01;
            INC  R60,1,2;
            DEC  R66,1,2;
            GOTO _memcpy_04;
            ;VP空间
_memcpy_05:
   LDWR R68,1;
            TESTS R68,R66,2;
            IJNE R0,0,5;
            MOV  R60,R0,2;
            MOVXR R64,1,1;
            MOV  R65,R71,1;
            MOVXR R70,0,1;
            GOTO _memcpy_stop;
            MOV  R60,R0,2;
            MOVXR R70,0,1;
            INC  R60,1,1;
            DEC  R66,1,2;
            GOTO _memcpy_04;
_memcpy_VP:
   MOV  R62,R0,2;
            MOV  R60,R2,2;
            INC  R66,1,1;
            SHR  R64,4,1;
            MOV  R66,R8,2;
            MOVXX 0;   //进行VP地址之间的交换
_memcpy_stop:            
            ;将入栈寄存器进行出栈
            POP  R9,1;
            POP  R0,4;
            POP  R68,4;
RET

回复

使用道具 举报

13

主题

28

回帖

218

积分

中级会员

Rank: 3Rank: 3

积分
218
 楼主| 发表于 2019-11-7 12:19:45 | 显示全部楼层
KeveinPrince 发表于 2019-11-7 12:00
;*******************************************************************************
;   memcpy函数
; ...

收到,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2026-4-15 02:50 , Processed in 0.060216 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表