Page 2 of 2

Re: Помогите с программированием на assembler #2

Posted: Sun Nov 22, 2009 4:33 am
by Rock_maniak_forever
Прошу прощения, ошибся. Сейчас посмотрел под отладчиком, всё работает. Я вообще не пользуюсь такой функцией, но сама функция интересная, правда несколько громоздкая, примерно на 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:               ; выход

Re: Помогите с программированием на assembler #2

Posted: Sun Nov 22, 2009 1:36 pm
by Gargo
да елки, ну не работает and ax, return
чтобы не зациклилось можно сделать без дополнительной метки:
mov ax, 4c00h
int 21h
(это там, где надо прервать выполнение программы)
_____________________

Вроде все сделал. Надеюсь с and ax, offset return прокатит. Осталось только собственный стек сделать

Re: Помогите с программированием на assembler #2

Posted: Mon Nov 23, 2009 1:32 am
by Rock_maniak_forever
Gargo wrote:да елки, ну не работает and ax, return
чтобы не зациклилось можно сделать без дополнительной метки:
mov ax, 4c00h
int 21h
(это там, где надо прервать выполнение программы)
_____________________

Вроде все сделал. Надеюсь с and ax, offset return прокатит. Осталось только собственный стек сделать
Так ты под ДОС'ом кодиш чтоли? Под FASM'ом всё отлично компилится.
Gargo в предыдущем сообщении wrote: использую tasm
А чем тебя FASM не устраевает?

Re: Помогите с программированием на assembler #2

Posted: Mon Nov 23, 2009 1:31 pm
by <Lrz>
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'ом.

Re: Помогите с программированием на assembler #2

Posted: Mon Nov 23, 2009 6:52 pm
by Gargo
Пасиб всем. Таки сдал. Интересно, что преподавателю прога показалась какой-то сложной, хотя у меня кода в 2-3 меньше чем у тех, кто сдавал раньше.