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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2017, 18:04   #1
Reatar
 
Регистрация: 14.12.2016
Сообщений: 9
По умолчанию Выполнение задач при нажатии на клавишу

Помогите разобраться с заданием
Ввести строку из произвольных ASCII-символов при помощи цикла и 01h и выполнить с ней преобразования
<F2> – изменение порядка следования символов исходной строки на обратный
<F7> - по возрастанию (пузырьком)

Пытался сделать пузыриком и инверсный вывод строки
При инверсном выводе цифры выводит не все, а при сочетании букв и цифр выводит различные символы и знаки

Tasm
Код:
;Вариант 8
MODEL SMALL
STACK 100h
.data
endl db 10,13,'$'
mesF2 db 13,10,'Pressed <F2> $'
mesF7 db 13,10,'Pressed <F7> $'
mas db 100 dup(?)
mas2 db 100 dup(?)
new db 10 ,13, '$'
len db ?
n = 100
.code
again: 
	mov	ax,@data
	mov	ds,ax	;связка ds с сегментом данных
	xor	ax,ax	;обнуление ax

xor si,si
mov cl,100
cicl1:
mov ah,01h
int 21h
cmp al,13
je end1
mov mas[si],al
inc si
loop cicl1
end1:
mov ax,si
mov len,al

menu:
mov ah,08h      ;Функция ввода одиночного символа без эха
int 21h  

cmp al,3Ch      ;Нажата F2?
je F2              ;Да

cmp al,41h      ;Нажата F7?
je F7

jmp menu       ;Нажато незапланированное\

F2:             ;Вывод сообщения  mes2
xor ax,ax
mov al, byte ptr [mas+1]
lea di, [mas+2]
lea si, [mas2]
add si,ax
dec si
mov cx,ax
next:
mov al, byte ptr[di]
mov byte ptr [si],al
inc di
dec si
loop next

;Сообщение.....
lea dx,mesF2     ;Вывод сообщения
mov ah,09h
int 21h   

	mov AH,09h	
	lea dx,new   ;Вывод сообщения
	int 21H	

mov ah,09h
lea dx,mas2
int 21h

jmp menu

F7:             ;Вывод сообщения  mes2
cntn:   
	xor si,si
    mov cx,n
    dec cx
    mov dl,1    
sort:   
	mov al,mas[si]
    cmp al,mas[si+1]
    jnl nxt
    xchg al,mas[si+1]
    mov mas[si],al
    xor dl,dl   ;обмен был, обнуляем dl
nxt:    inc si
    loop sort
    or dl,dl    ;если dl=1, элементы не менялись, на выход
    jz cntn

    mov si,offset mas
    mov cx,n
outpt:  			
	mov	dl,mas[si]
	inc si
	add	dl,30h
	mov	ah,02h
	int	21h
    loop outpt
;Сообщение.....  
    
jmp Goodby

Goodby:

;Сообщение.....  
lea dx,mesExit     ;Вывод сообщения
mov ah,09h
int 21h     
jmp Exit

mov dx,offset endl 
int 21h			; writeln()

Exit:           ;Завершение программы
mov ax,4c00h        ;end.
Int 21h
End again
Reatar вне форума Ответить с цитированием
Старый 19.04.2017, 09:05   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Reatar Посмотреть сообщение
а при сочетании букв и цифр выводит различные символы и знаки
..вставь в результат маркер конца строки($),
т.к. функция 09/int21 ориентируется по нему.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 19.04.2017, 15:55   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Вот тебе пример..
ТАСМ'a у меня нет, поэтому код не тестировал, но думаю сам разберёшся:
Код:
.386
.model  small
.stack  100h
.data

mess0   db   'Type string: $'
mesF2   db   13,10,'<F2> Revers, <F7> Sort, <Esc> Exit'
        db   13,10,'Press command KEY...',13,10,'$'
array1  db   80 dup('$')
array2  db   80 dup('$')
len     dw   0

.code
start:  mov   ax,@data
       	mov   ds,ax	          ; связка ds/es с сегментом данных
        mov   es,ax

;//==== Ввод строки с клавиатуры --------------
        mov   ah,9
        lea   dx,mess0
        int   21h

        xor   cx,cx           ; длина строки
        lea   di,array1
        mov   ah,1
@01:    int   21h
        cmp   al,13
        je    next
        stosb                 ; сохранить символ в ES:DI
        inc   cx              ; считаем длину строки
        jmp   @01
next:   mov   word[len],cx    ; запомним длину..

;//==== Ждём клавишу юзера.. -----------------
        mov   ah,9
        lea   dx,mesF2
        int   21h

menu:   xor   ax,ax           ; ввод символа без эха
        int   16h
        cmp   al,1Bh          ; AL = ascii Esc ?
        je    exit  
        cmp   ah,3Ch          ; AH = расширенная F2?
        je    @F2
        cmp   ah,41h          ; AH = F7?
        je    @F7
        jmp   menu            ; остальные в игнор\

;//==== F2 Реверс строки ---------------------
@F2:    mov   cx,word[len]
        lea   si,array1
        lea   di,array2
        add   si,cx
        std
@02:    lodsb
        mov   byte[di],al
        inc   di
        loop  @02
        cld

       	mov   ah,9	
       	lea   dx,array2       ; Вывод результата
       	int   21h	
        jmp   menu

;//==== F7 Сортировка пузырьком --------------
@F7:    lea   si,array1
        xor   bx,bx	          ; флаг перестановок
        mov   cx,word[len]
