21,459
社区成员
发帖
与我相关
我的任务
分享
IUnknown struct DWORD
QueryInterface IUnknown_QueryInterface ?
AddRef IUnknown_AddRef ?
Release IUnknown_Release ?
IUnknown ends
struct {char a; int b; char c;} s[3];
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 定义测试用的结构体
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
HvDWORD struct DWORD
aa BYTE ?
bb DWORD ?
cc BYTE ?
HvDWORD ends
; HvDWORD 与 NoDWORD 的区别在于是否在 struct 关键字后加 DWORD
NoDWORD struct
aa BYTE ?
bb DWORD ?
cc BYTE ?
NoDWORD ends
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
hvdd0 HvDWORD <11h,22abcd22h,33h>
hvdd1 HvDWORD 1 dup (<11h,22abcd22h,33h>)
hvdd2 HvDWORD 2 dup (<11h,22abcd22h,33h>)
hvdd3 HvDWORD 3 dup (<11h,22abcd22h,33h>,<44h,55abcd55h,66h>,<77h,88abcd88h,99h>)
nodd0 NoDWORD <11h,22abcd22h,33h>
nodd1 NoDWORD 1 dup (<11h,22abcd22h,33h>)
nodd2 NoDWORD 2 dup (<11h,22abcd22h,33h>)
nodd3 NoDWORD 3 dup (<11h,22abcd22h,33h>,<44h,55abcd55h,66h>,<77h,88abcd88h,99h>)
; 就测试结果看,这里存在不少问题,参见说明。
szCaption db 'HEX',0
szFormatHex db '%02X ',0
szFormatEnd db '(%dB)',0ah,0ah,0
.data?
szText db 4000 dup (?)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;--------------------------------------------------------------------
; @brief 将字节串打印为十六进制字符串
; @param _dst 目标字符串首址
; @param _src 源字节串首址
; @param _lng 源字节串长度
; @return 目标字符串尾址
printhex proc _dst,_src,_lng
local @lng
push _lng
pop @lng
.repeat
mov eax,_src
invoke wsprintf,_dst,offset szFormatHex,byte ptr [eax]
add _dst,eax
; 下一个
inc _src
dec @lng
.until @lng == 0
invoke wsprintf,_dst,offset szFormatEnd,_lng
add eax,_dst
ret
printhex endp
;--------------------------------------------------------------------
start:
lea eax,szText
invoke printhex,eax,offset hvdd0,sizeof hvdd0
invoke printhex,eax,offset hvdd1,sizeof hvdd1
invoke printhex,eax,offset hvdd2,sizeof hvdd2
invoke printhex,eax,offset hvdd3,sizeof hvdd3
invoke printhex,eax,offset nodd0,sizeof nodd0
invoke printhex,eax,offset nodd1,sizeof nodd1
invoke printhex,eax,offset nodd2,sizeof nodd2
invoke printhex,eax,offset nodd3,sizeof nodd3
invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
hvdd0 HvDWORD <11h,22abcd22h,33h> ; 正确
hvdd1 HvDWORD 1 dup (<11h,22abcd22h,33h>) ; 错误,值不对
hvdd2 HvDWORD 2 dup (<11h,22abcd22h,33h>) ; 错误,值不对
hvdd3 HvDWORD 3 dup (<11h,22abcd22h,33h>,<44h,55abcd55h,66h>,<77h,88abcd88h,99h>) ; 错误,值和个数都不对
nodd0 NoDWORD <11h,22abcd22h,33h> ; 正确
nodd1 NoDWORD 1 dup (<11h,22abcd22h,33h>) ; 正确
nodd2 NoDWORD 2 dup (<11h,22abcd22h,33h>) ; 正确,但我以为后面的元素(结构体)应该全是0
nodd3 NoDWORD 3 dup (<11h,22abcd22h,33h>,<44h,55abcd55h,66h>,<77h,88abcd88h,99h>) ; 错误,个数不对
关于错误的归纳,我前面已提及。
struct __attribute__((__aligned__(4))) {
unsigned char aa;
unsigned long bb;
unsigned char cc;
} s[3] = {
{0x11, 0x22abcd22, 0x33},
{0x44, 0x55abcd55, 0x66},
{0x77, 0x88abcd88, 0x99}
};