2010-04-15 3 views
2

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

Процессор NTVDM обнаружил недопустимую инструкцию CS: db22 IP : 4de4 ОП: f0 FF FF FF FF

Первый сегмент кода работает просто отлично:

.model small 
.stack 100h 
.code 

start: 
    mov ax,@data 
    mov ds,ax 
    mov es,ax 

    MOV AH,02H ;sets cursor up    
    MOV BH,00H 
    MOV DH,02 
    MOV DL,00 
    INT 10H 

EXIT: 

MOV AH,4CH 
INT 21H 
END 

Однако это приводит к ошибке:

.model small 
.stack 100h 
.code 

start: 
    mov ax,@data 
    mov ds,ax 
    mov es,ax 

    call set_cursor 

    PROC set_cursor near 

    MOV AH,02H ;sets cursor up    
    MOV BH,00H 
    MOV DH,02 
    MOV DL,00 
    INT 10H 
RET 
set_cursor ENDP 

EXIT: 

    MOV AH,4CH 
    INT 21H 
    END 

Примечание: ничего не происходит с конфигурацией Windows. Я пробовал много кодов образца, которые работают нормально

Благодарности

+3

@Natasha, я бы уточнил название вопроса, чтобы быть немного более наглядным, вы получите лучший ответ :) – James

+1

@Natasha: если ответ решает вашу проблему, вы можете его принять. Не нужно редактировать вопрос. – SilentGhost

+0

ahh my bad, Спасибо в любом случае – Natasha

ответ

9

Вы не учтены в JMP:

call set_cursor 
jmp EXIT ; <== you forgot this part 

PROC set_cursor near 

Что происходит, что после call set_cursor, вы затем проваливаясь в прок и и выполнение он снова, затем, когда вы нажмете ret, он выталкивает стек, и вы прыгаете, ну, кто знает?

Edit: Как кто-то указал, вы лучше положить ваши PROC после того как ваш основной код заканчивается, вместо того, чтобы вставлять его в середине и прыгать вокруг него. Но вы, вероятно, уже поняли это уже :)

+0

глупо мне ... спасибо большое, я не заметил пропавшего прыжка – Natasha

+0

Мой сборщик профессор всегда называл его «Lala Land». Волшебное место, на которое ПК перескакивает, когда у вас нет конкретного обратного адреса. –

+1

lol, я думаю, я пропустил i LALA LAND – Natasha

4

Вы должны перенести код процедуры после части, где вы выходите из программы (или следуйте советам егрунина).

Причина вашего segfault заключается в том, что код в процедуре выполняется снова после его первого вызова. Во время второго выполнения код выходит из строя на RET, поскольку в стек нет действительного адреса возврата.

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