2013-02-21 2 views
4

Проблема в том, когда я создаю 32-разрядный application.exe. Я получаю приложение с 16-разрядным машинным кодом.Создание 16-битного кода вместо 32-разрядного в MASM

Вот код (взято из книги):

 .386 
    .model flat 
    .const 
URL db "http://www.lionking.org/`cubbi/", 0 
    .code 

_start: 
    xor ebx, ebx 
    push ebx 
    push ebx 
    push ebx 
    push offset URL 
    push ebx 
    push ebx 
;  call ShellExecute 
    push ebx 
;  call ExitProcess 

end  _start 

Для построения приложения я пишу в консоли

  • мл winurl.asm (я пробовал мл/с winurl.asm но нет другого результата)
  • ссылки winurl.obj

Тогда у меня есть исполняемый файл с 16-битной машиной код:

PU = ?86, Uirtual 8086 Mode, Id/Step = 0F62, A20 enabled 
09E4:0000 33DB XOR BX,BX 
09E4:0002 53  PUSH BX 
09E4:0003 53  PUSH BX 
09E4:0004 53  PUSH BX 
09E4:0005 680000 PUSH 0000h 
09E4:0008 0000 ADD [BX+SI],AL 
09E4:000A 53  PUSH BX 
09E4:000B 53  PUSH BX 
09E4:000C 53  PUSH BX 
09E4:000D 0000 ADD [BX+SI],AL 
09E4:000F 006874 ADD [BX+SI+74h],CH 
09E4:0012 7470 JZ Short 0084 

Мне не нужен надлежащим образом действующий код. Я просто хочу собрать приложение с 32-битным кодом или я хочу понять, что я делаю неправильно.

Благодарим вас за внимание.

+1

Вы уверены, что это не просто ваш дизассемблер, который неправильно интерпретирует исполняемый файл? Что делать, если вы открываете файл, например. PE Explorer? – Michael

+0

@ Майкл, я уже разобрал свою другую программу, которая правильно работала с тем же ассемблером и отладчиком (masm611 и Debug32, соответственно). Неправильный машинный код. Это проблема. – gencurrent

+0

Нет, машинный код для 'push bx' и' push ebx' точно такой же. Разница заключается в ожидании того, какой сегмент кода он будет загружен. –

ответ

4

Если вы не сообщите дизассемблеру, что ваш код 16-разрядный (или 32-разрядный), и если он не может каким-либо образом его угадать (например, на основе формата исполняемого файла, если таковой имеется), дизассемблер не может знать, какой из они оба.

Я взял байты команд из вашей 16-битной разборки и разобрал их как 32-битный код:

00000000:i33DB       xor  ebx,ebx 
00000002:i53        push  ebx 
00000003:i53        push  ebx 
00000004:i53        push  ebx 
00000005:i6800000000      push  00000000 
0000000A:i53        push  ebx 
0000000B:i53        push  ebx 
0000000C:i53        push  ebx 
0000000D:i0000       add  [eax],al ; 0s between code & data 
0000000F:i006874       add  [eax+74],ch ; db 0,"ht" 
00000012:i7470       je ; db "tp" 

Это правильный 32-битный машинный код, генерируемый из источника сборки, и вы не разбирая его правильно. Как-то вы разбираете его как 16-бит, что неправильно.

2

Вы должны сообщить своему дизассемблеру, что вы создали 32-битный код. Доказательство:
От:

push offset URL 

дизассемблер показал следующее:

09E4:0005 680000 PUSH 0000h 
09E4:0008 0000 ADD [BX+SI],AL 

Вы видите второй команды OP-код 0000h, который является параметром первой операции. Дисассемблер думает, что это 4 байта (я не знаю, что именно разница в размере параметров в OP-коде, уверен, что это из-за 16 - 32 бит).

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

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