Ввод и сортировка строки - Assembler
Формулировка задачи:
Добрый день, необходимо обработать строку таким образом: первую треть строки по алфавитному порядку, вторую - по обратному алфавитному и последнюю - каждый символ предыдущим. Как реализовать перевод в ASCII и как можно сравнить два символа?
StrWork proc mov dx, offset text2 call WrStr lea dx, string mov ah, 0ah int 21h xor bx, bx xor dx, dx lea si, string strloop:lodsb cmp al, 0dh je strend inc cl jmp strloop strend: mov ax, cl mov bl, 3 div bl xor bl, bl str1: inc bl cmp bl, al jl str1 push cl sub cl, al mov al, cl pop cl str2: inc bl cmp bl, al jl str2 str3: inc bl cmp bl, cl jl str3 StrWork endp
StrWork proc mov dx, offset text2 call WrStr lea dx, string mov ah, 0ah int 21h xor cl, cl xor bx, bx xor dx, dx lea si, string strloop:lodsb cmp al, 0dh je strend inc cl jmp strloop strend: mov al, cl cbw mov bl, 3 div bl xor bl, bl str1: push al lodsb sub al, '0' cmp al, inc bl pop al cmp bl, al jl str1 push cl sub cl, al mov al, cl pop cl str2: push al lodsb sub al, '0' inc bl pop al cmp bl, ax jl str2 str3: lodsb sub al, '0' sub al, 1 add al, '0' inc bl cmp bl, cl jl str3 StrWork endp
StrWork proc mov dx, offset text2 call WrStr lea dx, string mov ah, 0ah int 21h xor cx, cx xor bx, bx xor dx, dx lea si, string strloop:lodsb cmp al, 0dh je strend inc dl jmp strloop strend: mov al, dl cbw mov cx, ax mov bl, 3 div bl xor bh, bh xor bl, bl mnloop: str1: push al lodsb sub al, '0' mov bl, al lodsb cmp al, bl jl pop al inc bh cmp bh, al jl str1 push cl sub cl, al mov al, dl pop cl str2: push al lodsb sub al, '0' inc bh pop al cmp bl, ax jl str2 str3: lodsb sub al, '0' sub al, 1 add al, '0' inc bh cmp bh, cx jl str3 loop mnloop StrWork endp
StrWork proc mov dx, offset text2 call WrStr push cx dx call Read_Keys pop dx cx strloop:lodsb cmp al, 0dh je strend inc dl jmp strloop strend: mov al, dl cbw mov cx, ax mov bx, 3 div bx mnloop: xor bx, bx str1: push ax lodsw sub ax, '0' mov bx, ax lodsb cmp ax, bx jl strel1 push cx mov cx, ax mov ax, bx stosb mov ax, cx stosb pop cx strel1: pop ax inc bx cmp bx, ax jl str1 push cx sub cx, ax mov ax, dx pop cx str2: push ax lodsb sub ax, '0' mov bx, ax lodsb cmp ax, bx jg strel2 push cx mov cx, ax mov ax, bx stosb mov ax, cx stosb pop cx strel2: inc bx pop ax cmp bx, ax jl str2 str3: lodsb sub ax, '0' sub ax, 1 add ax, '0' stosb inc bx cmp bx, dx jl str3 loop mnloop mov dx, offset string call WrStr ret StrWork endp
StrWork proc mov dx, offset text2 call WrStr call Read_Keys strend: mov al, cl cbw mov cx, ax mov bx, 3 div bx mnloop: xor bx, bx str1: push ax lodsw sub ax, '0' mov bx, ax lodsw cmp ax, bx jl strel1 push cx mov cx, ax mov ax, bx stosw mov ax, cx stosw pop cx strel1: pop ax inc bx cmp bx, ax jl str1 push cx sub cx, ax mov ax, dx pop cx str2: push ax lodsw sub ax, '0' mov bx, ax lodsw cmp ax, bx jg strel2 push cx mov cx, ax mov ax, bx stosw mov ax, cx stosw pop cx strel2: inc bx pop ax cmp bx, ax jl str2 str3: lodsw sub ax, '0' sub ax, 1 add ax, '0' stosw inc bx cmp bx, dx jl str3 loop mnloop mov dx, offset string call WrStr ret StrWork endp
StrWork proc push ax bx cx dx si mov dx, offset text2 call WrStr call Read_Keys lea dx, string+2 xor cx, cx mov cl, string+1 mov al, cl cbw mov cx, ax mov bl, 3 div bl mov dl, al xor bl, bl mov dh, cl mov ah, dl strlp: push cx stlp: lodsb mov bh, al lodsb sub al, '0' sub bh, '0' cmp al, bh jg strels1 mov ch, al mov al, bh add al, '0' stosb mov al, ch add al, '0' stosb strels1:inc bl cmp bl, dl jl stlp mov dl, dh sub dl, ah stlp1: lodsb mov bh, al lodsb sub al, '0' sub bh, '0' cmp al, bh jg strels2 mov ch, al mov al, bh add al, '0' stosb mov al, ch add al, '0' stosb strels2:inc bl cmp bl, dl jl stlp1 stlp2: lodsb sub al, '0' sub al, 1 add al, '0' stosb inc bl cmp bl, dl jl stlp2 inc bl cmp bl, cl pop cx loop strlp mov ah, 40h mov dx, 2 int 21h call Read_Key pop si dx cx bx ax ret StrWork endp
Решение задачи: «Ввод и сортировка строки»
textual
Листинг программы
LOCALS @@ sseg segment stack 'stack' db 512 dup(?) sseg ends ;--------- Поля даних ----- dseg segment 'data' CRLF db 13, 10, '$' string db 0, 100 dup (?) keybuf db 102, ?, 100 dup (?) arr dw 20 dup(1) n=$-arr textmenu db 13, 10, 10 db ' ------------------------------------------------------------¬',13,10 db ' ¦ M E N U ¦',13,10 db ' +-----------------------------------------------------------+',13,10 db ' ¦ 1 - Put the sentence to work over it. ¦',13,10 db ' ¦ 2 - Fullfil an array (Between 0 and 20) ¦',13,10 db ' ¦ 0 - Exit. ¦',13,10 db ' L------------------------------------------------------------',13,10,10 db ' Your choice ? =>','$' text0 db 'The amount of negative elements in array is $' text1 db 'Enter the values of the elements: $' text2 db 'Put the sentence: ','$' text3 db 'The new sentence is: ','$' text4 db 'Enter amount of elements: $' errstr db 'Wrong number. Please, enter right value: $' buffer db 7, 8 dup(0) dseg ends ;---- Текст програми --- cseg segment 'code' assume cs:cseg, ds:dseg, ss:sseg start proc far mov ax, dseg mov ds, ax mov dx, 0018h m: call ClrScr call SetCur call Menu cmp dl, '1' je m1 cmp dl, '2' je m2 cmp dl, '0' jne m jmp endprog m1: call StrWork jmp m m2: call FillArr jmp m endprog: call ClrScr call SetCur mov ax, 4C00h int 21h start endp ;------------------------- Menu proc mov dx, offset textmenu call WrStr mov ah, 7 sign0: int 21h cmp al, '0' JL sign1 cmp al, '2' JG sign0 sign1: mov dl, al mov ah, 2 int 21h call NewLine call NewLine ret Menu endp ;------------------------- StrWork proc push ax bx cx dx ds es si di call ReadString call NewLine mov ah, 9 lea dx, String+1 int 21h call NewLine ;сортируем первую треть строки по возрастанию mov al, String ;находим длину массива mov ah, 0 mov cl, 3 div cl mov cl, al lea si, String+1 ;берём адрес массива call SortIncrease ;сортируем ;сортируем вторую треть массива по убыванию add si, cx call SortDecrease ;заключительную треть - заменить предыдущим символом add si, cx mov ax, cx mov cl, String+0 mov ch, 0 sub cx, ax sub cx, ax call PrevChars ;вывод результата mov ah, 9 lea dx, String+1 int 21h call NewLine ;ожидание нажатия call Read_Key pop di si es ds dx cx bx ax ret StrWork endp ;------------------------- FillArr proc push ax bx cx dx si di mov dx, offset text4 call WrStr push bx cx dx di call ReadNum pop di dx cx bx cmp ax, 0 jl mend cmp ax, 20 jg mend lea bx, [arr] mov cx, ax xor si, si push ax elm: mov dx, offset text1 call WrStr push bx cx dx si call ReadNum pop si dx cx bx mov [bx+si], ax add si, 2 call NewLine loop elm pop ax mov cx, ax call ClrScr mov dx, offset text0 call WrStr xor si, si mov ax, 0 mloop: cmp word ptr [bx+si], 0 jnle melse inc ax melse: add si, 2 loop mloop call Outpt call Read_Key pop di si dx cx bx ax mend: ret FillArr endp ;------------------------- Outpt proc xor cx, cx mov bx, 10 ot2: xor dx, dx div bx push dx inc cx test ax, ax jnz ot2 mov ah, 02h ot3: pop dx add dl, '0' int 21h loop ot3 Outpt endp ;------------------------- ;Чтение строки из консоли (с клавиатуры) ;Результат сохраняется в переменной String ;в формате: ;String+0 - размер строки ;String+1 - первый символ строки ReadString proc ;сохранение регистров push ax push cx push dx push si push di push ds push es pushf ;чтение строки в буфер ввода KeyBuf mov ah, 0Ah lea dx, KeyBuf int 21h ;копирование строки из буфера ввода mov ax, dseg mov ds, ax mov es, ax cld lea si, KeyBuf+1 lea di, String+0 mov cl, KeyBuf+1 mov ch, 0 mov String, cl inc cx ;т.к. копируется не только строка, но и байт длины строки rep movsb ;добавление в конец строки символа "конец строки" для вывода на экран mov al, '$' stosb ;восстановление регистров popf pop es pop ds pop di pop si pop dx pop cx pop ax ret ReadString endp ;------------------------- ;Сортировка по возрастанию ;si - адрес 0-го байта ;cx - количество SortIncrease proc push ax push cx push di push si mov di, si mov bx, cx dec bx @@ForI: mov cx, bx mov si, di inc si @@ForJ: mov al, [si] cmp al, [si-1] ja @@SkipExchange xchg al, [si-1] xchg al, [si] @@SkipExchange: inc si loop @@ForJ dec bx mov cx, bx jnz @@ForI pop si pop di pop cx pop ax ret SortIncrease endp ;------------------------- ;Сортировка по убыванию ;si - адрес 0-го байта ;cx - количество SortDecrease proc push ax push cx push di push si mov di, si mov bx, cx dec bx @@ForI: mov cx, bx mov si, di inc si @@ForJ: mov al, [si] cmp al, [si-1] jb @@SkipExchange xchg al, [si-1] xchg al, [si] @@SkipExchange: inc si loop @@ForJ dec bx mov cx, bx jnz @@ForI pop si pop di pop cx pop ax ret SortDecrease endp ;------------------------- PrevChars proc @@ForI: dec byte ptr [si] inc si loop @@ForI ret PrevChars endp ;------------------------- Read_Key proc push ax mov ah, 7 int 21h pop ax ret Read_Key endp ;------------------------- ClrScr proc push ax bx cx dx mov ax, 0600h mov bh, 07h mov cx, 0000h mov dx, 184fh int 10h pop dx cx bx ax ret ClrScr endp ;------------------------- ReadNum proc mov ah, 0ah xor di, di mov dx, offset buffer int 21h mov dl, 0ah mov ah, 02 int 21h mov si, offset buffer+2 cmp byte ptr [si], "-" jnz ii1 mov di, 1 inc si ii1: xor ax, ax mov bx, 10 ii2: mov cl, [si] cmp cl, 0dh jz endin cmp cl, '0' jl error cmp cl, '9' ja error sub cl, '0' mul bx add ax, cx inc si jmp ii2 error: mov dx, offset errstr call WrStr int 20h endin: cmp di, 1 jnz ii3 neg ax ii3: ret ReadNum endp ;------------------------- SetCur proc push ax bx mov ah, 02h mov bh, 00h int 10h pop bx ax ret SetCur endp ;------------------------- NewLine proc push dx mov dx, offset CRLF call WrStr pop dx ret NewLine endp ;------------------------- WrStr proc near mov ah,09h int 21h ret WrStr endp ; *********************** cseg ends end start
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д