Everything you can't fit into other forums
-
-
- Posts 445
- Joined: Mon Feb 09, 2009 4:13 am
Прошу прощения, ошибся. Сейчас посмотрел под отладчиком, всё работает. Я вообще не пользуюсь такой функцией, но сама функция интересная, правда несколько громоздкая, примерно на 10 байт больше команд "
CALL" "
RET", скорость тоже сомнительна. Кстати надо было написать что-то вроде "
JMP exit" после метки "
return:", а то получается безканечный цикл и всё виснет.
Примерно так.
Code: Select all
mov al,255 ; включаем все биты в al
shl ax,8 ; перемещаем значение в ah
mov al,255 ; включаем все биты в al
and ax,return ; в ax адрес возврата
jmp subr ; прыгаем на нашу подпрограмму
return: ; это куда мы вернемся
;любая последовательность команд
jmp exit ; прыжок на выход
subr: ; начала подпрограммы
; тут может располагаться любая последовательность команд, которая не приведет к изменению регистра ax
jmp ax ; вернемся на адрес который у нас в ax
exit: ; выход
-
- Posts 35
- Joined: Wed Jun 25, 2008 9:45 am
да елки, ну не работает and ax, return
чтобы не зациклилось можно сделать без дополнительной метки:
mov ax, 4c00h
int 21h
(это там, где надо прервать выполнение программы)
_____________________
Вроде все сделал. Надеюсь с and ax, offset return прокатит. Осталось только собственный стек сделать
-
- Posts 445
- Joined: Mon Feb 09, 2009 4:13 am
Gargo wrote:да елки, ну не работает and ax, return
чтобы не зациклилось можно сделать без дополнительной метки:
mov ax, 4c00h
int 21h
(это там, где надо прервать выполнение программы)
_____________________
Вроде все сделал. Надеюсь с and ax, offset return прокатит. Осталось только собственный стек сделать
Так ты под ДОС'ом кодиш чтоли? Под FASM'ом всё отлично компилится.
Gargo в предыдущем сообщении wrote: использую tasm
А чем тебя FASM не устраевает?
-
- Posts 657
- Joined: Mon Jan 16, 2006 7:58 pm
Gargo
У fasm и TASM/MASM есть отличия, в документации все подробно описано.
У masm/tasm and ax,return означает выполнить операцию со словом(word) начиная с адреса return. Т.е. оп коды, размером в 2 байта расположенные от метки return. В фасм аналогичная конструкция имело бы запись вида and ax,word [return]. Для masm|tasm нужно пользоваться спец словом offset. Правильная команда and ax,offset return.
Для fasm запись and ax,return означает выполнить логическую операцию с адресом метки return, а не с ее содержимым. Вот по этому под fasm все прекрасно работает, и компилируется, а под masm/tasm у тебя ничего не получается.
Лучше использовать FASM. Т.к. все примеры, которые приводятся тут написаны для сборки FASM'ом.
-
- Posts 35
- Joined: Wed Jun 25, 2008 9:45 am
Пасиб всем. Таки сдал. Интересно, что преподавателю прога показалась какой-то сложной, хотя у меня кода в 2-3 меньше чем у тех, кто сдавал раньше.
Users browsing this forum: Bing [Bot] and 12 guests