2014-02-27 3 views
0

Я пытаюсь изучить сборку (в частности, сорт nasm на ideone.com). Когда я перехожу к процедуре, я получаю код ошибки 11, а когда я просто вызываю процедуру, ошибки нет. Я пробовал его с и без «ret» в конце блока. Обратите внимание, что процедура _printOne вызывается только в том случае, если вход имеет длину 2, например, «[новая строка]». Вот мой кодКод ошибки при прыжке

global _start 

section .data 
    sys_read  equ 3 
    sys_write equ 4 
    max_line_len equ 10 
    stdin  equ 0  
    oneStr  db '1' 
    oneStrLen equ $ - oneStr 

section .bss 
    line resb 10 

segment .text 

_start: 
    call _readLine   ; stores value in line 
    cmp eax, dword 2   ; if input has length of 2, print out '1' 
    je _printOne    ; No error if "call _printOne"! 
    mov  eax, 01h   ; exit() 
    xor  ebx, ebx   ; errno 
    int  80h 

_readLine:   
    mov eax, sys_read  ; syscall to read 
    mov ebx, stdin   ; stdin 
    mov ecx, line  ; put line into ecx 
    mov edx, max_line_len ; length to read 
    int 0x80 
    ret 

_printOne: 
    mov eax, sys_write 
    mov ebx, stdout 
    mov ecx, oneStr 
    mov edx, oneStrLen 
    int 80h 
    ret 

ответ

2

Если вы просто оставить из RET в конце концов, процессор будет пытаться выполнить любой мусор после кода в памяти, что, вероятно, причиной неисправности.

Если вы хотите, чтобы сделать условный вызов, просто обратное состояние и перепрыгивать вызов, такие как:

cmp eax, dword 2 
    jne skip_print 
    call _printOne 
skip_print: 
    mov eax, 1 
    xor ebx, ebx 
    int 80h 

Если вы не хотите, чтобы _printOne в порядок, вы должны обеспечить способ продолжить выполнение здраво, например, прыгая назад, чтобы выйти следующим образом:

cmp eax, dword 2 
    je _printOne 
exit: 
    mov eax, 1 
    xor ebx, ebx 
    int 80h 
    ... 
_printOne: 
    mov eax, sys_write 
    mov ebx, stdout 
    mov ecx, oneStr 
    mov edx, oneStrLen 
    int 80h 
    jmp exit 

И, наконец, совет: не используйте ideone научиться программированию сборки. Настройте среду локально, в частности убедитесь, что у вас есть отладчик, где вы можете сделать один шаг своего кода и посмотреть, что происходит.

+0

Большое спасибо за совет. Причина, по которой я использую ideone, состоит в том, что у нас есть конкурсы на работе, и мы должны предоставить идеальную ссылку на наше решение; также моя работа comp запускает окна, тогда как ideone nasm in in Linux – reggaeguitar

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