Winapi 如何定义和使用;“结构数组”;nasm语法中的asm代码?
因此,基本上我是在Win32上处理一个伪asm代码,并试图使其重新组装 在代码中,我看到如下数据结构:Winapi 如何定义和使用;“结构数组”;nasm语法中的asm代码?,winapi,assembly,nasm,masm,seh,Winapi,Assembly,Nasm,Masm,Seh,因此,基本上我是在Win32上处理一个伪asm代码,并试图使其重新组装 在代码中,我看到如下数据结构: errtable errentry <1, 16h> errentry <2, 2> errentry <3, 2> errentry <4, 18h> errentry <5, 0Dh> ..... cmp
errtable errentry <1, 16h>
errentry <2, 2>
errentry <3, 2>
errentry <4, 18h>
errentry <5, 0Dh>
.....
cmp eax, dword ptr errtable.oscode[ecx*8]
mov eax, errtable.errnocode[ecx*8]
基本上,上述asm代码/数据不能由windows 32位上的NASM/MASM直接重新组装。因此,我必须调整此代码/数据
我在线搜索,找到了C中数据结构的定义:
struct errentry {
unsigned long oscode; /* OS return value */
int errnocode; /* System V error code */
};
static struct errentry errtable[] = {
{ ERROR_INVALID_FUNCTION, EINVAL }, /* 1 */
{ ERROR_FILE_NOT_FOUND, ENOENT }, /* 2 */
{ ERROR_PATH_NOT_FOUND, ENOENT }, /* 3 */
{ ERROR_TOO_MANY_OPEN_FILES, EMFILE }, /* 4 */
{ ERROR_ACCESS_DENIED, EACCES }, /* 5 */
{ ERROR_INVALID_HANDLE, EBADF }, /* 6 */
{ ERROR_ARENA_TRASHED, ENOMEM }, /* 7 */
{ ERROR_NOT_ENOUGH_MEMORY, ENOMEM }, /* 8 */
.........
所以我的问题是:如何修改asm代码/数据以使其重新组装
谢谢大家! 您有两个和标记,您需要哪一个?我确信这可以通过某种宏在NASM中实现,但在MASM中这是轻而易举的事
ENOENT equ 2
EBADF equ 9
ENOMEM equ 12
EACCES equ 13
EINVAL equ 22
EMFILE equ 24
errentry struc
oscode dd ?
ernocode dd ?
errentry ends
.data
errtable errentry <ERROR_INVALID_FUNCTION, EINVAL>, \
<ERROR_FILE_NOT_FOUND, ENOENT>, \
<ERROR_PATH_NOT_FOUND, ENOENT>, \
<ERROR_TOO_MANY_OPEN_FILES, EMFILE>, \
<ERROR_ACCESS_DENIED, EACCES>, \
<ERROR_INVALID_HANDLE, EBADF>, \
<ERROR_ARENA_TRASHED, ENOMEM>, \
<ERROR_NOT_ENOUGH_MEMORY, ENOMEM>
; ...
.code
start:
NextCode:
cmp eax, errtable.oscode[ecx * 8]
jne NotFound
mov eax, errtable.ernocode[ecx * 8]
jmp Next
NotFound:
; Err number not found, return something
Next:
嗨,枪手,谢谢!我正在使用nasm,目前我正试图绕过这个问题……但仍然存在一些问题。。。我不知道为什么有人否定我的问题…我应该按照你的解决方案,哈哈
include masm32rt.inc
ENOENT equ 2
EBADF equ 9
ENOMEM equ 12
EACCES equ 13
EINVAL equ 22
EMFILE equ 24
errentry struc
oscode dd ?
ernocode dd ?
errentry ends
.data
fmtint db "OS Code = %d, Err Code = %d", 13, 10, 0
fmtstr db "OS Code %d NOT FOUND!!!", 13, 10, 0
errtable errentry <ERROR_INVALID_FUNCTION, EINVAL>, \
<ERROR_FILE_NOT_FOUND, ENOENT>, \
<ERROR_PATH_NOT_FOUND, ENOENT>, \
<ERROR_TOO_MANY_OPEN_FILES, EMFILE>, \
<ERROR_ACCESS_DENIED, EACCES>, \
<ERROR_INVALID_HANDLE, EBADF>, \
<ERROR_ARENA_TRASHED, ENOMEM>, \
<ERROR_NOT_ENOUGH_MEMORY, ENOMEM>
; ...
errtable_len equ ($ - errtable) / 8
.code
start:
mov edi, 1
xor ebx, ebx
NextCode:
cmp edi, errtable.oscode[ebx * 8]
jne NotFound
invoke crt_printf, offset fmtint, errtable.oscode[ebx * 8], errtable.ernocode[ebx * 8]
jmp Next
NotFound:
; Err number not found, return something
invoke crt_printf, offset fmtstr, edi
Next:
inc ebx
inc edi
cmp edi, 12 ; loop 3 more than our test array
jne NextCode
inkey
invoke ExitProcess, 0
end start