Незаконное обучение в Ассамблее - PullRequest
3 голосов
/ 15 апреля 2010

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

ЦП NTVDM обнаружил недопустимую инструкцию CS: db22 IP: 4de4 OP: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 все в порядкеконфигурации.Я пробовал много примеров кодов, которые отлично работают

Спасибо

Ответы [ 2 ]

10 голосов
/ 15 апреля 2010

Вы пропустили JMP:

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

PROC set_cursor near

Происходит следующее: после call set_cursor вы переходите к процедуре и снова ее выполняете , затем, когда вы нажимаете ret, она выскакивает из стека и вы переходите к: ну кто знает?

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

4 голосов
/ 15 апреля 2010

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

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

...