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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2016, 02:48   #1
chipdrunk
Новичок
Джуниор
 
Регистрация: 10.12.2016
Сообщений: 3
По умолчанию Запись символа из регистра в строку (Assembler: TASM)

Нужно:
Поменять местами соседние слова в строке (1 со 2; 3 с 4 ...) Если слов нечетное количество - последнее с первым.
Мною был разработан примерный алгоритм обработки строки:

Посимвольное считывание и нахождение пробела мне удалось реализовать.
Далее мне нужно добавить найденный символ в строки TEMPWORD и Mbuffer - согласно алгоритму.
Я пробовал: Lea TEMPWORD, [SI], например. В лучшем случае удавалось получить в итоге бинарник - вместо текста в файле.
Понятно, что я не правильно добавляю символ в строку.
Собственно, на этой операции пока, что остановился.
Еще интересует: как в дальнейшем сложить строки Mbuffer и TEMPWORD
Помогите, пожалуйста.
Код:
CODE SEGMENT		 
ASSUME CS: CODE, DS:CODE 	 
org 100h	
Start:

;/// OPEN VANILLA FILE (1)
       MOV AH, 3DH
       MOV AL, 0
       MOV DX, OFFSET FILE
       int 21h  
       mov [vfhandle], ax



;/// CREATE A NEW FILE (2)
       mov ah,3Ch 
       mov cx,0
       mov dx, 0
       mov DX, OFFSET NEWFILE
       int 21h
       mov [nfhandle], ax



;/// READING VANILLA FILE (3)
       mov bx, vfhandle
       mov ah, 3Fh 
                 ;mov dx, FILE
       mov cx, 512
       mov dx,OFFSET Buffer
       int 21h  

SUB BX, BX

;/// DATA PROCESSING
       lea SI, BUFFER
       sub CH,CH
       mov CL, ' ' ;nums
       mov ax, cx
       cmp CX,0
       jne m1
       jmp exit
MOV BH, 1
m1:   
       cmp [SI], byte ptr ' '
       jnbe sk
       ; найден пробел
        
       
       jmp exit

sk:  ; символ не пробел

       /// ДОБАВЛЕНИЕ В TEMPWORD ТЕКУЩЕГО СИМВОЛА (SI - индекс)    
       inc  SI
       loop m1

m3:  
       mov CX,AX
       lea DI, Buffer 

exit:

;/// SAVE MODIFIED BUFFER TO A NEW FILE (5)
       mov ah,40h 
       mov bx, nfhandle 
       lea dx, Buffer 
       mov cx, 512
       int 21h 

;/// CLOSE A NEW FILE (6)
       mov ah, 3eh ; закрытие
       MOV BX, nfhandle
       int 21h

;/// CLOSE VANILLA FILE (7)
       mov ah, 3eh ; закрытие
       MOV BX, vfhandle
       int 21h

ret

nfhandle    dw 1
vfhandle    dw 1 
Mbuffer DB 512 dup(' ')  
Buffer DB 512 dup(' ')
TEMPWORD DW 512 dup(' ')
NEWFILE  DB  'K:\NEWFILE.txt',0
FILE  DB  'K:\FILE.txt',0
	
CODE ENDS	
END Start
We need (FUD)
chipdrunk вне форума Ответить с цитированием
Старый 10.12.2016, 11:44   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от chipdrunk Посмотреть сообщение
Запись символа из регистра в строку
Нужно:
Поменять местами соседние слова в строке (1 со 2; 3 с 4 ...)
Если слов нечетное количество - последнее с первым.
Непонятно, что ты хочешь менять: соседнии символы или слова?
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 10.12.2016, 17:42   #3
chipdrunk
Новичок
Джуниор
 
Регистрация: 10.12.2016
Сообщений: 3
По умолчанию

Из файла считывается строка - буфер, состоящая из слов, разделенных пробелом. Естественно, чтобы поменять местами слова - мне нужно найти пробел, как - либо образом манипулировать с словами. Я задумал сохранять слово в переменной и вставлять после следующего слова. Так как веду поиск пробела я посимвольным сравнением текущего символа с пробелом - можно сохранять не пробелы в то самое временное слово. Насколько я знаю, в асм нет функций, типа find. Вы знаете иной способ выделения слов из строки?
We need (FUD)
chipdrunk вне форума Ответить с цитированием
Старый 10.12.2016, 21:07   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от chipdrunk Посмотреть сообщение
Насколько я знаю, в асм нет функций, типа find.
Вы знаете иной способ выделения слов из строки?
..типа find - это repne scasb. Можещь почитать про неё.
А алгоритм, не знаю.. может есть и другие.
Твою мыслю можно воплотить например так..

