Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Перестановка элементов массива


Автор: Ellmi 24.9.2011, 23:48
Доброго времени суток!
Помогите пожалуйста найти ошибку, на ассемблере уже сто лет не писала, не могу сообразить что не так smile ..
Пользователь вводит строку, нужно символы этой строки переставить в соответствии с заданным в программе массивом, т е в проге задан массив 
Num dw  3, 2, 1, 4, 5, 6
пользователь вводит : qwerty
Должно получиться: ewqrty
А получается: eAw(стрелка)qF - правильно через один символ, откуда остальное не пойму никак smile 
Код

.model small
.stack 100h
.data
Mes db 13, 10,'Vvedite stroky simvolov:', '$'
Str dw 20 dup (?)
Num dw  3, 2, 1, 4, 5, 6
Result dw 20  dup (?)
i dw 0
len dw 6

.code
mov ax,@data
mov ds,ax
mov dx, offset Mes   
mov ah, 09h
int 21h                   ;вывод на экран запроса на ввод строки 

mov ah,3fh
mov bx,0
mov cx,50
mov dx, offset String
int 21h                   ;вывод на экран и сохранение введенной строки  

sub ax, 2               ;вычитание из длины 2(т.к. нажимаем Enter)
xor bx, bx              ;очистка BX
xor cx, cx;
mov len2,ax             
xor ax, ax;

Loop:
mov cx,Num[bx]  ;заносим в сх цифру из массива Number
dec cx                      ;уменьшаем её на 1, т к индексы с 0
mov i,bx                   ;запомнили индекс
mov bx,cx            
mov dx,String[bx]    ;в dx записываем элемент строки с индексом, равным цыфре из Number
mov bx,i                   ;восстанавливаем индекс
mov Result[bx],dx    ;в результирующую строку заносим этот символ
inc bx
cmp bx,len                ;проверяем не достигли ли конца массива Number
jne Loop                   ;если нет то переход на метку


mov ah,40h
mov bx,1
mov cx,len 
mov dx,offset Result
int 21h              ;вывод на экран результата


mov ah,01h           ;ожидание нажатия клавиши
int 21h

mov ah,4ch           ;завершение программы 
int 21h                       
END 


Автор: ФедосеевПавел 25.9.2011, 07:58
Массив Num из слов, а String из байт. И навигация по Num должна быть соответственно другой.
Код

push bx
add bx, bx
mov cx,Num[bx]  ;заносим в сх цифру из массива Number
pop bx

Автор: Ellmi 25.9.2011, 12:50
ФедосеевПавел, Спасибо=)! Сделать получилось,  а почему 
Цитата(ФедосеевПавел @  25.9.2011,  07:58 Найти цитируемый пост)
Массив Num из слов, а String из байт.

понять не получилось... ведь все три массива из слов
Код

String dw 20 dup (?)         
Num dw  3, 2, 1, 4, 5, 6   
Result dw 20  dup (?)       


Автор: ФедосеевПавел 25.9.2011, 19:39
В DOS строка представляет собой байтовый массив, вне зависимости как была описана метка массива
Код

String dw 20 dup (?)
 или, что тоже самое
String db 40 dup (?)

Т.е. один символ - один байт. Например, именно так описана строка Mes.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)