Консультация # 189124: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Написать программу на ассемблере, для решения данного уравнения Программная реализация на TASM, DOS, формат ехе....Консультация # 189125: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Доброго времени суток, уважаемые эксперты! Мне нужна ваша помощь! Суть задания заключается в следующем: реализовать программу со строками. Слова в строке могут быть разделены пробелами и знаками препинания. Удалить в каждом слове строки повторяющиеся в нем буквы. Помогите, пожалуйста. ...Консультация # 1
89126: Здравствуйте! У меня возникли сложности с таким вопросом: Помогите написать программу на языке ассемблер, для решения уравнения ...
model small
data
a dw 34
b dw 260
c dw 2
d dw 170
e dw 3
f dw 36
g dw 8
h dw 5
i dw 6
j dw 7
dbRes db 10,13,'Result:$'
stack 100h
code
start: mov ax,@data
mov ds,ax;настраиваем сегмент
;получаем знаменатель
mov ax,h;загружаем 5
xor dx,dx;
mul i;умножаем на 6
mov bx,f;загружаем 36
add bx,g;суммируем с 8
shr bx,1;делим на 2
add bx,ax;суммируем (36+8)/2+5*6
;
mov ax,d;загружаем 170
xor dx,dx
mul e;умножаем на 3
mov cx,b;загружаем 260
shr cx,1;делим на 2
add ax,cx;суммируем 170*3+260/2
add ax,a;суммируем 34+170*3+260/2
;
xor dx,dx
div bx;получаем первую дробь
;(34+170*3+260/2)/((36+8)/2+5*6)
push ax;сохраняем в стеке
;
mov ax,i;загружаем 6
add ax,j;суммируем с 7
mov si,a;загружаем 34
shr si,1;делим на 2
xor dx,dx
mul si;получаем второе число
pop bx;востанавливаем первое число
add ax,bx;суммируем
;
mov si,10;система счисления
xor cx,cx;счетчик в стеке
@@01: xor dx,dx
div si;получаем младшую цифру
push dx;запоминаем в стеке
inc cx;считаем
or ax,ax;повторяем пока не ноль в ах
jnz @@01
mov ah,9
lea dx,dbRes
int 21h;выводим сообщение
@@02: pop ax;извлекаем цифру
add al,'0';переводим в символ
int 29h;выводим на экран
loop @@02
xor ax,ax;ожидаем любую клавишу
int 16h
mov ah,4Ch;выход
int 21h
end start
Комментариев достаточно, если что спрашивайте в мини-форуме. Удачи!
Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Доброго времени суток, уважаемые эксперты! Мне нужна ваша помощь! Суть задания заключается в следующем: реализовать программу со строками. Слова в строке могут быть разделены пробелами и знаками препинания. Удалить в каждом слове строки повторяющиеся в нем буквы. Помогите, пожалуйста. Буду очень благодарен за помощь. Добра и позитива!
Здравствуйте, Maxim! Где-то так... Идея такая: 1) ищем слова, состоящие из латинских букв. Все остальное - разделители 2) обнуляем в каждом слове одинаковые буквы 3) сжимаем строку, удаляя из нее нули Комментариев более чем достаточно. Смотрите. С вопросами - в мини-форум
;реализовать программу со строками.
;слова в строке могут быть разделены пробелами и знаками препинания.
;удалить в каждом слове строки повторяющиесЯ в нем буквы.
.model small
.data
;структура для ввода строки по функции 0ah
max db 80 ;максимальная длина строки
len db 0 ;реальная длина введенной строки
string db 80 dup (0) ;сама строка, заканчивается кодом 0dh
sEnter db 'Enter string: $'
sResult db 0dh,0ah,'Result : $'
sAny db 0dh,0ah,'Press any key$'
.code
start:
mov ax, @data ;настроим сегментные регистры
mov ds, ax
mov es, ax
;ввод строки
;введенная строка в структуре max,len,string
call EnterString
;решаем задачу
call DelRepeats
;выводим преобразованную строку
lea dx, sResult ;выведем Result:
mov ah, 9
int 21h
lea dx, string ;строка
mov ah, 9
int 21h
Exit: ;выход
lea dx, sAny
mov ah, 9
int 21h
mov ah, 0 ;подождем нажатия на любую клавишу
int 16h
mov ax, 4c00h
int 21h
EnterString proc ;ввод строки
lea dx, sEnter ;выведем приглашение
mov ah, 9
int 21h
lea dx, max ;вводим строку
mov ah, 0ah
int 21h
ret
EnterString endp
isLetter proc ;проверка на букву
cmp al, 'A' ;считаем, что буквы - только английские!
jb not_letter ; большие и маленькие
cmp al, 'Z'
jbe letter
cmp al, 'a'
jb not_letter
cmp al, 'z'
ja not_letter
letter:
inc bp ;помечаем, что найдена буква очередного слова
stc ;помечаем, что буква
ret
not_letter:
clc ;не буква
ret
isLetter endp
;поиск и обнуление повторяющихся букв в слове
;BX - адрес начала слова
;SI - адрес за словом
isRepeat proc
test bp, bp ;было ли слово?
jne isRepeat_ext_loop
ret ;повтор разделителей, которые не трогаем
isRepeat_ext_loop: ;будем искать все буквы слова с начала слова
; во всех последующих
cmp bx, si ;дошли до конца слова?
jae isRepeat_ret ;на выход
mov al, [bx] ;очередная буква
cmp al, 0 ;уже обнуленную пропускаем
je isRepeat_ext_next
lea di, [bx+1] ;со следующего адреса
isRepeat_int_loop:
cmp di, si ;до конца слова
jae isRepeat_ext_next
cmp al, [di] ;сравниваем
jne isRepeat_int_next
mov byte ptr[bx], 0 ;одинаковые обнуляем!
mov byte ptr[di], 0
isRepeat_int_next:
inc di ;на следующий адрес
jmp isRepeat_int_loop
isRepeat_ext_next:
inc bx ;на адрес следующей буквы, которую будем искать
jmp isRepeat_ext_loop
isRepeat_ret:
xor bp, bp ;сбросим флаг найденного слова
ret
isRepeat endp
DelZeros proc ;сожмем строку, выбросим все нулевые байты
lea si, string ;адрес начала строки
DelZeros_loop:
mov al, [si]
inc si
cmp al, '$'
je DelZeros_ret ;дошли до конца строки
cmp al, 0
jne DelZeros_loop ;ненулевые обходим
mov di, si ;адрес за нулевым байтом
DelZeros_shift_loop: ;сдвигаем строку на одну букву назад
mov al, [di] ;тем самым затираем нуль
mov [di-1], al
inc di
cmp al, '$' ;до конца строки
jne DelZeros_shift_loop
dec si ;на одну букву сдвинули назад, поэтому надо проверить
; символ на позиции бывшего нуля
jmp DelZeros_loop ;на проверку очередного символа
DelZeros_ret:
ret
DelZeros endp
DelRepeats proc ;удаление букв, которые повторяются в словах
lea si, string ;адрес начала строки
xor bx, bx ;вставим в конец строки символ '$' (для функции 9)
mov bl, len ;длина строки
mov [bx+si], byte ptr '$'
xor bp, bp ;флаг отсутствия слова
words_loop: ;цикл по словам
mov bx, si ;запоминаем начало слова
word_loop: ;поиск слова
mov al, [si]
inc si
cmp al, '$' ;дошли до конца
je DelRepeat_ret
call isLetter ;буква?
jc word_loop ;да - ищем небукву
;нет - конец слова
dec si ;si - адрес за разделителем, уменьшим на 1
; чтобы был адрес за словом
call isRepeat ;обнуляем повторы букв в слове (если они есть)
inc si ;адрес - за первым разделителем
jmp words_loop ;на поиск следующего слова
DelRepeat_ret: ;в конце надо еще проверить на наличие слова перед '$'
dec si
call isRepeat ;проверяем последнее слово
call DelZeros ;удаляем нулевые байты в строке
ret
DelRepeats endp
end start ;точка входа
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 08.04.2016, 16:29
5
нет комментария ----- Дата оценки: 08.04.2016, 19:39
model small
data
a dw 123
b dw 4
c dw 6
d dw 3
e dw 5
f dw 36
g dw 34
dbRes db 10,13,'Result:$'
stack 100h
code
start: mov ax,@data
mov ds,ax;настраиваем сегмент
;считаем числитель дроби числителя
mov ax,a;
sub ax,b;
xor dx,dx
mul b;(123-4)*4
push ax
mov ax,c;
sub ax,d;
xor dx,dx;
mul e;(6-3)*5
pop bx
add bx,ax;
;считаем знаменатель дроби числителя
mov ax,b
xor dx,dx
mul e;5*4
xchg ax,bx
xor dx,dx
div bx;((123-4)*4+(6-3)*5)/(5*4)
mov bx,ax
;считаем знаменатель
mov ax,b;
xor dx,dx;
mul d;4*3
add ax,f;36+4*3
xchg bx,ax;
div bx;((123-4)*4+(6-3)*5)/(5*4))/(36+4*3)
sub ax,g;((123-4)*4+(6-3)*5)/(5*4))/(36+4*3)-34
;
xor di,di
test ax,8000h
jz @@00
mov di,1
not ax
inc ax
@@00: mov si,10;система счисления
xor cx,cx;счетчик в стеке
@@01: xor dx,dx
div si;получаем младшую цифру
push dx;запоминаем в стеке
inc cx;считаем
or ax,ax;повторяем пока не ноль в ах
jnz @@01
mov ah,9
lea dx,dbRes
int 21h;выводим сообщение
or di,di
jz @@02
mov al,'-'
int 29h
@@02: pop ax;извлекаем цифру
add al,'0';переводим в символ
int 29h;выводим на экран
loop @@02
xor ax,ax;ожидаем любую клавишу
int 16h
mov ah,4Ch;выход
int 21h
end start
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!