Нужны 2 буфера: для слова(TEMP) и для выходной строки(OUT).
Под слово хватит байт-16, а выходной сравнять с входным. Алго примерно такой:

1. Первое слово запоминаешь в буфере(TMP);
2. Второе слово сразу отправляешь в выходной буфер(OUT);
3. Вставляешь следом первое слово;
4. Очищаешь временный буфер.
5. Мотаешь, если не конец строки..

Вот пример на FASM'e.
Подразумевается, что считанные из файла данные находятся в BUFF.
Длинна строки лежит в LEN. Изменённая строка будет в OUTSTR:
Код:
; fasm code... //com-file
; xchg - слов в строке
;--------------------------------
org  100h
jmp  start

buff     db   'ABC DEFG HI JKLMN OPQ RS TUVWX YZ 01234562016', '$'
len      =    $ - buff          ;длина строки
outStr   db   len dup('$')      ;такой-же выходной буфер
temp     db   16 dup(0)         ;временный буфер для слова

start:  mov   ah,9
        mov   dx,buff
        int   21h

;настраиваем регистры..
        mov   bx,outStr
        mov   si,buff
        mov   cx,len

;копируем левое слово во-временный буфер
;SI = источник, DI = приёмник..
@begin: mov   di,temp
        call  storeWord
        jcxz  @print         ;если строка кончилась

;копируем правое слово сразу в выходной буфер(OUT)
        mov   di,bx          ;адресация через ВХ
        call  storeWord
        push  si cx

;отправляем левое слово из TEMP в OUT
;DI уже установлен..
        mov   si,temp
@@01:   lodsb
        or    al,al
        je    @@02
        stosb
        jmp   @@01
@@02:   mov   bx,di          ;адресация к OUT через ВХ

;забиваем TEMP нулями для сл.слова
        xor   ax,ax
        mov   cx,16
        mov   di,temp
        rep   stosb

;возвращаемся в буфер со-строкой
        pop   cx si
        or    cx,cx            ;всю строку проверили?
        je    @print
        loop  @begin           ;нет - продолжаем..

;проверим временный буфер
@print: cmp   byte[temp],0
        je    @okey
        mov   di,bx            ;осталось чётное слово!
        mov   si,temp
@clear: lodsb
        or    al,al
        je    @okey
        stosb                  ;заберём его от туда..
        jmp   @clear

;выводим результат на экран!
@okey:  mov   al,10            ;перевод строки..
        int   29h
        mov   ah,9
        mov   dx,outStr
        int   21h

@exit:  xor   ax,ax
        int   16h
        int   20h              ;выход в DOS !!!

;-------------------------------------------------------------
storeWord:       ;<----- Процедура отправляет из SI в DI
        lodsb
        cmp   al,' '
        je    @@stop
        stosb
        loop  storeWord
@@stop: stosb           ;пробел-разделитель
        ret
Изображения
Тип файла: jpg 88.JPG (12.7 Кб, 183 просмотров)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 11.12.2016, 20:25   #5
chipdrunk
Новичок
Джуниор
 
Регистрация: 10.12.2016
Сообщений: 3
По умолчанию

Спасибо за столь прямой "пинок", вопрос решен!
We need (FUD)
chipdrunk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение любого первого символа нижнего регистра в строке duh96 Microsoft Office Excel 10 27.05.2016 08:14
Написать процедуру подобно insert, которая после каждого вхождения символа C в строку S1 вставляет строку S2 azalia Паскаль, Turbo Pascal, PascalABC.NET 17 09.01.2014 12:39
assembler.tasm. Запись результата в файл .txt квант Помощь студентам 0 15.12.2011 00:12
Задачи: Сортировка символьной информации в строке, заданной пользователем.; Чтение и запись данных в файл (Assembler,TASM) User22 Помощь студентам 2 01.12.2011 11:40
Ввод символьной строки,вывод содержимого соответствующего регистра(TASM) adgam Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 17.03.2010 08:48