Консультация № 188105
15.10.2015, 17:22
0.00 руб.
15.10.2015, 18:36
0 5 1
Здравствуйте! Прошу помощи в следующем вопросе:
В ассемблере решить задачи
Задание:
1. Входные данные записать в файл INPUT.TXT.
Открыть этот файл для чтения, считать из него строку и, выполнив необходимые преобразования,
записать результат в файл OUTPUT.TXT. При решении можно использовать функции и макросы.
2.Данные вводить с клавиатуры. Результат выводить
на экран. При решении использовать макросы.

Задача:
Дана строка и число n. Верно ли, что в ней есть по крайней мере n подряд идущих букв a?

т.е две задачи.

Обсуждение

давно
Старший Модератор
31795
6196
16.10.2015, 10:38
общий
это ответ
Здравствуйте, Попушой Екатерина !

Код второго задания в приложении:
[code h=200]model tiny
maxStr equ 200
;макрос чтения символа с клавиатуры
inpChar macro
xor ax,ax
int 16h
endm
;макрос вывода строки
OutStr macro
mov ah,9
int 21h
endm
;макрос ввода строки
inpStr macro
mov ah,0ah
int 21h
endm
.code
org 100h
begin:
;выводим сообщение о вводе строки
lea dx,dbEnterS
OutStr
;вводим строку
lea dx,dbMax
inpStr
;выводим сообщение о вводе числа
lea dx,dbEnterN
OutStr
;вводим число
xor di,di;сбрасываем введенное число
mov bx,10;система счисления
;читаем один символ с клавиатуры без эхо
@@01: inpChar
cmp al,13;клавиша ENTER
jz @@02;заканчисваем ввод
;проверяем диапазон цифровых клавиш
cmp al,'0'
jl @@01;нет повторяем ввод
cmp al,'9'
ja @@01
int 29h;выводим введенную цифру
and ax,0fh;превращаем символ в число
xchg di,ax;обмениваем с ранее введенным числом
xor dx,dx
mul bx;умножаем на систему счисления
add di,axсуммируем
jmp @@01;повторяем ввод
;готовимся к проверке строк
@@02: lea si,dbStr;устанавливаем индексный регистр
cld;напрвление для строковых команд
mov cl,dbLen;загружаем длину введенной строки
xor ch,ch
xor bx,bx;сбрасываем счетчик
lea dx,dbTrue;пока считаем , что верно
@@03: lodsb;читаем один символ
cmp al,'a';проверяем "а"
jnz @@04;нет, переходим
inc bx;да увеличиваем счетчик
cmp di,bx;проверяем количество
jz @@06;да выходим из цикла
jnz @@05;нет- продолжаем цикл
@@04: xor bx,bx;сбрасываем счетчик
@@05: loop @@03;цикл проверки строки
lea dx,dbFalse;если тут, значит нет нужного количества букв"а"
@@06: OutStr;выводим строку
inpChar;ожидаем ввод и любуемся результатом
ret;выход
dbEnterS db 10,13,'Enter string:$'
dbEnterN db 10,13,'Enter number:$'
dbTrue db 10,13,'True$'
dbFalse db 10,13,'False$'
dbMax db maxStr
dbLen db ?
dbStr db maxStr dup(?)
end begin[/code]
ps:вопросы задавайте в минифоруме.
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
16.10.2015, 12:10
общий
16.10.2015, 12:15
Адресаты:
В ответе код под TASM.
Вариант FASM:
[code h=200]maxStr equ 200
org 100h
;макрос чтения символа с клавиатуры
macro inpChar
{
xor ax,ax
int 16h
}; endm
;макрос вывода строки
macro OutStr
{
mov ah,9
int 21h
}; endm
;макрос ввода строки
macro inpStr
{
mov ah,0ah
int 21h
}; endm
begin:
;выводим сообщение о вводе строки
mov dx,dbEnterS
OutStr
;вводим строку
mov dx,dbMax
inpStr
;выводим сообщение о вводе числа
mov dx,dbEnterN
OutStr
;вводим число
xor di,di;сбрасываем введенное число
mov bx,10;система счисления
;читаем один символ с клавиатуры без эхо
@@01: inpChar
cmp al,13;клавиша ENTER
jz @@02;заканчисваем ввод
;проверяем диапазон цифровых клавиш
cmp al,'0'
jl @@01;нет повторяем ввод
cmp al,'9'
ja @@01
int 29h;выводим введенную цифру
and ax,0fh;превращаем символ в число
xchg di,ax;обмениваем с ранее введенным числом
xor dx,dx
mul bx;умножаем на систему счисления
add di,ax;суммируем
jmp @@01;повторяем ввод
;готовимся к проверке строк
@@02: mov si,dbStr;устанавливаем индексный регистр
cld;напрвление для строковых команд
mov cl,[dbLen];загружаем длину введенной строки
xor ch,ch
xor bx,bx;сбрасываем счетчик
mov dx,dbTrue;пока считаем , что верно
@@03: lodsb;читаем один символ
cmp al,'a';проверяем "а"
jnz @@04;нет, переходим
inc bx;да увеличиваем счетчик
cmp di,bx;проверяем количество
jz @@06;да выходим из цикла
jnz @@05;нет- продолжаем цикл
@@04: xor bx,bx;сбрасываем счетчик
@@05: loop @@03;цикл проверки строки
mov dx,dbFalse;если тут, значит нет нужного количества букв"а"
@@06: OutStr;выводим строку
inpChar;ожидаем ввод и любуемся результатом
ret;выход
dbEnterS db 10,13,'Enter string:$'
dbEnterN db 10,13,'Enter number:$'
dbTrue db 10,13,'True$'
dbFalse db 10,13,'False$'
dbMax db maxStr
dbLen db ?
dbStr db maxStr dup(?)
;[/code]
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
16.10.2015, 12:13
общий
Адресаты:
Посмотрите пост выше.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399023
5
18.10.2015, 16:51
общий
Цитата: Зенченко Константин Николаевич
Я копирую, вставляю в программу, зада не работает. Выдает ошибки.Вообще ничего не понятно по задаче
давно
Старший Модератор
31795
6196
20.10.2015, 09:39
общий
Адресаты:
Только что проверил код, FASM 1.67.14
[code h=200]maxStr equ 200
org 100h
;макрос чтения символа с клавиатуры
macro inpChar
{
xor ax,ax
int 16h
}; endm
;макрос вывода строки
macro OutStr
{
mov ah,9
int 21h
}; endm
;макрос ввода строки
macro inpStr
{
mov ah,0ah
int 21h
}; endm
begin:
;выводим сообщение о вводе строки
mov dx,dbEnterS
OutStr
;вводим строку
mov dx,dbMax
inpStr
;выводим сообщение о вводе числа
mov dx,dbEnterN
OutStr
;вводим число
xor di,di;сбрасываем введенное число
mov bx,10;система счисления
;читаем один символ с клавиатуры без эхо
@@01: inpChar
cmp al,13;клавиша ENTER
jz @@02;заканчисваем ввод
;проверяем диапазон цифровых клавиш
cmp al,'0'
jl @@01;нет повторяем ввод
cmp al,'9'
ja @@01
int 29h;выводим введенную цифру
and ax,0fh;превращаем символ в число
xchg di,ax;обмениваем с ранее введенным числом
xor dx,dx
mul bx;умножаем на систему счисления
add di,ax;суммируем
jmp @@01;повторяем ввод
;готовимся к проверке строк
@@02: mov si,dbStr;устанавливаем индексный регистр
cld;напрвление для строковых команд
mov cl,[dbLen];загружаем длину введенной строки
xor ch,ch
xor bx,bx;сбрасываем счетчик
mov dx,dbTrue;пока считаем , что верно
@@03: lodsb;читаем один символ
cmp al,'a';проверяем "а"
jnz @@04;нет, переходим
inc bx;да увеличиваем счетчик
cmp di,bx;проверяем количество
jz @@06;да выходим из цикла
jnz @@05;нет- продолжаем цикл
@@04: xor bx,bx;сбрасываем счетчик
@@05: loop @@03;цикл проверки строки
mov dx,dbFalse;если тут, значит нет нужного количества букв"а"
@@06: OutStr;выводим строку
inpChar;ожидаем ввод и любуемся результатом
ret;выход
dbEnterS db 10,13,'Enter string:$'
dbEnterN db 10,13,'Enter number:$'
dbTrue db 10,13,'True$'
dbFalse db 10,13,'False$'
dbMax db maxStr
dbLen db ?
dbStr db maxStr dup(?)
;[/code]

Ошибок нет.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа