Консультация № 195928
01.07.2019, 15:10
0.00 руб.
01.07.2019, 15:26
0 2 1
Здравствуйте! Прошу помощи в следующем вопросе:

Я не дружу с Ассемблером, вот вообще не понимаю его. я пытался учить его, но видимо не дано мне. По этому рассчитываю на вашу помощь с этой заданием.
Пожалуйста помогите

есть задание: нужно продублировать согласные буквы слова или текста , но текст считать из файла, а потом записать обратно в файл.

вот код, который просто дублирует согласные буквы:

[code lang=asm].model small

.stack 200h

.data
CrLf db 0Dh, 0Ah, '$'
msgSource db 0Dh, 0Ah, 'The source string:', 0Dh, 0Ah, '$'
msgResult db 0Dh, 0Ah, 'The Result string:', 0Dh, 0Ah, '$'
msgPressAnyKey db 0Dh, 0Ah, 'Press any key to exit...', '$'
Consonants db 'bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ'
Len = $-Consonants
Text db 'Global trade losing momentum as trade tensions persist - WTO'
N = $-Text
.code

main proc
;инициализация сегментного регистра ds адресом сегмента данных
mov ax, @data
mov ds, ax
;вывод исходной строки
mov ah, 09h
lea dx, [msgSource]
int 21h
mov ah, 40h
mov bx, 1
mov cx, N
lea dx, [Text]
int 21h
;вывод результата
mov ah, 09h
lea dx, [msgResult]
int 21h
;обработка строки и вывод результата
lea si, [Text]
mov cx, N
mov ax, ds
mov es, ax
cld
@@for:
lodsb
push cx
int 29h
lea di, [Consonants]
mov cx, Len
repne scasb
jnz @@next
int 29h
@@next:
pop cx
loop @@for

;ожидание нажатия любой клавиши
mov ah, 09h
lea dx, [msgPressAnyKey]
int 21h

mov ah, 00h
int 16h

;завершение программы
mov ax, 4C00h
int 21h
main endp

end main[/code]

Обсуждение

давно
Старший Модератор
31795
6196
05.07.2019, 22:20
общий
05.07.2019, 22:29
Адресаты:
Цитата: Matvey
Я не дружу с Ассемблером, вот вообще не понимаю его. я пытался учить его, но видимо не дано мне.


Внимательно это прочитайте и скажите, что поняли, а что нет.

Тут нужно запомнить простую схему:
  • данные как-то попадают в программу(введены с клавиатуры, прочитаны с файла, прочитаны с сети, уже есть в программе с сегменте данных);
  • с данными, что-то делается(не важно что, тут зависит все, только от Вашей фантазии: +-/*, можно биты менять, можно байты сушить
  • );
  • результат всех Ваших махинаций с даными, где-то сохраняется(выводится на экран, записывается в файл, отправляются куда-то в сеть, просто остаются в памяти).


Это схема ЛЮБОЙ программы, повторяю ЛЮБОЙ, даже ЛЮБОЙ ОСи, т.к. она тоже программа.

Если Вы поняли эту схему, то дальше все просто.

Ввод и вывод происходит с помощью разных функций DOS, и все они - надстройка над работой с портами. Но т.к. Вы начинающий, то "железную" сотавляющую опустим, и перейдем к самой близкой к работе с портами функциям:
[code lang=asm]AH = 40h
BX = file handle
CX = number of bytes to write
DS : DX -> data to write[/code]
или
[code lang=asm]AH = 3Fh
BX = file handle
CX = number of bytes to read
DS : DX -> buffer for data[/code]
Заметили разницу, только номер функции указывает, что делает функция, остальное одинаково.

file handle - это некоторое число, которое указывает на некоторую системную область и указавает ей(DOS) с каким устройством будет работать функция.

DOS - для любой программы открывает 5-ть стандартных каналов(программа-железо)-файлов-устройств-потоков(не важно какое именно название Вам ближе, важно - есть программа, есть "железо" и между ними есть связь, с помощью file handle):

Цитата: см. тут
Стандартные потоки: stdin, stdout, stderr, stdaux, stdprn.

Когда программа начинает выполняться, автоматически открываются пять потоков. Эти потоки — стандартный ввод (stdin), стандартный вывод (stdout), стандартный вывод для сообщений об ошибках (stderr), стандартный последовательный порт (stdaux) и стандартное устройство печати (stdprn).
По умолчанию стандартный ввод/вывод и стандартный вывод сообщений об ошибках связывается с консольным терминалом.


Их нумерация начинается с нуля, т.е. stdin=0, stdout=1, . . . , stdprn=4. Практически все компиляторы понимают stdin, stdout, stderr, stdaux, stdprn, но бывают и "тугодумы", которым нужно пальцем тыкать.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
11.07.2019, 14:08
общий
это ответ
Здравствуйте, Matvey!

Смотрите приложение:
[code lang=asm h=300]model small
.code
begin: mov ax,@data
mov ds,ax
mov es,ax
cld
mov ax,3D42h
lea dx,dbInp
.data
dbInp db '190711i.txt',0
.code
int 21h
mov dwHndl1,ax
.data
dwHndl1 dw -1
.code
jnc @@01
lea dx,dbErr1
.data
dbErr1 db 10,13,'error dont open first file$'
jmp @@07
.code
@@01: mov ah,3Ch
xor cx,cx
lea dx,dbOut
.data
dbOut db '190711o.txt',0
.code
int 21h
mov dwHndl2,ax
.data
dwHndl2 dw -1
.code
jnc @@02
lea dx,dbErr2
jmp @@07
.data
dbErr2 db 10,13,'error dont open second file$'
.code
@@02: mov ah,3Fh
mov bx,dwHndl1
mov cx,1
lea dx,dbBuff
.data
dbBuff db ?
.code
int 21h
or al,al
jz @@06
@@04: lea di,dbCheck
.data
dbCheck db 'bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ'
szCheck equ $-dbCheck
.code
mov cx,szCheck
mov al,dbBuff
repne scasb
jnz @@05
mov ah,40h
mov bx,dwHndl2
mov cx,1
lea dx,dbBuff
int 21h
@@05:
mov ah,40h
mov bx,dwHndl2
mov cx,1
lea dx,dbBuff
int 21h
jmp @@02
@@06: lea dx,dbPress
.data
dbPress db 10,13,'press any key . . .$'
.code
@@07: mov ax,dwHndl1
cmp ax,-1
jz @@08
mov ah,3Eh
int 21h
@@08: mov ax,dwHndl2
cmp ax,-1
jz @@09
mov ah,3Eh
int 21h
@@09: mov ah,9
int 21h
xor ax,ax
int 16h
mov ax,4C00h
int 21h
.stack 200h
end begin[/code]

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

Форма ответа