· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Вывод в видеопамять с помощью строковых ф-й.?

Посл.отвђт Сообщенiе


Дата: Июн 1, 2003 16:44:51

Пытался написать программу в которой из сегмента данных надпись копируеться строковыми ф-ями непосредственно в видеопамять. В зависимости от то значения stat надпись должна выводиться светлой или темной.
1. первый вопрос:
mov ax,seg datas
mov ds,ax
mov cx,op1l
rep
movs es:[di],ds:o13
копирует по адресу es:[di] строку из сегмента данных. копирует словами. Формат строки должен быть: "код символа","атрибут","код символа","атрибут",... если надо вывести ту же строку но с другим атрибутом приходиться создавать еще одну переменную с анологичной строкой но изменненными атрибутами. Можно ли как то этого избежать? Если да, то как? (В принципе приходит в голову незамысловатый цикл, только очень бы хотелось использовать строковые ф-и... подскажите как, пожалуста...)

2. Я не могу понять почему так происходи - в листинге все вроде бы кристально чисто, в тд я ошибку проследить не смог ( там строки
rep
movs es:[di],ds:op3
заменяються на мнемонику
rep movsb
и непонятно что где и почем. в ds адресс указан верно а в si вместо положеного смещения op3 смещения начиная от 0 увеличиваються на длинну op3l. ничего понять не могу!!! Он просто поочередно выводи все надписи, при этом длинна каждой конкретной надписи корректна. Помогите разобоаться пожалуста! С уважением Ворон.


dosseg
.386

stacks segment stack 'STACK' use16
db 100h dup (?)
stacks ends

codes segment 'code' use16
assume cs:codes,ds:datas

begin:

mov ah,00h
mov al,03h
int 10h


push 0b800h
pop es

push 0540h
pop di

mov ax,seg datas
mov ds,ax

cmp ds:stat,01h
jne dark0
mov cx,op1l
rep
movs es:[di],ds:op1
jmp next0
dark0:
mov cx,dop1l
rep
movs es:[di],ds:dop1
next0:

add di,0a0h
sub di,op1l

cmp ds:stat,02h
jne dark1
mov cx,op2l
rep
movs es:[di],ds:op2
jmp next1
dark1:
mov cx,dop2l
rep
movs es:[di],ds:dop2
next1:

add di,0a0h
sub di,op2l

cmp ds:stat,03h
jne dark2
mov cx,op3l
rep
movs es:[di],ds:op3
jmp next2
dark2:
mov cx,dop3l
rep
movs es:[di],ds:dop3
next2:

add di,0a0h
sub di,op3l

cmp ds:stat,04h
jne dark3
mov cx,op4l
rep
movs es:[di],ds:op4
jmp next3
dark3:
mov cx,dop4l
rep
movs es:[di],ds:dop4
next3:

add di,0a0h
sub di,op4l



mov ah,4ch
int 21h

codes ends


datas segment 'DATA' use16

op1 db "O",00001010b,"p",00001010b,"t",00001010b,"i",00001010b,"o",000 01010b,"n",00001010b," ",00001010b,"f",00001010b,"o",00001010b,"r",00001010b," ",00001010b,"o",00001010b,"n",00001010b,"e",00001010b," ",00001010b,"p",00001010b,"u",00001010b,"r",00001010b,"p",00001010b
op1l equ $-op1

dop1 db "O",00000010b,"p",00000010b,"t",00000010b,"i",00000010b,"o",00 000010b,"n",00000010b," ",00000010b,"f",00000010b,"o",00000010b,"r",00000010b," ",00000010b,"o",00000010b,"n",00000010b,"e",00000010b," ",00000010b,"p",00000010b,"u",00000010b,"r",00000010b,"p",00000010b
dop1l equ $-dop1

op2 db "O",00001010b,"p",00001010b,"t",00001010b,"i",00001010b,"o",000 01010b,"n",00001010b," ",00001010b,"f",00001010b,"o",00001010b,"r",00001010b," ",00001010b,"t",00001010b,"w",00001010b,"o",00001010b," ",00001010b,"p",00001010b,"u",00001010b,"r",00001010b,"p",00001010b
op2l equ $-op2

dop2 db "O",00000010b,"p",00000010b,"t",00000010b,"i",00000010b,"o",00 000010b,"n",00000010b," ",00000010b,"f",00000010b,"o",00000010b,"r",00000010b," ",00000010b,"t",00000010b,"w",00000010b,"o",00000010b," ",00000010b,"p",00000010b,"u",00000010b,"r",00000010b,"p",00000010b
dop2l equ $-dop2

op3 db "O",00001010b,"p",00001010b,"t",00001010b,"i",00001010b,"o",000 01010b,"n",00001010b," ",00001010b,"f",00001010b,"o",00001010b,"r",00001010b," ",00001010b,"t",00001010b,"r",00001010b,"e",00001010b," ",00001010b,"p",00001010b,"u",00001010b,"r",00001010b,"p",00001010b
op3l equ $-op3

dop3 db "O",00000010b,"p",00000010b,"t",00000010b,"i",00000010b,"o",00 000010b,"n",00000010b," ",00000010b,"f",00000010b,"o",00000010b,"r",00000010b," ",00000010b,"t",00000010b,"r",00000010b,"e",00000010b," ",00000010b,"p",00000010b,"u",00000010b,"r",00000010b,"p",00000010b
dop3l equ $-dop3


op4 db "E",00001010b,"x",00001010b,"i",00001010b,"t",00001010b
op4l equ $-op4

dop4 db "E",00000010b,"x",00000010b,"i",00000010b,"t",00000010b
dop4l equ $-dop4


stat db 02h

datas ends

end


Дата: Июн 2, 2003 07:56:18

Raven
1.
Если использование строковых функций обязательно, то я поместил бы атрибут в AL, DS:SI указывает на строку, ES:DI указывает на область в видеопамяти, CX содержит количество символов, а дальше CX раз STOSB и MOVSB.

2.
в листинге все вроде бы кристально чисто ... а в si вместо положеного смещения
Imho строковые команды не устанавливают значения приемника/источника даже если Вы их указали. Я никогда не использовал формат записи команды MOVS как у Вас. Всегда писАл:
[code]
cld ; или STD
mov cx,Count
les di,Dst
lds si,Src
rep movsb ; или MOVSW
[/code]


Дата: Июн 2, 2003 11:19:02

Добрый день, Ворон.

1. Первый ответ:
См. код ниже. По-моему, одними строковыми операциями (типа rep movsw) здесь не обойтись. Можно, конечно, набивать вручную тот речитатив, который у тебя в сегменте данных, или использовать макросы типа irpc, которые лично я не уважаю. :)

