Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2023, 18:22   #1
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
Радость ассемблер Отсортировать символы в строке по значению ASCII кода символа.

Отсортировать символы в строке по значению ASCII кода символа.
Выделить буфер для хранения 200 символов.
Строку символов ввести с клавиатуры, при этом ввод строки символов
может быть завершен клавишей Enter или по заполнению буфера полностью.

Дополнительный буфер для хранения промежуточных результатов об-
работки строки в памяти не выделять.

При использовании констант задавать их с помощью директивы EQU.
Старт программы, ввод-вывод данных и обработку ошибок оформлять
выводом в консоль поясняющих строк.

Помогите что заработало не могу понять, что не так поправьте код
сам код:
Код:
locals
DOSSEG
.model small
.stack 100h
.data
;длина строки
len    db 200
;резервный байт (для чтения)
res db 0
;сама строка
string  db 200 dup('$')
;строка 'number' с '$' на конце - определяет конец строки
number    db 'number$'
.code
;процедура сдвига строки на 6 байтов вправа (для того чтобы вставить на жто место 'number')
;в si - адрес строки с нужного места
shift    proc    near
cld
mov        di, si
xor        cx, cx
@@1:
mov        bl, byte ptr [si]
cmp        bl, '$'
je        @@2
inc        cx
inc        si
jmp        @@1
@@2:
inc        cx
mov        di, si
add        di, 6
@@3:
mov        bl, byte ptr [si]
mov        byte ptr [di], bl
dec        si
dec        di
loop    @@3
ret
shift    endp
;процедура копирования 'number' в строку
;в di - адрес строки с нужного места
copy    proc near
cld
lea        si, number
mov        cx, 6
rep        movsb
ret
copy    endp
;поиск числа
;в si - адрес строки с нужного места
find    proc near
mov        di, si
mov        bl, 1
@@start:
mov        ah, byte ptr[si]
cmp        ah, 13
je        @@4
cmp        ah, ' '
je        @@1
jmp        @@3
@@1:
cmp        bl, 1
je        @@2
mov        bl, 1
inc        si
mov        di, si
jmp        @@3
@@2:
mov        ax, di 
ret
@@4:
cmp        bl, 1
je        @@2
mov        ax, 0
ret
@@3:
mov        ah, byte ptr[si]
cmp        ah, '0'
jl        @@5
cmp        ah, '9'
jg        @@5
inc        si
jmp        @@start
@@5:
mov        bl, 0
inc        si
jmp        @@start
find    endp
;переход на новую линию
newline    proc    near
mov        dl,10
mov        ah,2
int        21h
ret
newline endp
;ввод строки
input proc near
mov        ah, 0Ah
int        21h
ret
input endp
;вывод строки
output proc near
mov        ah, 9
int        21h
ret
output endp
;основной алгоритм
do    proc near
;в si - адрес строки
lea        si, string
@@1:
push    si
;вызываем функцию find - ищем первую позицию числа
call    find
pop        si
;сравниваем ax с 0 (ax - возвращаемое значение функции find)
;если ноль - завершаем операцию
cmp        ax, 0
je        @@2
;иначе:
mov        si, di
;сдвигаем строку с позиции ax на 6 символов вправа (с помощью функции shift)
push    di
call    shift
pop        di
;копируем 'number' в нужную часть строки
call    copy
;в si - адрес строки
lea        si, string
;начинаем сначала
jmp        @@1
@@2:
ret
do    endp
;главная функция (точка входа)
start   proc    near
mov        ax, @data
mov        ds, ax
mov        es, ax
xor        ax, ax
;ввод строки
mov        dx, offset len
call    input
;основной алгоритм
call    do
;переход на новую строку
call    newline
;вывод полученной строки
mov        dx, offset string
call    output
;ожидание ввода символа
mov        ah, 0
int        16h
;завершение программы
mov        ah, 4Ch
mov        al, 0
int    21h
assume CS: code, DS: data
code segment
begin:
    mov AX, data
    mov DS, AX
    
    mov AH, 09h
    mov DX, offset mes1
    int 21h

    mov cx,10
    mov si,0
    
show_primary:
    mov dl,mas[si]
    ;add dl,30h     ;! работаем уже с самими символами
    mov ah,02h
    int 21h
    inc si
    loop show_primary

    lea dx,nl           ;переход на новую строку
    mov ah,9
    int 21h

    mov i,0             ;for i := 0 to n - 1 do
i_loop:
    mov j,1             ;  for j := 1 to n - 1 do
j_loop:                 ;    begin
    mov bx,j            ;      
    mov al,mas[bx-1]    ;      al := mas[j - 1];
    mov ah,mas[bx]      ;      ah := mas[j];
    cmp al,ah           ;      if al >= ah then
    jb next_j           ;        begin
    mov mas[bx],al      ;          a[j] := al;
    mov mas[bx-1],ah    ;          a[j - 1] := ah;
next_j:                 ;        end;
    inc j
    cmp j,n
    jb j_loop           ;    end;
    inc i
    cmp i,n
    jb i_loop
    
    mov AH, 09h
    mov DX, offset mes2
    int 21h

    mov cx,10
    mov si,0
    
show:
    mov dl,mas[si]
    ;add dl,30h     ;! работаем уже с самими символами
    mov ah,02h
    int 21h
    inc si
    loop show
    
    lea dx,nl           ;переход на новую строку
    mov ah,9
    int 21h
    
    mov AH, 08h
    int 21h
    
    mov AH, 4Ch
    mov AL, 00h
    int 21h


    code ends

data segment
    mes1 db 'Primary Massiv: $'
    mes2 db 'Massiv After Sorted: $'
    nl db 13,10,'$'
    n equ 10
mas db 'qwertydfgh'
i dw 0
j dw 0
temp db 0
data ends

stk segment stack
    dw 128 dup (0)
stk ends

end begin
start   endp
end     start
ChestIotVaga вне форума Ответить с цитированием
Старый 19.02.2023, 18:40   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А зачем вы две программы слепили вместе? В первой половине программа использующая упрощенные директивы, а в конце обычные.

Судя по всему в программе две точки входа (первая в процедуре start, вторая - метка begin, хотя работает только одна).

Зачем вы ищите в строке какие-то числа (процедура find)? Строка уже состоит из чисел. Вам надо просто их отсортировать.

Чем это исправлять проще написать заново - будет куда короче.
macomics вне форума Ответить с цитированием
Старый 20.02.2023, 15:14   #3
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию

macomics, как это сделать можете дать код?
ChestIotVaga вне форума Ответить с цитированием
Старый 20.02.2023, 21:24   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

т.к. компилятор не указали, а TASM и MASM я отличить не смог, тогда вот вам на FASM
Код:
format binary as "COM"
org	256
use16
	mov	dx, say_hello
	call	output_str
	mov	dx, buf_text
	mov	al, buf_text.length - 1
	call	input_str
	mov	bx, buf_text + 2
	call	sort_str
	mov	dx, say_goodbye
	call	output_str
	mov	dx, buf_text + 2
	call	output_str
	mov	ax, 76 * 256
	int	33

  @@:
	hlt
	jmp	@b

say_hello		db 'Input string:  $'
say_goodbye		db 13, 10, 'Result string: $'

output_str:
	mov	ah, 9
	int	33
	retn

input_str:
	mov	ah, 0
	mov	bx, dx
	mov	[bx], ax
	mov	ah, 10
	push	bx
	int	33
	pop	bx
	mov	al, [bx + 1]
	mov	ah, 0
	mov	si, ax
	mov	byte [bx + si + 2], '$'
	retn

sort_str:
	cld
	xor	cx, cx
	mov	cl, [bx - 1]
	jcxz	.quit

  .loop:
	mov	si, bx
	mov	dx, cx
	mov	di, si

  @@:
	lods byte	[si]
	cmp	al, [di]
	sbb	ah, ah
	loopz	@b
	test	ah, ah
	jz	@f
	lea	di, [si - 1]
	jcxz	@f
	jmp	@b

  @@:
	mov	al, [di]
	mov	ah, [bx]
	mov	[bx], al
	mov	[di], ah
	inc	bx
	mov	cx, dx
	loop	.loop

  .quit:
	retn

virtual
  buf_text		db ?, ?, 201 dup (?)
  .length = $ - buf_text - 2
end virtual
Код:
Input string:  1AD2ad3Cc
Result string: 123ACDacd

Последний раз редактировалось macomics; 20.02.2023 в 21:50.
macomics вне форума Ответить с цитированием
Старый 22.02.2023, 10:28   #5
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию

спасибо.
ChestIotVaga вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строка: Удалить все символы в строке, которые стоят после первого вхождения символа ‘*’, но ко второму его вхождения VLADOS2001 Помощь студентам 0 26.09.2019 17:22
Вывод символа из таблицы ASCII Bugrimov Общие вопросы C/C++ 9 03.08.2013 13:35
RichEdit, выделения символа в строке (в которой сис.символы) maxefficiently Общие вопросы Delphi 3 17.05.2011 18:02
ассемблер, замена символа в строке tiger Помощь студентам 3 05.11.2009 15:25
Перевод кода символа в символ таблицы ASCII nerh Общие вопросы C/C++ 3 01.02.2008 20:34