.model small .data buf db 8,10 dup(0) ;принимает строку, введенную с клавиатуры segm db 13,10,'Segment(hex): $' off db 13,10,'Disp(hex): $' block db 256 dup(0) ;копия данных из памяти по введенному сегменту и смещению sh db 'C:\temp.txt' strokac db '│ : │',13,10,'$' ;копия форматированной строки, выводимой в файл strlen equ $-strokac ;длина строки, выводимой в файл dno db 'C:\temp.txt' msg1 db 'Again? (Y/N)',13,10,'$' stroka db strlen dup(0) ;формируемая строка, которую записываем в файл s dw 0 ;сегмент o dw 0 ;смещение .stack 256 .code start: mov ax,@data ;Настраиваем сегментные регистры mov ds,ax mov es,ax mlp: lea dx,segm ;Segment(hex): call inputhex ;вводим сегмент mov s,ax ;созраняем его в переменной push ax ;сохраняем его в стеке lea dx,off ;Disp(hex): call inputhex ;вводим смещение mov o,ax ;сохраняем его в переменной mov si,ax ;заносим смещение в si pop ds ;восстанавливаем в ds из стека сегмент lea di,block ;адрес куда копировать область памяти mov cx,128 ;размер копируемого участка 128 слов=256 байт rep movsw ;копируем в область памяти в сегмент данных программы push es ; pop ds ;ds=es mov ah,9 ;функция вывода сообщения на экран lea dx,sh ;шапка блока int 21h ;выводим на экран lea si,block ;арес дампируемого учаска памяти mov bp,16 ;количество выводимых строк lp: push si ;сохраняем si lea di,stroka ;начало строки, которую формиреум для вывода на экран push di ;сохраняем начало lea si,strokac ;начало копии форматируемой строки mov cx,strlen ;длина строки rep movsb ;очищаем строку pop di ;восстанавливаем начало pop si ;восстанавливаем si inc di ;пропускаем рамку mov ax,s ;сегмент call printhex16 ;преобразовываем в текст, в выводимую строку inc di ;пропускаем 1 символ(двоеточие) mov ax,o ;смещение call printhex16 ;преобразовываем в текст, в выводимую строку add di,2 ;пропускае 2 символа(пробелы) mov cx,16 ;количество выводимых в строку байт lp1: lodsb ;берем байт из памяти call printhex ;преобразовываем в текст, в выводимую строку inc di ;пропускаем 1 символ (пробел) loop lp1 ;преобразовываем все 16 байт строки mov ah,9 ;функция вывода сообщения на экран lea dx,stroka ;адрес выводимой строки int 21h ;выводим на экран add o,16 ;увеличиваем смещение на 16 дампированных байт dec bp ;уменьшаем количество оставшихся строк jnz lp ;продолжаем пока не ноль mov ah,9 ;функция вывода сообщения на экран lea dx,dno ;выводимое сообщение int 21h ;выводим на экран ag: mov ah,0 ;Ожидаем нажатия любой клавиши int 16h cmp ah,49 ;нажата N jz ex ;если да - выход cmp ah,21 ;нажата Y jz mlp ;тогда повторяем дамп jmp ag ;иначе опять ждем нажатия ex: mov ax,4c00h ;закончить программу int 21h ;Ввод шестнадцатеричного числа с проверкой ;ds:dx - адрес выводимого сообщения ;На выходе: ax - число inputhex proc mov di,dx ;сохраняем адрес сообщения inputhex1: mov dx,di ;адрес сообщения mov ah,9 ;функция вывода сообщения на экран int 21h ;выводим на экран mov ah,0ah ;функция ввода строки с клавиатуры mov dx,offset buf ;буфер куда вводить int 21h ;пользователь вводит в текстовом виде в buf значение элемента массива mov ch,0 mov cl,buf[1] ;сх - длина введенной строки lea si,buf[2] ;начало введенной строки push si ;сохраняем начало строки push cx ;и ее длину ;проверяем, что это 16-ричная строка ihlp: mov al,[si] ;берем символ cmp al,'0' ;если он меньше символа 0 jc inputhex1 ;выводим сообщение об ошибке cmp al,'9' ;если между 0 и 9 jbe ihm1 ;то идем к следующему cmp al,'A' ;Если символ между 9 и А jc inputhex1 ;выводим сообщение об ошибке cmp al,'F' ;если между A и F jbe ihm1 ;то идем к следующему cmp al,'a' ;Если символ между F и а jc inputhex1 ;выводим сообщение об ошибке cmp al,'f' ;если между a и f jbe ihconvert ;то преобразовываем его в прописной jmp inputhex1 ;иначе выводим сообщение об ошибке ihm1: inc si ;следующий символ строки loop ihlp ;обработать все pop cx ;восстанавливаем размер pop si ;и адрес строки ;преобразовываем строку в ;16-ричное число xor dx,dx ;16-ричное число ihlp2: mov al,[si] ;берем символ cmp al,'9' ;если это цифра jbe ihm5 ;то вычитаем из него только '0' sub al,7 ;а если буква, вычитаем 7 ihm5: sub al,'0' ;и вычитаем '0' shl dx,4 ;сдвинуть резльтат на одну тетраду влево or dl,al ;добавить получившееся число inc si ;следующий символ loop ihlp2 ;преобразовываем всю строку в число mov ax,dx ;помещаем результат в ax ret ;выход из подпрограммы ihconvert: and [si], byte ptr 11011111b ;преобразование строчной буквы в прописную jmp ihm1 ;возвращаемся в цикл inputhex endp printhex proc ;преобразование байта в текстовый вид в строку ;al - байт; ;es:di - адрес куда записывать строку push dx ;сохраняем регистры push ax push ax ;сохраняем значение shr al,4 ;сдвигаем выводимый код на 4 бита вправо add al,'0' ;преобразуем старшую(левую)тетраду в символ cmp al,'9' ;если не это буква A-F jbe @m1 ;то пропускаем add al,7 ;а если буква,то корректируем символ @m1: stosb ;записываем старшую тетраду в строку pop ax ;восстанавливаем значение and al,0fh ;выделяем младшую тетраду add al,'0' ;преобразуем старшую(левую)тетраду в символ cmp al,'9' ;если не это буква A-F jbe @m2 ;то пропускаем add al,7 ;а если буква,то корректируем символ @m2: stosb ;записываем младшую тетраду в строку pop ax ;восстанавливаем регистры pop dx ret ;выход из подпрограммы printhex endp ;Печать 16-разрядного 16-ричного числа ;На входе: AX - число printhex16 proc push ax ;сохранить параметр mov al,ah call printhex ;вывести старшую часть pop ax ;восстановить параметр call printhex ;вывести младшую часть ret ;выход из подпрограммы printhex16 endp end start
Типа мы должны угадать, что подумал преподователь Сколько не глядел на исходник, так и не увидел там чтения из файла. А как писать в файл можно узнать тамже - в Интернете или по сайту поискать. Или иначе сюда : http://wasm.ru/forum/viewtopic.php?id=17088 Хотя на вопрос "ничего не получается" и там не ответят. Тут не детский сад.
вот подправил как из файла считать...подскажите как записать в файл результат чтобы он не на экран выводился,немогу разобраться как записать=(
Выполнить команду открытия на запись и выполнить команду записи. Какие проблемы. В любом учебнике по Дос-ассемблеру это описано. Увы, нету там ни одной команды про файл.
подскажите пожалуйста как считать из файла и записать в другой в файл...не получается эти моменты прикрепить к исходному коду=(
Вот здесь есть всё по MS-DOS: (на английском) http://stanislavs.org/helppc/ А здесь про файлы (начинай по ссылке INT21, 3C): http://stanislavs.org/helppc/int_21.html
не плохие ссылки...есть чего полезного...но все же я незнаю как прикрепить это к исходному коду...подскажите=(
Ничего прикреплять не нужно: нужно уметь программировать. Т.е. знать как в текстовом редакторе в имеющийся текст программы добавить функционал(новые команды) и чтобы она продолжала работать. Никто за тебя это делать тут не будет. Тем более что ты так и не объяснил, что именно надо запрограммировать Ну и для начала надо уметь писать программу с нуля. Необязательно конечно набивать все строчки самому, можно и копипастить, но вот понимать что каждая строчка значит - обязательно. Тогда не будет таких глупых вопросов. От того, что ты "спер" где-то исходники с комментариями - умнее ты не стал. Вот если бы ты понимал их...
если я просто мало знаком с Ассемблером и незнаю как к коду еще добавить функционал и чтобы продолжало работу прога то что я неумею программировать???а запрограмировать надо dump памяти, считать из файла и записать результат в другой файл