Консультация № 108867
10.11.2007, 23:31
30.00 руб.
0 0 0
Здраствуйте Уважаемые эксперты
Помогите пожалуйтса решить задачу:
Написать программу, которая выполняет OR операцию двум восьметиричным числам любой длинны, которые хранятся в файлах,
результат записать в другой файл. Все данные программе передаются через параметры, к примеру: or.exe data1.txt data2.txt rezultat.txt
Я пробовал зделать это сам, мой код в приложении, но он некоректно работает, компилирую тасм‘ом думаю это тоже важно, поправте если нитак.
Заранее Спасибо.

Приложение:
.model smallbufDydis EQU 10 ;константа, ровне размеру буфера чтения и записи файлов.stack 100h.datadata1 db 20h dup(0)data2 db 20h dup(0)rez db 20h dup(0)Buffer1 db 100h dup(0) doler db ‘$‘ Buffer2 db 100h dup(0) rezult db 100h dup (0) hnfile1 dw ?hnfile2 dw ?hnfile3 dw ?kiek dw ?help db ‘help‘,13,10, ‘$‘;---------------------------------------------------------------------------------------------------.code TikrinkParam PROC ;начало процедуры чтения параметров MOV bx, 0081h xor cx,cx ;обнуляем cx inc bx ;увеличиваем bx чтобы первый прочтённый символ небыл пробелом ;--------------------------------------------------------------------------------------------------- ieskok: ; чтение первого параметра xor ax,ax ;обнуляем ax MOV ax, es:[bx] ;в ax записуем первый символ параметра CMP ah, 0Dh ;проверяем или это символ конца JE galas ;если да, то переходим в конец push bx ;сохраняем bx в стек lea dx, data1 ;в dx записуем адрес переменной data1 mov bx,dx add bx,cx ;к bx добавляем cx, для того чтобы читать следущий символ параметра cmp ah, 20h ;проверяем или этот символ пробел JE antras ;если да, то переходим к чтению следущего параметра cmp ah, 00h ;проверяем или вобще был введён параметр je err1 ;если нет, печатаем сообщение mov [bx], ax ;ax значение записуем по адресу [bx] inc cx ;увеличиваем cx pop bx ;вынимаем bx с стека INC bx ;увеличиваем bx JMP ieskok ;прыжок на начало цикла;---------------------------------------------------------------------------------------------------- antras: ;чтение второго параметра pop bx ;вынимаем bx из стека xor cx,cx ; обнуляем cx add bx,2 ;добавляем к bx 2, чтобы пропустить пробул между первым и вторым параметрами do1: xor ax,ax ;обнуляем ax MOV ax, es:[bx] ;дальше всё также как при чтении 1 параметра CMP ah, 0Dh JE galas cmp ah, 00h je err1 push bx lea dx, data2 mov bx,dx add bx,cx cmp ah, 20h JE trecias mov [bx], ax inc cx pop bx INC bx JMP do1 ;------------------------------------------------------------------------------------------------- trecias: ;чтение 3 параметра pop bx xor cx,cx add bx,2 do2: xor ax,ax MOV ax, es:[bx] CMP ah, 0Dh JE galas cmp ah, 00h je err1 push bx lea dx, rez mov bx,dx add bx,cx mov [bx], ax inc cx pop bx INC bx JMP do2 galas: RET ;прыжок к основному коду err1: mov dx, offset help ;печатаем сообщение Call Spausdink jmp exit ;выход в досTikrinkParam ENDP start: mov ax, @Data mov ds, ax ; в ds вставляем адрес начала дата сегмента call TikrinkParam ;вызываем процедуру чтения параметров;------------------------------------------------------------------------------------ MOV dx, offset data1 ;место где хранится название файла call SkaitykByla JC Error1 ;обработка ошибки MOV word ptr hnfile1, ax ;сохраняем дескриптор файла ;----------------------------------------------------------------------------------------- MOV dx, offset data2 ; call SkaitykByla JC Error ; MOV word ptr hnfile2, ax ; ;---------------------------------------------------------------------------------------------------------Sukurti: ;создаём файл xor cx,cx ;без аттрибутов xor ax,ax ;обнуляем ax mov ah, 3Ch mov dx, offset rez ;имя файла int 21h jc Error ;ошибка mov hnfile3,ax ;сохраняем дескриптор созданного файла ;------------------------------------------------------------------------------------------------------------skaityk: MOV ah, 3Fh MOV bx, word ptr hnfile1 MOV cl, bufDydis MOV ch, 0 MOV dx, offset Buffer1 INT 21h ;чтение файла JC Error ;ошибка CMP ax, 0 ;в ах хранится количество считанных байтов JE uzdarytiRasymui mov bx,dx call change MOV ah, 3Fh MOV bx, word ptr hnfile2 MOV cl, bufDydis MOV ch, 0 MOV dx, offset Buffer2 INT 21h JC Error CMP ax, 0 push ax JE uzdarytiRasymui mov bx,dx call changeinitialize: ;ruosiames darbui ;xor cx,cx ;xor bx,bx ;xor dx,dx mov si, offset buffer1 push si mov cx, offset buffer2 mov dx,offset rezult xor bx,bxdo_or: ;pacio OR realizacija ??? cmp al, ‘$‘ ;проверяем или недошли до конца числа jz make_ASCII ;если да, то прыгаем на другое место pop si ;достаём si mov ah, ds:[si] ; в ax записуем то что находится по [si] адресу inc si ;увеличиваем bx, чтобы перейти к следуйщей цифре push si ;сохраняем bx в стек mov si,cx ; в si записываем cx inc cx ;увеличиваем cx, т.е. переходим к следущей цифре в другом файле данных mov al, ds:[si] ;в al записуем то что есть по адресу [si] or al,ah ; OR mov si,dx ;в bx записуем dx mov ds:[si],al ;записуем по [si] адресу al значение inc dx ;увеличиваем dx, т.е. переходим на следущую позицию в файле результата inc bx jmp do_or error1: ;длинный прыжокjmp error make_ASCII: dec bx ;уменьшаем bx, чтобы невзялись переделывать символ ‘$‘ mov kiek, bx ;аписуем сколько символов обработали mov bx, offset rezult push bx ;с просто цифр делаем ASCII коды ciklas: mov al, [bx] cmp al, ‘$‘ ;проверяем не конец ли это jz SaveToFile add al, 30h ;добавляем 30h mov [bx], al ;записуем новое значение inc bx ;идём к следующему символу jmp ciklasChange PROC ;процедура заменяет ASCII коды на просто цифры Keep: mov al, [bx] cmp al, 00h jz doleri sub al, 30h mov [bx],al inc bx jmp keep doleri: mov [bx], ‘$‘ ;добавляем доллор к концу retChange ENDP SaveToFile: xor cx,cx MOV cx, kiek ;cx - сколько записать MOV ah, 40h MOV bx, word ptr hnfile3 ;дескриптор MOV dx, offset rezult ;откуда пишем в файл INT 21h JC Error CMP cx, bufDydis ;если работали с полным буфером cx=10 значит еще можно читать JE skaityk идём дальше читать uzdarytiRasymui: MOV ah, 3Eh MOV bx, word ptr hnfile3 INT 21h ;закрытие файла JC Error uzdarytiSkaitymui: MOV ah, 3Eh MOV bx, word ptr hnfile1 INT 21h JC Error MOV ah, 3Eh MOV bx, word ptr hnfile2 INT 21h JC Error exit: Call ExitProgaError: mov dx, offset help ;spausdinam pranesima Call Spausdink ;spausdinimo proceduros iskvietimas Spausdink PROC mov ah, 9 int 21h retSpausdink ENDP;atidaryti byla skaitymuiSkaitykByla PROC mov ah, 3Dh mov al, 0 int 21h retSkaitykByla ENDP;uzdaryti bylaUzdarykByla PROC mov ah, 3eh int 21h retUzdarykByla ENDP;isejimas is programosExitProga PROC mov ah, 04Ch mov al, 0h int 21hExitProga ENDPend start

Обсуждение

Форма ответа