Здравствуйте всем. Написал программу сортировки массива слов без знака...нужно было оформить макрокомандой. Код (Text): NAME SORT LENGTHMAS1=0 LENGTHMAS2=0 DATA SEGMENT MAS1 DW 3,4,2,5,1,8,6,2,11,9,0daeh ENDMAS1 LABEL WORD LENGTHMAS1 = (offset ENDMAS1 - offset MAS1)/type MAS1 MAS2 DW 3,1,12,2,7,3,8,2,5,1 ENDMAS2 LABEL WORD LENGTHMAS2 = (offset ENDMAS2 - offset MAS2)/type MAS2 tmp DW 0 I DW 0 J DW 0 FL DW 0 DATA ENDS STACK SEGMENT STACK DW 16 DUP(?) STKTOP LABEL WORD STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK SORTMAS MACRO MAS,maslen LOCAL internal,exchange,lesser,cycl_j,sorten mov CX,maslen-1 mov FL,0 mov i,0 ;инициализация i ;внутренний цикл по j internal: mov j,CX ;инициализация j mov FL,0 jmp cycl_j ;переход на тело цикла exchange: mov bx,i ;bx=i shl bx,1 mov ax,mas[bx] ;ax=mas[i] mov bx,j ;bx=j shl bx,1 cmp ax,mas[bx] ;mas[i] ? mas[j] — сравнение элементов jle lesser ;если mas[i] меньше, то обмен не нужен и ;переход на продвижение далее по массиву ;иначе tmp=mas[i], mas[i]=mas[j], mas[j]=tmp: ;tmp=mas[i] mov bx,i ;bx=i shl bx,1 ;умножаем на 2, так как элементы — слова mov tmp,ax ;tmp=mas[i] ;mas[i]=mas[j] mov FL,2 mov bx,j ;bx=j shl bx,1 ;умножаем на 2, так как элементы — слова mov ax,mas[bx] ;ax=mas[j] mov bx,i ;bx=i shl bx,1 ;умножаем на 2, так как элементы — слова mov mas[bx],ax ;mas[i]=mas[j] ;mas[j]=tmp mov bx,j ;bx=j shl bx,1 ;умножаем на 2, так как элементы — слова mov ax,tmp ;ax=tmp mov mas[bx],ax ;mas[j]=tmp lesser: ;продвижение далее по массиву во внутреннем цикле dec j ;j-- ;тело цикла по j cycl_j: mov ax,j ;ax=j cmp ax,i ;сравнить j ? i jg exchange ;если j>i, то переход на обмен cmp FL,1 ;FL<1 то выход из обработки jl sorten ;иначе на внешний цикл по i inc i ;i++ cmp i,CX ;сравнить i ? n — прошли до конца массива jl internal sorten: nop ENDM START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX LEA SP,STKTOP SORTMAS MAS1,LENGTHMAS1 SORTMAS MAS2,LENGTHMAS2 CODE ENDS END START Теперь нужно сделать для этой программы интерфейс по минимуму:вывод формулировки задачи, ввод массива СЛОВ,проверка на правильность ввода(при не корректном вводе выводиться соответствующее сообщение) и вывод результата. Заранее спасибо.
Clear_Energy это DOS'овский сорец. Есть 3 метода, вывода информации: 1. Через прерывания самой DOS. 2. Через прерывания BIOS. 3. Прямая запись в видеопамять (самый быстрый метод). Есть 3 метода, получения информации с клавиатуры: 1. Через прерывания DOS. 2. Через прерывания BIOS. 3. Через прямую работу с портами ввода/вывода (самый быстрый метод).
Средства DOS: Вывод на экран в текстовом режиме: Функция DOS 02h и 06h: Вывод символа Вход: ah - 06h dl - ASCII-код символа (кроме 0FFh) Код (Text): mov ah, 02h mov dl, 'A' int 21h Функция DOS 09h: Вывод строки заканчивающейся символом $(24h) Вход: ah - 09h ds:dx - адрес строки. Код (Text): mov ah, 09h mov dx, offset mystr ; ds указывает на начало data секции. int 21h Ввод с клавиатуры: Функция DOS 0Ah: Считать строки символов из STDIN в буфер Вход: ah - 0Ah ds:dx - адрес буфера Код (Text): mov ah, 0Ah mov dx, offset mybuff int 21h
Я не могу понять как мне ввести/вывести массив слов ...объясните пожалуйста...эти функции в Абеле читал но так ничего и не получилось...
winnix так вы имеете ввиду как представить числовое значение ввиде ASCII-символов? Если так, то ищите на форуме, здесь публиковалась процедура. Или взгляните на штатный сорец из пакета masm32, вроде wtoa называется.
да что то в этом роде...Я не знаю как записать символы правильно...напишите пример ввода одного символа (слова) и вывода его на экран...дос прерыванием..а дальше по примеру попробую разобраться... Заранее спасибо.
winnix вот сорцы из masm32. двоичное представление в ASCII-строку: Код (Text): dwtoa proc dwValue:DWORD, lpBuffer:DWORD ; ------------------------------------------------------------- ; convert DWORD to ascii string ; dwValue is value to be converted ; lpBuffer is the address of the receiving buffer ; EXAMPLE: ; invoke dwtoa,edx,ADDR buffer ; ; Uses: eax, ecx, edx. ; ------------------------------------------------------------- push ebx push esi push edi mov eax, dwValue mov edi, [lpBuffer] or eax,eax jnz sign zero: mov word ptr [edi],30h jmp dw2asc sign: jns pos mov byte ptr [edi],'-' neg eax inc edi pos: mov ecx,429496730 mov esi, edi .while (eax > 0) mov ebx,eax mul ecx mov eax,edx lea edx,[edx*4+edx] add edx,edx sub ebx,edx add bl,'0' mov [edi],bl inc edi .endw mov byte ptr [edi], 0 ; terminate the string ; We now have all the digits, but in reverse order. .while (esi < edi) dec edi mov al, [esi] mov ah, [edi] mov [edi], al mov [esi], ah inc esi .endw dw2asc: pop edi pop esi pop ebx ret dwtoa endp ASCII-строку в двоичное представление: Код (Text): atodw proc String:DWORD ; ---------------------------------------- ; Convert decimal string into dword value ; return value in eax ; ---------------------------------------- push esi push edi xor eax, eax mov esi, [String] xor ecx, ecx xor edx, edx mov al, [esi] inc esi cmp al, 2D jne proceed mov al, byte ptr [esi] not edx inc esi jmp proceed @@: sub al, 30h lea ecx, dword ptr [ecx+4*ecx] lea ecx, dword ptr [eax+2*ecx] mov al, byte ptr [esi] inc esi proceed: or al, al jne @B lea eax, dword ptr [edx+ecx] xor eax, edx pop edi pop esi ret atodw endp
Написал ввод,вывод что то не работает...В досе выводит 2 строки неизвестных символов и все.виснет.Данные записываю в массив слов.что то не работает даже вывод вводимого одного числа.. ввод и вывод делал так Код (Text): MOV AH,0AH ;Запрос функции ввода LEA DX,NAMEPAR ;Загрузить адреса списка параметров INT 21H ;Вызвать DOS MOV AH,09 ;Запрос вывода на экран LEA DX,NAMEFLD ;Загрузка адреса сообщ. INT 21H ;Вызов DOS вообще не могу разобраться как тут все... А как проверку быструю сделать что число(слово) является числом а не набором символов?
winnix с таким ником а DOSом занимаешся ) надеюсь адрес в NAMEFLD это адрес NAMEPAR + 2? а кто завершающий символ "$" в выводимую строку добавлять будет?
А что с ником нетак?=))так учусь...заставляют... Вот так вот сделано Код (Text): NAMEPAR LABEL BYTE ;Список параметров: MAXLEN DB 20 ; Максимальная длина ACTLEN DB ? ; Реальная длина NAMEFLD DB 20 DUP (' '),'$' если не работает значит сделано что то не верно...
это для байт ...для слов не знаю как вводить слова или записывать нужно в слова...не могу разобраться...Лучше объясните для слов...пожалуйста
winnix попробуй заменить LEA DX, ... на mov dx, offset ... хотя странно, вроде всё правильно написано (запускать код под дос лень , сегментный регистр ds надеюсь правильно настроен? И это не для байт, а для символов вводимых с клавиатуры, эти символы могут быть цифрами и должны корректно вводится/выводиться, но это не числа которые можно складывать, умножать и т.п. )
так mov dx, offset... это тоже самое что и lea dx,...нужно что нить еще поделать...говорят не очень сложно сделать...а вот что то не получается...будем разбираться)