Консультация № 188194
13.11.2015, 21:42
0.00 руб.
0 2 1
Здравствуйте! У меня возникли сложности с таким вопросом:
Вывести несколько строк произвольного текста,содержащие лишь латинские буквы. Каждые 10 секунд заглавные буквы сменяютсястрочными и т. д. Я использую emu8086
Вот программа:
data segment
MESS1 db 'Vvedite stroku:', 0dh,0ah, '$'
MESS2 db '', 0dh,0ah, '$'
STR_max db 80
STR_Fact db ?
STR db 82 dup (?)
OLD_CS dw ?
OLD_IP dw ?
data ends
code segment
assume cs:code, ds:data
START: mov ax, data
mov ds, ax
lea DX, MESS1
mov ah, 09h
int 21h
lea DX, STR_max
mov ah, 0ah
int 21h
lea DX, MESS2
mov ah, 09h
int 21h
xor BP, BP
mov ah, 35h
mov al, 1Ch
int 21h
mov OLD_IP, bx
mov OLD_CS, es
push ds
mov dx, offset NEW_1Ch
mov ax, seg NEW_1Ch
mov ds, ax
mov ah, 25h
mov al, 1Ch
int 21h
pop ds
mov ax, 0B800h
mov es, ax

m3:
cmp BP,182
jl m1

push ax
push bx
push cx
push dx
lea bx, STR
mov cl,STR_Fact
m2:
mov al,[bx]
cmp al,'A'
jl m2_1
cmp al,'Z'
jle m2_lo ;если в деапозоне A-Z
cmp al,'a'
jl m2_1
cmp al,'z'
jg m2_1 ;если в деапозоне a-z
sub byte ptr [bx],20h
jmp m2_1
m2_lo:
add byte ptr [bx],20h
m2_1:
inc bx
loop m2
call CLS
mov AH,02h
mov DX,0
INT 10h
lea DX, MESS1
mov ah, 09h
int 21h
lea DX, STR
xor Bh,Bh
mov Bl,STR_Fact
add bx,dx
mov byte ptr [bx],'$'
mov ah, 09h
int 21h
xor BP,BP
pop dx
pop cx
pop bx
pop ax

m1:
call DELAY
jmp m3
ext:
mov dx, OLD_IP
mov ax, OLD_CS
mov ds, ax
mov ah, 25h
mov al, 1Ch
int 21h

QUIT: mov ax, 4c00h
int 21h

NEW_1Ch proc near
mov di, word ptr 0040h:001ch
cmp di,'0'
je ext
inc BP
iret
NEW_1Ch endp

CLS proc
push AX
push BX
push CX
push DX
mov AH,6
xor AL,AL
mov BH,00000111b
xor CX,CX
mov DH,24d
mov DL,79d
int 10h
pop DX
pop CX
pop BX
pop AX
ret
CLS endp

DELAY proc near
push cx
mov cx, 100
d12: push cx
xor cx,cx
d11: nop
loop d11
pop cx
loop d12
pop cx
ret
DELAY endp

code ends
end START



но у меня пишет в этой строке ошибку: mov di, word ptr 0040h:001ch
помогите исправить и если не сложно, можете везде проставить комментарии, где, что и как происходит...

Обсуждение

давно
Посетитель
399158
228
15.11.2015, 16:25
общий
неужели ниукого нет идей?
давно
Старший Модератор
31795
6196
17.11.2015, 19:20
общий
это ответ
Здравствуйте, Посетитель - 399158!

Смотрите приложение. Комментариев должно быть достаточно. Ввод строки не делал, выводил зарание сформированную строку.
[code h=200]model tiny
.code
org 100h
eTime equ 182;18.2*10
begin: mov ax,3;переходим в текстовый режим
int 10h
mov ah,9;выводим сообщение
lea dx,dbStr;нашу строку
int 21h
mov ax,351Ch;получаем старый обработчик
int 21h
mov word ptr old1C,bx;сохраняем адрес обработчика
mov word ptr old1C+2,es
mov ax,251Ch
lea dx,new1C;ставим свой обработчик
int 21h
@@01: mov ah,1;ждем нажатия клавиши
int 16h
jz @@01;не нажата ждем
xor ax,ax;чистим буфер клавиатуры
int 16h
cmp ah,1;проверяем ESC
jnz @@01;нет переходим
mov ax,251Ch;востанавливает старый обрабтчик
lds dx,cs:old1C
int 21h
ret;выход
dbCount db eTime;константа счетчик
old1C dd ?
;выводимая строка
dbStr db 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm';
szStr equ $-dbStr;
db '$'
new1C: dec cs:dbCount;уменьшаем счетчик
jnz @@03;не ноль переходим
push es;сохраняем используемые регистры
push cx
push di
mov byte ptr cs:dbCount,eTime;устанавливаем новый счетчик
mov cx,0b800h;сегментный адрес видео буфера
mov es,cx
xor di,di;смещение в видео буфера
mov cx,szStr;размер строки
@@02: xor byte ptr es:[di],20h;меняем бит :)
add di,2;следующий символ
loop @@02;в цикле
pop di;востанавливаем используемые регистры
pop cx
pop es
@@03: jmp dword ptr cs:old1C;переходим в старый обработчик
end begin[/code]
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа