|
|
| Посл.отвђт | Сообщен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 |