Всем доброй ночи, я недавно начал изучать ассемблер, столкнулся со следующей проблемой Моя функция: GetPathFile proc lpPathToFileWORD, lpFileNameWORD, lpFullPathWORD invoke LenghtString, lpFullPath cmp EAX, NULL jz FillPathFile invoke ClearString, lpFullPath FillPathFile: invoke CopyString, lpFullPath, lpPathToFile invoke LenghtString, lpFullPath mov EDI, lpFullPath add EDI, EAX mov byte ptr [EDI], '\' ret GetPathFile endp все нормально компилируется X:\ASM\masm32\Bin\ML.EXE /Zi /c /coff /Cp /nologo /I"X:\ASM\masm32\Include" "Starter.asm" X:\ASM\masm32\Bin\LINK.EXE /DEBUG /SUBSYSTEM:CONSOLE /RELEASE /VERSION:4.0 /LIBPATH:"X:\ASM\masm32\Lib" В OllyDbg вижу следующий вызов моей функции: 004011A5 |. 66:50 PUSH AX ; /Arg3 004011A7 |. 68 83364000 PUSH Starter.00403683 ; |Arg2 = 00403683 004011AC |. 68 0E334000 PUSH OFFSET Starter.Bases1CDir ; |Arg1 = 0040330E ASCII "d:\Bases1C\" 004011B1 |. E8 A1000000 CALL Starter.GetPathFile ; \GetPathFile Сама функция в OllyDbg: 00401257 > $ 55 PUSH EBP 00401258 . 8BEC MOV EBP, ESP 0040125A . FF75 10 PUSH DWORD PTR SS:[EBP+10] 0040125D . E8 67000000 CALL Starter.LenghtString 00401262 . 83F8 00 CMP EAX, 0 00401265 . 74 08 JE SHORT Starter.0040126F 00401267 . FF75 10 PUSH DWORD PTR SS:[EBP+10] 0040126A . E8 A5000000 CALL Starter.ClearString 0040126F > FF75 08 PUSH DWORD PTR SS:[EBP+8] 00401272 . FF75 10 PUSH DWORD PTR SS:[EBP+10] 00401275 . E8 64000000 CALL Starter.CopyString 0040127A . FF75 10 PUSH DWORD PTR SS:[EBP+10] 0040127D . E8 47000000 CALL Starter.LenghtString 00401282 . 8B7D 10 MOV EDI, DWORD PTR SS:[EBP+10] 00401285 03 DB 03 00401286 > F8 DB F8 00401287 C6 DB C6 00401288 07 DB 07 00401289 5C DB 5C ; CHAR '\' 0040128A C9 DB C9 0040128B > C2 DB C2 0040128C > 0C DB 0C 0040128D > 00 DB 00 последние 9 строк отладчик не распознал, у меня ошибка в коде или это баг отладчика? код работоспособен, меня смущают последние строки, можно что нибудь сделать чтобы они выглядели как: add EDI, EAX mov byte ptr [EDI], '\' ret add EDI, EAX 00401285 03 DB 03 00401286 > F8 DB F8 mov byte ptr [EDI], '\' 00401287 C6 DB C6 00401288 07 DB 07 00401289 5C DB 5C ; CHAR '\' ret 0040128A C9 DB C9 0040128B > C2 DB C2 0040128C > 0C DB 0C 0040128D > 00 DB 00 и ещё у меня вопрос, почему последняя инструкция RET, занимает 4 байта Можно ли код: mov EDI, lpFullPath add EDI, EAX mov byte ptr [EDI], '\' уменьшить в одну строку? Заранее всем кто откликнется огромное спасибо.
1. хз, вбил к себе твой кодес все нормально видно Код (Text): CPU Disasm Address Hex dump Command Comments 00401225 /$ 55 PUSH EBP ; dummy for ClearString 00401226 |. 8BEC MOV EBP,ESP 00401228 |. C9 LEAVE 00401229 \. C2 0400 RETN 4 0040122C /$ 55 PUSH EBP ; dummy for LenghtString 0040122D |. 8BEC MOV EBP,ESP 0040122F |. C9 LEAVE 00401230 \. C2 0400 RETN 4 00401233 /$ 55 PUSH EBP ; dummy for CopyString 00401234 |. 8BEC MOV EBP,ESP 00401236 |. C9 LEAVE 00401237 \. C2 0800 RETN 8 0040123A /$ 55 PUSH EBP ; GetPathFile 0040123B |. 8BEC MOV EBP,ESP 0040123D |. FF75 10 PUSH DWORD PTR SS:[Arg3] ; /Arg1 => [Arg3] 00401240 |. E8 E7FFFFFF CALL 0040122C ; \shablon.0040122C 00401245 |. 83F8 00 CMP EAX,0 00401248 |. 74 08 JE SHORT 00401252 0040124A |. FF75 10 PUSH DWORD PTR SS:[Arg3] ; /Arg1 => [Arg3] 0040124D |. E8 D3FFFFFF CALL 00401225 ; \shablon.00401225 00401252 |> FF75 08 PUSH DWORD PTR SS:[Arg1] ; /Arg2 => [Arg1] 00401255 |. FF75 10 PUSH DWORD PTR SS:[Arg3] ; |Arg1 => [Arg3] 00401258 |. E8 D6FFFFFF CALL 00401233 ; \shablon.00401233 0040125D |. FF75 10 PUSH DWORD PTR SS:[Arg3] ; /Arg1 => [Arg3] 00401260 |. E8 C7FFFFFF CALL 0040122C ; \shablon.0040122C 00401265 |. 8B7D 10 MOV EDI,DWORD PTR SS:[Arg3] 00401268 |. 03F8 ADD EDI,EAX 0040126A |. C607 5C MOV BYTE PTR DS:[EDI],5C 0040126D |. C9 LEAVE 0040126E \. C2 0C00 RETN 0C 2. лучше так Код (Text): invoke LenghtString, lpFullPath add eax,lpFullPath mov byte ptr [eax],'\' 3. Ответ в листинге
Я нашёл причину, вся проблема была в том что я компилировал с включенным режимом /Zi а линковал с /DEBUG как только отключил, сразу всё нормально стало отображаться.