2012-04-21 1 views
1

Итак, вот моя проблема. После того, как я вставляю переменную в стек и создаю место для локальной переменной. Как использовать DumpMem для отображения стека, прежде чем я вернусь из процедуры?Как использовать DumpMem для отображения стека в сборе

include irvine32.inc 

.data 
X sdword 10, -10, 20, -20, 30, -30, 40, -40 

.code 
begin: 
mov ecx, offset x 
push ecx 
call StackProcedure 

StackProcedure PROC 
     push ebp 
     mov ebp, esp 
     sub esp, 32 
     lea esi, [ebp-32] 
     mov ecx, 32 
L1:  mov BYTE PTR [esi], '*' 
     inc esi 
     loop L1 
     add esp, 32 
     pop ebp 
     ret 
StackProcedure ENDP 

finfin: 
invoke exitProcess,0 
end begin 

ответ

1

Ирвина DumpMem потребности всего три значения в регистрах. Только эти регистры подключены, все остальное (регистры, память, стек) не изменяется при возврате функции. Таким образом, его использование очень просто:

include irvine32.inc 

.data 
    X sdword 10, -10, 20, -20, 30, -30, 40, -40 

.code 

StackProcedure PROC 
    push ebp 
    mov ebp, esp 
    sub esp, 32 
    lea esi, [ebp-32] 
    mov ecx, 32 
L1: mov BYTE PTR [esi], '*' 
    inc esi 
    loop L1 

     mov esi, esp    ; Start address 
     mov ecx, 48     ; Number of bytes to dump 
     mov ebx, 1     ; 1 - size byte 
     call DumpMem    ; call Irvine's DumpMem 

    add esp, 32 
    pop ebp 
    ret 
StackProcedure ENDP 

main PROC 
    mov ecx, offset x 
    push ecx 
    call StackProcedure 
    invoke exitProcess,0 
main ENDP 

END main 

Я думаю, об этом не спрашивали. Irvine's DumpMem не показывает адресов, кроме начального адреса и эквивалентных символов ASCII, как ожидалось в дампе дизассемблера. Поскольку он имеет свой собственный дисплей (заголовки и строки), он не может быть встроен между функциями, которые предоставляют дополнительную информацию. Вот функция, которая отображает строку из 16 байтов с адресом, шестнадцатеричными значениями и символами ASCII:

include irvine32.inc 

.data 
    X sdword 10, -10, 20, -20, 30, -30, 40, -40 

.code 

DumpMemLine PROC C USES EBX ESI, address:PTR  ; dumps 16 bytes hex & char 
    mov eax, address 
    call WriteHex    ; call Irvine's WriteHex (8 hex digits) 
    mov al, ' ' 
    call WriteChar    ; call Irvine's WriteChar (space) 
    call WriteChar    ; call Irvine's WriteChar (space) 

    mov esi, address 
    mov ecx, 16 
    L1: 
    mov al, [esi] 
    cmp al, 14     ; ASCII code >= 14d? 
    jae @F      ; Yes, can be written unchanged 
    cmp al, 7     ; ASCII code < 7d? 
    jb @F      ; Yes, can be written unchanged 
    cmp al, 11     ; ASCII code == 11d? 
    je @F      ; Yes, can be written unchanged 
    cmp al, 12     ; ASCII code == 12d? 
    je @F      ; Yes, can be written unchanged 
    mov al, ' '     ; Replace characters that `WriteChar` will "cook" (7,8,9,10,13) 
    @@:       ; This is label where the `jcond @F` jump to 
    mov ebx, 1     ; Two hex digits 
    call WriteHexB    ; call Irvine's WriteHexB 
    mov al, ' ' 
    call WriteChar    ; call Irvine's WriteChar (space) 
    inc esi 
    loop L1 
    call WriteChar    ; call Irvine's WriteChar (space) 

    mov esi, address 
    mov ecx, 16 
    @@: 
    mov al, [esi] 
    call WriteChar    ; call Irvine's WriteChar 
    inc esi 
    loop @B 

    mov al, 10 
    call WriteChar    ; call Irvine's WriteChar (line feed) 

    ret 
DumpMemLine ENDP 

StackProcedure PROC 
    push ebp 
    mov ebp, esp 
    sub esp, 32 
    lea esi, [ebp-32] 
    mov ecx, 32 
L1: mov BYTE PTR [esi], '*' 
    inc esi 
    loop L1 

     mov esi, esp    ; Start address 
     mov ecx, 48     ; Number of bytes to dump 
     mov ebx, 1     ; 1 - size byte 
     call DumpMem    ; call Irvine's DumpMem 

     ; Dump three lines à 16 bytes 
     push esp     ; Argument for DumpMemLine 
     call DumpMemLine 
     add dword ptr [esp], 16  ; Increment the pushed argument 
     call DumpMemLine 
     add dword ptr [esp], 16  ; Increment the pushed argument 
     call DumpMemLine 
     add esp, 4     ; Clean up the stack 

    add esp, 32 
    pop ebp 
    ret 
StackProcedure ENDP 

main PROC 
    mov ecx, offset x 
    push ecx 
    call StackProcedure 
    invoke exitProcess,0 
main ENDP 

END main 
0

Я думаю, что вы пытаетесь увидеть дамп памяти, если ее currect, Вы можете использовать GDB отладчик для отладки программы, а также вы можете увидеть детали памяти, как регистры, сегменты, регистры управления, кадры и т.д. ... путем установки точек останова и перейдите по ссылке, чтобы получить больше на GDB,

http://www.yolinux.com/TUTORIALS/GDB-Commands.html 
Смежные вопросы