2014-09-18 3 views
0

Я немного смущен. Я не могу найти точную цель оператора смещения на языке ассемблера, поскольку я новичок в этом языке. Согласно теории оператор OFFSET возвращает расстояние метки от начала сегмента данных в байтах, соответствующее относительным режимам (Real/Protected). но когда я запускаю следующий кодоператор смещения на языке ассемблера

.data 
bVal BYTE ? 
wVal WORD ? 
dVal DWORD ? 
dVal2 DWORD ? 
dValArray DWORD 5 DUP(?) 
.code 
mov esi,OFFSET bVal  ; ESI = 00404000 
call DumpRegs 

mov esi,OFFSET wVal  ; ESI = 00404001 
call DumpRegs 

mov esi,OFFSET dVal   ; ESI = 00404003 
call DumpRegs 

mov esi,OFFSET dVal2   ; ESI = 00404007 
call DumpRegs 

mov esi,OFFSET dValArray  ; ESI = 0040400B 
call DumpRegs 

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

ответ

0

Для показать адреса данных:

00404000 BYTE ?   ; bVal 

00404001 WORD ?   ; wVal 
00404002 

00404003 DWORD ?   ; dVal 
00404004 
00404005 
00404006 

00404007 DWORD ?   ; dVal2 
00404008 
00404009 
0040400A 

0040400B DWORD 5 DUP(?) ; dValArray 
0040400C 
0040400D 
0040400E 

0040400F 
00404010 
00404011 
00404012 

00404013 
00404014 
00404015 
00404016 

00404017 
00404018 
00404019 
0040401A 

0040401B 
0040401C 
0040401D 
0040401E 

(Но этот механизм терпит неудачу суммарно для выравнивания данных Простое решение:.. Поместите второй байт после первого)

0

В случае Windows XP часть данных большинства программ начинается с бит выше шестнадцатеричного 400000. В этом случае кажется, что ваши данные начинаются с шестнадцатеричного кода 404000. Другие версии Windows также могут запускать данные на одном и том же общее местоположение, хотя Windows 7 и 8 могут немного смещать адреса, чтобы защитить программы от простых типов хаков.

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