2. Странно... Похоже, я в танке... По-моему всю жизнь писали
mov si,offset op1
mov cx,op1l
rep movsb
...
Или я что-то не понимаю?


Я бы для достижения твоей цели написал что-нить типа:

dseg segment
op1 db "Option for one purp"
op1l equ $-op1
op2 db "Option for two purp"
op2l equ $-op2
op3 db "Option for tre purp"
op3l equ $-op3
op4 db "Exit"
op4l equ $-op4
style1 db 0ah
style2 db 2h

stat db 02h
dseg ends

cseg segment
assume cs:cseg,ds:dseg
start:
mov ah,00h
mov al,03h
int 10h

mov ax,dseg
mov ds,ax

push 0b800h
pop es

push 540h
pop di

mov ah,stat
cmp ah,02h
jne dark
light:
mov al,style1
jmp work
dark:
mov al,style2
work:

mov si,offset op1
mov cx,op1l
movsb
stosb
loop $-2

add di,0a0h
sub di,op1l*2

mov si,offset op2
mov cx,op2l
movsb
stosb
loop $-2

add di,0a0h
sub di,op2l*2

mov si,offset op3
mov cx,op3l
movsb
stosb
loop $-2

add di,0a0h
sub di,op3l*2

mov si,offset op4
mov cx,op4l
movsb
stosb
loop $-2

exit:
mov ax,4c00h
int 21h
cseg ends
end start

Что скажешь?


Дата: Июн 3, 2003 22:57:56

Всем спасибо - заработало. P2M все указал верно. описаная в документации форма записи
movs приемник,источник
давала неверное смещение внутри сегмента. задал его отдельно и все заработало. кроме того идея со stosb сработала великолепно. rep правда пришлось заменить на цыкл с декрементой cx но код вырос не на много и оно того стоило


Дата: Июн 4, 2003 06:14:48

Raven
форма записи ... давала неверное ...
Повторюсь.
Строковые команды (независимо от формы записи) не устанавливают адреса приемника и источника, об этом обязана позаботится программа.


Дата: Июн 4, 2003 09:33:28

2P2M:
Извини, буду внимательнее. меня збивает с толку синтаксис приведенный в документации...


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.064