Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Отладка консольной программы


Автор: i_SweP 21.7.2008, 19:16
Пытаюсь задебажить свою пробную прогу через OllyDebugger
Если попробовать её открыть, то говорит "unable to open or read", попробовал attach'иться, программа просто выполняется некоторое количество шагов, потом достигает до ret и всё.. До ввода данных дело почему-то не доходит. 
Как всё-таки добиться отладки ?

p.s. компилил через NASM, GCC

Автор: airyashov 22.7.2008, 08:40
Скорее всего, Вы пытаетесь открыть программу под DOS написанную.

Автор: i_SweP 22.7.2008, 09:18
И чем мне её препарировать ?

Автор: airyashov 23.7.2008, 09:39
выложите программу, посмотрим, либо какой-либо пример

Автор: i_SweP 23.7.2008, 16:15
Код

;---------------------------------------------------------------
%include "asm_io.inc"
;---------------------------------------------------------------
segment .data
    limitInputMsg    db    "Enter limit ", 0
    okMsg            db    "OK", 0
;---------------------------------------------------------------
segment .bss
    limit    resd    1    ; unsinged int limit;    
;---------------------------------------------------------------
segment .text
    global    _asm_main
_asm_main:
    enter        0, 0
    pusha
    
    mov        eax, limitInputMsg
    call        print_string
    call        read_int
    mov        [limit], eax
    
;    for(int i = 1; i <= limit; i++)
;    {
;        if(IsPrime(i))    cout << i << endl;
;    }
    
;    mov        ebx, 1
    xor        ebx, ebx
    inc        ebx            ; int i = 1
loop_start:
;    call        showOK
    push        ebx
    call        IsPrime
    add        esp, 4
    
    test        eax, eax    ; compare eax with 0
    jz        next_step    ; if(eax == 0) jmp nextStep    
    call        print_int
    call        print_nl
    
    next_step:
    inc        ebx
    cmp        ebx, [limit]
    jbe        loop_start
; end of the loop
    
    popa
    mov        eax, 0
    leave
    ret
;---------------------------------------------------------------
; IsPrime - функция, результат в EAX, 1 если переданное в стек значение - простое число
IsPrime:
;    for(int i = 2; i <= (parameter / 2); i++)
;    {
;        if(parameter % i == 1) return 0;
;    }
;    return 1;
;

    push        dword 2            ; int i = 2
    mov        ecx, [esp + 8]    ; ecx = parameter 
    shr        ecx, 1            ; ecx /= 2
    
IsPrime_loop_start:

    mov        eax, [esp + 8]    ; eax = parameter
;    xor        edx, edx        ; edx = 0 - before division
    cdq
    div        dword [esp]        ; eax /= i
    test        edx, edx        ; if(edx == 0) jmp IsPrime_next_step
    jz        IsPrime_next_step
    
    call        showOK                                    ; debug
    
    ; here return 1
    add        esp, 4            ; "delete" i
    mov        eax, 1            ; returned value = 1
    ret
        
    IsPrime_next_step:
    
    inc        dword [esp]        ; i++    
    cmp        [esp], ecx        ; cmp i, parameter / 2    
    jb        IsPrime_loop_start
    
    xor        eax, eax
    ret
;---------------------------------------------------------------
; for debug
showOK:
    push        eax
    mov        eax, okMsg
    call        print_string
    call        print_nl
    pop        eax
    ret
;---------------------------------------------------------------




Прога выводит все простые числа от 1 до limit
Комментил, как мог (ещё при написании)
К сожалению, табуляция на форуме какая-то кривая

Если ввести 20, то выводится 
ОК
1
Exiting due to signal SIGSEGV  и т.д.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)