2014-02-19 3 views
1

Так что в основном я имею дело с псевдо-asm-кодом на Win32, и я пытаюсь сделать его повторно собранным.Как определить и использовать «массив структуры» в nasm-синтаксисе asm-кода?

В коде я вижу структуру данных, как это:

errtable errentry <1, 16h> 
      errentry <2, 2> 
      errentry <3, 2> 
      errentry <4, 18h> 
      errentry <5, 0Dh> 
      ..... 

И в секции .text, я вижу такой код:

cmp  eax, dword ptr errtable.oscode[ecx*8] 
mov  eax, errtable.errnocode[ecx*8] 

В основном ASM кода/данных, как и выше не могут быть напрямую собраны NASM/MASM для Windows 32 бит. Так что я должен настроить этот код/​​данные ...

я искал на линии и найти определение структуры данных в 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 */ 
    ......... 

Так что мой вопрос: Как изменить код ассемблера/данные для их повторной сборки?

Спасибо!

ответ

1

У вас есть как , так и с тегами, которые вам нужны? Я уверен, что это можно сделать в 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: 

И некоторые испытания код:
Мы изменим регистры вокруг так нам не нужно, чтобы сохранить их вокруг printf

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 

enter image description here

+0

Привет наводчика, Спасибо! Я использую nasm и хорошо, в настоящее время я пытаюсь обойти эту проблему ... Но все же некоторые проблемы ... http://stackoverflow.com/questions/21892665/where-is-mtinit-ioinit-and-mtterm-defined -on-win32 ... Я не знаю, почему кто-то отрицает мой вопрос ... – computereasy

+0

Я должен был следовать вашему решению, ха-ха – computereasy

 Смежные вопросы

  • Нет связанных вопросов^_^