@03:    lodsb		               ; AL = байт из SI
        cmp   al,byte[si]
        jbe   @04
        xchg  al,byte[si]
        mov   byte[si-1],al
        inc   bx 	            ; флаг +1
@04:    loop  @03
        or    bx,bx	          ; перестановки были?
        jnz   @F7

       	mov   ah,9	           ; Вывод результата
       	lea   dx,array1
       	int   21h	

;//==== Завершение программы -----------------
        xor   ax,ax
        int   16h
exit:   mov   ax,4c00h        ; end.
        int   21h
end start
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 19.04.2017 в 15:57.
R71MT вне форума Ответить с цитированием
Старый 19.04.2017, 22:26   #4
Reatar
 
Регистрация: 14.12.2016
Сообщений: 9
По умолчанию

Спасибо. А как можно скопировать строку?
И еще... организовать ввод отрицательного числа, поместив результат в регистр? Вроде бы расширенный надо для этого использовать, если я не ошибаюсь...
Reatar вне форума Ответить с цитированием
Старый 20.04.2017, 04:50   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Reatar Посмотреть сообщение
Спасибо. А как можно скопировать строку?
Код:
lea   si,источник
lea   di,приёмник
mov   cx,длина
rep   movsb
Цитата:
организовать ввод отрицательного числа
..как и положительного, только проверять число на флаг(SF), и если он взведён, то применить к числу инструкцию(NEG).
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 20.04.2017 в 07:50.
R71MT вне форума Ответить с цитированием
Старый 27.04.2017, 18:55   #6
Reatar
 
Регистрация: 14.12.2016
Сообщений: 9
По умолчанию

Не могли бы Вы подсказать, правильно ли я оформил данную программу в виде процедур ?
Код:
MODEL SMALL
STACK 100h
.data
endl db 10,13,'$'
mess0   db   'Type string: $'
mesF2   db   13,10,'<F2> Revers, <F3> lines before, <F7> Sort, <F10> Exit'
        db   13,10,'Press command KEY...',13,10,'$'
mesF3 db 13,10,'Pressed <F3> & Output lines: $'
mesF7 db 13,10,'Pressed <F7> $'
mesExit db 13,10, 'Goodby User $'
array1  db   100 dup(?)
array2  db   100 dup(?)
wrtln db 10 ,13, '$'
wrtln1 db 10 ,13, '$'
len db ?
.code
again:
call proc_input
ret
;MENU
menu:

mov ah,08h      ;Функция ввода одиночного символа без эха
int 21h  

cmp al,3Ch      ;Нажата F2?     ;<F2> – изменение порядка следования символов исходной строки на обратный.
call proc_F2 
ret

cmp al,3Dh      ;Нажата F3?     ;<F3> – вывести неизмененную строку.
call proc_F3
ret

cmp al,41h      ;Нажата F7?     ;<F7> -  по возрастанию(пузырьком).
call proc_F7
ret

cmp al,44h      ;Нажата F10?    ;<F10> – завершение программы.
call proc_F10
ret

jmp menu

proc_input proc
mov	ax,@data
mov	ds,ax
xor	ax,ax	

mov   ah,09h
lea   dx,mess0
int   21h
xor si,si
mov cl,100
cicl1:
mov ah,01h
int 21h
cmp al,13
je end1
mov array1[si],al
inc si
loop cicl1
end1:
mov ax,si
mov len,al

mov   ah,09h
lea   dx,mesF2
int   21h
ret
proc_input endp

proc_F2 proc
xor ax,ax
mov al, byte ptr [array1]
lea di, [array1]
lea si, [array2]
add si,ax
dec si

next:
mov al, byte ptr[di]
mov byte ptr [si],al
inc di
dec si
loop next

lea dx,mesF2
mov ah,09h
int 21h   

mov ah,09h
lea dx,array2
int 21h
mov ah,09h
lea dx,endl
int 21h

ret
proc_F2 endp
proc_F3 proc
lea dx,mesF3
mov ah,09h
int 21h 

mov ah,09h
lea dx,array1
int 21h
mov ah,09h
lea dx,endl
int 21h

ret
proc_F3 endp
proc_F7 proc
cntn:   
	xor si,si
    mov cx,100
    dec cx
    mov dl,1    
sort:   
	mov al,array1[si]
    cmp al,array1[si+1]
    jnl nxt
    xchg al,array1[si+1]
    mov array1[si],al
    xor dl,dl   
nxt:    
    inc si
    loop sort
    or dl,dl
    jz cntn

mov ah,09h
lea dx,array1
int 21h
mov ah,09h
lea dx,endl
int 21h

ret
proc_F7 endp
proc_F10 proc 
lea dx,mesExit 
mov ah,09h
int 21h     
jmp Exit
ret
proc_F10 endp



mov ah,09h
lea dx,endl
int 21h

Exit:           ;Завершение программы
mov ax,4c00h      
Int 21h
End again
Reatar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Печатать слово при нажатии на какую-либо клавишу Джулиан Общие вопросы Delphi 1 19.11.2016 21:00
Остановить выполнение процесса при нажатии на кнопку Aleksandr Microsoft Office Excel 2 04.03.2011 10:28
ормируется объект размером 30х30 и он должен при нажатии на клавишу,двигаться в 8ми направлениях..а при н Krasoto4ka Помощь студентам 0 22.05.2010 17:41
Выполнение макроса при нажатии на Лист KinderX Microsoft Office Excel 7 01.07.2009 17:19