Вопрос № 29483: здраствуйте.
В ВинХР не работает программа.
хотя в 98 винде пашет.
Что нужно еще добавить или переделать?
Спасибо....Вопрос № 29532: Всем добрый день!!! У меня три вопроса:
1) В чем сущность этой строки
.sturtup ;и вообще,это макросредство или нет
2)как вызываются процедуры с передачей параметров типа:
Xxxx proc
arg Y:word <----что это за оператор (ar...
Вопрос № 29.483
здраствуйте.
В ВинХР не работает программа.
хотя в 98 винде пашет.
Что нужно еще добавить или переделать?
Спасибо.
Отвечает: Sager
Здравствуйте, newinfo2005!
Интересно, как она у тебя вообще скомпилилась.
Во-первых, чтобы делать так
push 0B800h
pop es
нужна директива .286
Во-вторых, регистр al может содержать только один байт, а проверяешь в нем два байта(и еще, что это за два слэша - они не нужны):
cmp al,'a'
И еще ты забыл установить видеорежим:
mov ax,3
int 16h
в приложении рабочий исходник.
Приложение:
Ответ отправил: Sager (статус: Студент)
Отправлен: 13.11.2005, 20:32 Оценка за ответ: 3 Комментарий оценки: Уважаемый. Если бы она у меня не скомпилилась я бы и не задавал такой вопрос.Это раз. Два.Деректива .286 не нужна - это я уже пояснил.Три. у тебя вообще косят глаза. Купи очки или смени моник.Я "cmp al,'a'" там это не ставил.Два слеша не ставил-раз,я проверяю один байт-два. И ВИДЕОРЕЖИМА У МЕНЯ НЕТУ!!!!!! За такой ответ надо 1 ставить. И вообще почему ты
решил инить видеорежим?
Отвечает: Евгений Иванов
Здравствуйте, newinfo2005!
mov ax, 3
int 16
в самом начале
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 13.11.2005, 21:51
Отвечает: Юра Устинов
Здравствуйте, newinfo2005!
Cseg segment
assume cs:cseg,ss:cseg,ds:cseg,es:cseg
org 100h
begin:
call map
jmp init
d:
cmp dx,158
je l1
mov bx,158
mov cx,24
asdf:
add bx,160
cmp bx,dx
je l1
loop asdf
XOR AX,AX
mov di,dx
STOSW
MOV AH,31
mov al,1
mov dx,di
stosw
jmp l1
q:
int 20h
init:
mov ah,31
mov al,1
mov di,0
MOV DX,DI
stosw
l1:mov ah,10h
int 16h
cmp al,0
jz l1
cmp al,'w'
je w
cmp al,'a'
je a
cmp al,'s'
je s
cmp al,'d'
je d
cmp al,'q'
je q
jne l1
w:
cmp dx,159
jbe l1
XOR AX,AX
mov di,dx
STOSW
MOV AH,31
mov al,1
sub di,162
mov dx,di
mov es:[di],ax
jmp l1
s:
cmp dx,3840
jnl l1
XOR AX,AX
mov di,dx
STOSW
MOV AH,31
mov al,1
add di,158
mov dx,di
mov es:[di],ax
jmp l1
a:
cmp dx,0
je l1
mov cx,24
xor bx,bx
asd1:
add bx,160
cmp dx,bx
je l1
loop asd1
XOR AX,AX
mov di,dx
STOSW
MOV AH,31
mov al,1
sub di,4
mov dx,di
mov es:[di],ax
jmp l1
map proc
push 0B800h
pop es
mov di,160
mov cx,78
mov ax,3102
rep stosw
mov di,480
mov cx,30
rep stosw
add di,2
mov cx,49
rep stosw
mov cx,3
mov di,542
op:
add di,160
mov es:[di],ax
loop op
ret
map endp
cseg ends
end begin
--------- Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 5-ый класс)
Отправлен: 15.11.2005, 05:18
Вопрос № 29.532
Всем добрый день!!! У меня три вопроса:
1) В чем сущность этой строки
.sturtup ;и вообще,это макросредство или нет
2)как вызываются процедуры с передачей параметров типа:
Xxxx proc
arg Y:word <----что это за оператор (arg)?
....
ret
Если это правильно. Куда вообще вставлять передаваемые параметры
и как ими пользоваться???
Отправлен: 14.11.2005, 15:21
Вопрос задал: Ig0rSV (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Евгений Иванов
Здравствуйте, Ig0rSV!
параметры передаются через стек. стековый кадр.
ARG - это значит, параметры будут в стеке по положительному смещению.
например, [ebp + N]
LOCAL - по отрицательному - [EBP - M]
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 14.11.2005, 15:53
Отвечает: Ayl
Здравствуйте, Ig0rSV!
1. Нет, это не макросредство в классическом понимании. Это - директива компилятора. В зависимости от установленной модели и типа процессора данная строка преобразуется (вот в этом ее сходство с макросами) в некоторую последовательность инструкций (как команд, так и дополнительных директив компилятора) для начальной инициализации. Например, при создании программы в модели TINY директива .StartUp будет заменена только на установку смещения (заменена на директиву ORG 100h). В остальных моделях кроме установки
смещения в 0 (ORG 0) будет также выполнена установка регистра DS на сегмент данных (mov ax, @Data; mov ds, ax).
2. Можно вызвать по упрощенной схеме:
call <имя процедуры> [<язык> [, <список аргументов>]]
где <язык> - это один из идентификаторов: C, CPP, PASCAL, BASIC, FORTRAN, PROLOG или NOLANGUAGE, а <список аргументов> - любой аргумент, который может непосредственно помещаться в стек.
ARG - это не оператор, а директива описания параметров процедуры. При компиляции идентификаторы параметров будут заменены на выражения типа size ptr [BP+XX] для доступа к передаваемым через стек параметрам.
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 14.11.2005, 16:26
Отвечает: Юра Устинов
Здравствуйте, Ig0rSV!
2) Ложи в стек перед процедурой и доставай в самой процедуре:
push 12
call procedure
procedure proc
pop ax
...
procedure endp
--------- Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 5-ый класс)
Отправлен: 15.11.2005, 05:18
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Ig0rSV!
Держи примерчик для понимания.
Единственно, на что хочу обратить внимание - это на идентификатор языка.
От него зависит, как будут передаваться параметры в стек (с начала или с конца)
и как будут убираться из стека (посредством RET n либо ADD SP,n)
Например: С - параметры передаются с конца списка, параметры убираются ADD SP,n
PASCAL - передаются с начала, убираются по RET n
Можешь поэксперементировать.