Я пытаюсь немного научиться ассемблеру, создавая небольшие программы на C в Visual Studio 2012 Express, а затем дизассемблируя их в Immunity Debugger. Но я явно столкнулся с чем-то, чего не понимаю:
012A13F0 68 58582A01 PUSH OFFSET Hello_Wo.??_C@_0M@KPLPPDAC@H>; ASCII "Hello World"
012A13F5 FF15 BC922A01 CALL DWORD PTR DS:[<&MSVCR110D.printf>] ; MSVCR110.printf
Меня смущают обе эти инструкции. На самом деле, коды операций имеют для меня больше смысла, чем настоящие инструкции, отображаемые отладчиком.
Очевидно, первая инструкция помещает адрес в стек. Когда я отслеживаю адрес в дампе, он показывает мне область, содержащую несколько шестнадцатеричных чисел, составляющих строку Hello World
. Я считаю, что это .data segment
. Я прав?
А также; Я предполагаю, что Hello_Wo.??_C@_0M@...
- это просто визуальная помощь, предоставленная мне отладчиком, чтобы я мог лучше понять, что это... Что-то...
Но что означает СМЕЩЕНИЕ в этой инструкции push? Я ничего не смог найти в Google по этому поводу.
Я также хотел бы спросить о другой инструкции ...
Насколько я понимаю, он пытается вызвать подпрограмму, используя 4-байтовое значение, расположенное по адресу DS:[102A92BC] (&MSVCR110D...)
, в качестве адреса вызова?
Отладчик говорит мне, что DS:[102A92BC] = 5C0A93A0
. И этот диапазон памяти зарезервирован для MSVCR110 .text segment
.
Мне очень жаль, но мне было трудно задать этот вопрос, так как я даже не был уверен, как мне его задать. Я надеюсь, вы понимаете. И спасибо.
Не по теме: у меня есть последний вопрос, который немного глуп и не по теме, но я надеюсь, вы не возражаете: вы никогда не должны читать сегменты данных как дизассемблированный код. , ты? сегмент данных импорта сбил меня с толку при поиске 5C0A93A0
.
jmp 0x40123456
, но дизассемблер удаляет этот базовый адрес, чтобы упростить чтение. - person AStupidNoob   schedule 14.07.2013