| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Адресация Win32 |
| Автор: VAV 18.2.2004, 19:20 |
| И сразу к телу.... ;пользую MASM 32 v8. + RadAsm, приложение под Win .data sBuf byte 255 dup ("Чегото там типа строка",0) .code mov eax,sBuf mov bl, byte ptr[eax] ; что в BL находится ? mov eax, 0 mov bl, byte ptr sBuf[eax] ; а теперь что в BL ? ;И что есть такое физически - ADDR ?(в макросах нашел только SADD) |
| Автор: p0s0l 18.2.2004, 19:39 | ||||
bl := первый байт содержимого sBuf ("Ч")
То же самое |
| Автор: VAV 18.2.2004, 20:14 |
| Я тоже так думал... Вот по подробнее: .386 .model flat, stdcall ;32 bit memory model option casemap :none ;case sensitive include windows.inc include kernel32.inc include user32.inc include Comctl32.inc include shell32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib user32.lib includelib Comctl32.lib includelib shell32.lib includelib masm32.lib includelib debug.lib DlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM MyProc PROTO :DWORD .const IDD_DIALOG1 equ 101 ;######################################################################### .data sBuf byte 255 dup("А о чем это я...",0) .data? hInstance dd ? ;######################################################################### .code start: invoke GetModuleHandle,NULL mov hInstance,eax invoke InitCommonControls invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL invoke ExitProcess,0 ;######################################################################## DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM mov eax,uMsg .if eax==WM_INITDIALOG invoke MyProc,ADDR sBuf .elseif eax==WM_COMMAND .elseif eax==WM_CLOSE invoke EndDialog,hWin,0 .else mov eax,FALSE ret .endif mov eax,TRUE ret DlgProc endp MyProc proc psBuf:DWORD pop esi mov esi,psBuf mov al,byte ptr [esi] PrintHex al ; Смотрим в дебагере xor esi,esi mov al,byte ptr psBuf[esi]; !!!!!!!!!!!!!!!! Вываливает ошибку обращения к памяти !!!!!!!!!!!! PrintHex al push esi ret MyProc endp end start |
| Автор: Chingachguk 18.2.2004, 22:02 | ||||
После
мне кажется, в eax будет не адрес sBuf, а ... первые четыре байта. Те никакой не адрес. Следует писать (если я прав):
|
| Автор: VAV 18.2.2004, 22:23 |
| Уважаемый обрати внимание на енто: MyProc proc psBuf:DWORD pop esi mov esi,psBuf mov al,byte ptr [esi] PrintHex al ; Смотрим в дебагере xor esi,esi mov al,byte ptr psBuf[esi]; !!!!!!!!!!!!!!!! Вываливает ошибку обращения к памяти !!!!!!!!!!!! PrintHex al push esi ret MyProc endp Тут то уж точно psBuf - поинтер. |
| Автор: Chingachguk 18.2.2004, 22:38 | ||||
| Я никогда так не пишу. Напиши все детальнее или посмотри в дизассемблре, что скомпильнулось. Я бы сделал так:
Ну или так:
Да и чего ты там с esi делаешь ? Зачем ты его pop в самом начале ? Если ты хочешь получить в него адрес возврата, то зачем ты его портишь потом ? |
| Автор: oleg1973 18.2.2004, 22:41 | ||
прально в esi у тебя 0 (xor esi,esi ) в данном случае ето все равно как mov al,[esi] или mov al,[0] нафига вообще ptr использовать? |
| Автор: VAV 19.2.2004, 06:47 | ||
xor esi,esi mov al,byte ptr psBuf[esi]; Вываливает ошибку обращения к памяти Нет ...усе правельно(в смысле правил языка). Берём байт из масива по нулевому смещению. Во всяком случае так должно быть(но енто не так |
| Автор: p0s0l 19.2.2004, 18:26 | ||
Тоже думал так, но fasm меня переубедил в обратном, хотя masm - это не fasm... VAV, параметры передаются через стек... Либо masm такой умный и откомпилит по-хитрому, либо ничего так не получится, т.к. значение psBuf надо вначале считать в какой-нибудь регистр... Видимо masm вместо psBuf подставил 0... Скажи, что тебе пишут в окне эксепшена ? Какой-там адрес? |
| Автор: oleg1973 19.2.2004, 20:55 | ||
нихрена не правельно mov esi,mybuff mov al,[esi] или lodsb от так правильно в таком случае читаю первый байт массива |
| Автор: VAV 20.2.2004, 09:14 |
| [/QUOTE]mov al,byte ptr psBuf[esi]; Вываливает ошибку обращения к памяти Напрягся...дизасемблернул И вот, что увидил: mov al, byte ptr ss:[esi+ebp+08] Откель сегмен стека взялся? Может потому что параметр psBuf передаётся через стек? Делаешь вот так: mov al,byte ptr DS:psBuf[esi]; И усё в норме Дизасм выдает: mov al,byte ptr[esi+ebp+08] А зачем к адресу добавляется 08 ? |
| Автор: Chingachguk 20.2.2004, 09:51 | ||
А зачем ebp добавляется ? |
| Автор: Serzh 20.2.2004, 21:02 | ||
а зачем тебе 255 раз строку повторять? |
| Автор: oleg1973 20.2.2004, 21:15 |
| извращенцы выкиньте tasmы masmы и прочее radasm прекрасно с fasm работает а в fasm не нада парится с ptr и прочими offset mov esi,mybuff mov al,[esi] mybuff: times 255 db 0 <- буферок на 255 байт и все без всяких извратов |
| Автор: VAV 22.2.2004, 11:31 |
| Короче дело к ночи.... ни одного дельного ответа.... Вы расуждаете о том у кого "машина" круче(баба, часы, телефон....). Я не спрашиваю чем пользоваться, я спрашиваю почему так происходит. |
| Автор: oleg1973 22.2.2004, 15:52 |
| VAV теж сказали в принципе ptr не есть команда асма а есть некий "макрос" компилятора и что он пихает на место ptr это уж одному алаху известно ну и соответственно на неправильно поставленный вопрос компилер дает неправильный ответ |