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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2010, 16:54   #1
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию Поменять слова в строке местами

Задание: ввожу слова с клавиатуры, разделенные пробелом, независимо от того сколько ввел слов, записать слова справа налево, т.е.

есть строка ab cd ef gh
нужно получить gh ef cd ab

Код:
data segment
    in_str db 80,?,82 dup (?)       
    out_str db  80 dup (?)          
data ends
code segment
assume cs: code, ds: data
        start: mov ax, data           
	       mov ds, ax          
               mov ah, 0ah
               int 21h
               lea bx, in_str+2  
	       xor cx, cx
	       mov cl, in_str+1
               dec cx
	       add bx, cx          ; чтение с конца строки
               xor ax, ax
               inc cx
               mov dh, cl          ; запомним cl через dh
               
          beg: mov al, [bx]
               inc dl              ; счетчик числа элементов до пробела
               
               cmp al, ' '         ; сравнение al с пробелом
               jne m               ; если не равно то на m
           
               mov cl, dl          ; присвоить счетчик dl в cl
         beg1: pop ax
               inc si
               mov out_str[si], al
               loop beg1
                                 
               inc si              
               mov out_str[si], ' ' ; прибавление пробела после перестановки
           
               mov dl, 0           ; обнуление счетчика
               cmp dl, 0
               je n
            
            m: cmp dh, 1           ; если конец строки то на beg1
               je beg1
               
               push ax
               
               
            n: dec bx
               mov cl, dh          ; то что  запомнили в dh обратно в cl
               loop beg
                    
               lea dx, out_str
               mov ah, 09h
               int 21h
               mov ah, 0ah
               int 21h
         quit: mov ax, 4c00h
	       int 21h
code ends
end start
программа проходит всю строку, но после последнего символа не выходит из цикла... подскажите что с условием не так
спасибо
fen1ksss вне форума Ответить с цитированием
Старый 27.11.2010, 13:24   #2
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию

ну что, нет вариантов?
fen1ksss вне форума Ответить с цитированием
Старый 28.11.2010, 12:04   #3
Ant1971on
Пользователь
 
Регистрация: 20.07.2010
Сообщений: 52
По умолчанию

Такой вариант подойдет ?

Код:
CODE_SEG SEGMENT

ASSUME CS:CODE_SEG,DS:DATA_SEG

START:

;настроить DS

	MOV AX,DATA_SEG
	MOV DS,AX

;ввести строку

	MOV AH,0Ah
	MOV DX,OFFSET CHAR_NUM_LIMIT
	INT 21h

;перевод каретки

	MOV AH,02h
	MOV DL,13
	INT 21h
	MOV DL,10
	INT 21h

;готовим адрес последнего символа

	MOV BX,OFFSET NUM_CHARS_READ	;в BX смещ. 2 байта буфера строки
	MOV AL,NUM_CHARS_READ
	MOV AH,0			
	MOV SI,AX                       ;в SI число введенных символов

	XOR CX,CX			;счетчик символов в группе 

GROUP_CHARS:
	
	MOV AL,[BX][SI] 		;в AL - последний введенный символ
	CMP AL,' ' 			;пробел ?
	JE PRINT_GROUP                  ;да, выведем группу символов до пробела
	PUSH AX				;символ - в стек
	INC CX  			;считает символы в группе
	DEC SI				;SI указывает на предыдущий символ
	JZ PRINT_GROUP			;вывести последнюю группу символов
	JMP GROUP_CHARS                 ;считать предыдущий символ

;Выведем группу символов на экран

PRINT_GROUP:
        
	MOV AH,02h			;функция вывода символа на экран
	POP DX				;вернем из стека символ
	INT 21h				;выведем его на экран
	LOOP PRINT_GROUP		;выведем все символы группы

	MOV DL,' '			;после группы выведем пробел
	INT 21h

	DEC SI				;SI указывает на посл.симв.предыд.гр.
	JS DONE
	JMP GROUP_CHARS		        ;считаем следующую группу
	
DONE:	
				
	MOV AX,4C00h
	INT 21h

CODE_SEG ENDS

DATA_SEG SEGMENT

CHAR_NUM_LIMIT  DB 80		;максимальное число вводимых символов
NUM_CHARS_READ  DB ?		;число введенных символов
INPUT_STRING 	DB 80 DUP (?)   ;буфер для вводимых символов

DATA_SEG ENDS

STACK_SEG SEGMENT STACK

DB 256 DUP (0)

STACK_SEG ENDS

END START
Может сложновато получилось, я в асме пока новичок, зато работает, проверил
Ant1971on вне форума Ответить с цитированием
Старый 28.11.2010, 15:57   #4
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию

Код:
data segment
    in_str db 80,?,82 dup (?)       
    out_str db  80 dup (?)
    enter db 0dh, 0ah, '$'          
data ends
code segment
assume cs: code, ds: data
        start: mov ax, data           
	       mov ds, ax          
               mov ah, 0ah
               int 21h
               lea bx, in_str+2  
	       xor cx, cx
	       mov cl, in_str+1
               dec cx
	       add bx, cx          ; чтение с конца строки
               xor ax, ax
               inc cx
               
          beg: mov dh, cl          ; запомним cl через dh
               mov al, [bx]
               
               cmp al, ' '         ; сравнение al с пробелом
               jne m               ; если не равно то на m
           
            s: mov cl, dl          ; присвоить счетчик dl в cl
         beg1: pop ax
               
               mov out_str[si], al
               inc si
               loop beg1
                                 
                             
               mov out_str[si], ' ' ; прибавление пробела после перестановки
               inc si
           
               mov dl, 0           ; обнуление счетчика
               cmp dl, 0
               je n
            
            m: inc dl              ; счетчик числа элементов до пробела
               push ax
               cmp dh, 1           ; если конец строки то на s
               je s
               
                
               
            n: 
               dec bx
               mov cl, dh          ; то что  запомнили в dh обратно в cl
               loop beg
               
               xor dx, dx
               
               lea dx, enter
               mov ah, 09h
               int 21h
     
               lea dx, out_str
               mov ah, 09h
               int 21h
               mov ah, 0ah
               int 21h
         quit: mov ax, 4c00h
	           int 21h
code ends
end start
ну или вот так, спасибо
fen1ksss вне форума Ответить с цитированием
Старый 28.11.2010, 16:37   #5
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию

Ant1971on,
объясни как ты обращаешься к концу строки?
fen1ksss вне форума Ответить с цитированием
Старый 28.11.2010, 17:39   #6
Ant1971on
Пользователь
 
Регистрация: 20.07.2010
Сообщений: 52
По умолчанию

Очень просто. В базу (BX) кладу смещение байта перед строкой (это второй байт буфера строки, у тебя это байт с вопросом в int_str), в SI - число введенных символов (оно хранится в том же втором байте). Командой MOV AL,[BX][SI] загоняю последний символ строки в AL.
Ant1971on вне форума Ответить с цитированием
Старый 28.11.2010, 22:25   #7
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию

ok, thanks
fen1ksss вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поменять местами слова в ячейке Нюни Microsoft Office Excel 28 05.12.2017 11:28
поменять местами слова в предложении (C++) Slicker Общие вопросы C/C++ 15 10.03.2011 10:17
поменять соседние слова местами alex(21) Общие вопросы C/C++ 3 20.02.2011 16:28
поменять местами слова в предложении (C++) Slicker Помощь студентам 3 30.05.2009 17:57
как поменять местами слова в файле? r-tem Общие вопросы C/C++ 6 01.12.2008 22:17