Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如何定义和使用;“结构数组”;nasm语法中的asm代码?_Winapi_Assembly_Nasm_Masm_Seh - Fatal编程技术网

Winapi 如何定义和使用;“结构数组”;nasm语法中的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

因此,基本上我是在Win32上处理一个伪asm代码,并试图使其重新组装

在代码中,我看到如下数据结构:

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