Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Max00766
1 / 1 / 1
Регистрация: 20.10.2015
Сообщений: 246
1

Пересылка элементов из одного массива в другой

13.05.2016, 14:06. Просмотров 1256. Ответов 11
Метки нет (Все метки)

Задание:
Написать программу пересылки массива байтов длиною 256 элементов к другому массиву такой же длины, используя все возможные режимы адресации.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2016, 14:06
Ответы с готовыми решениями:

Пересылка элементов исходного массива
Доброго времени суток! нужна программа, похожую, к сожалению, не нашел,...

скопировать данные из одного массива(1000 элементов) в другой
вот есть код. само задание: скопировать данные из одного массива(1000...

Пересылка элементов массива
Добрый вечер. Задача: Дан одномерный массив A(n).Переслать в массив B(n) его...

Перемещение чисел из одного массива в другой
Привет знатоки ассемблера. В университете дали задачку: Есть массив с числами....

Перенос чисел из одного массива в другой по условию
Есть такое задание. Создать массив из 28 чисел. В каждом из этих 28 чисел...

11
MansMI
1450 / 1159 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
13.05.2016, 14:57 2
Лучший ответ Сообщение было отмечено Max00766 как решение

Решение

Assembler
1
2
3
4
5
6
7
cld
mov ax,ds
mov es,ax
lea si,arr1
lea di,arr2
mov cx,256
rep movsb
1
Max00766
1 / 1 / 1
Регистрация: 20.10.2015
Сообщений: 246
13.05.2016, 15:14  [ТС] 3
MansMI, Можете пожалуйста помочь разобраться с кодом, здесь и пересылка элементов из одного массива в другой есть, и обнуление всех элементов? Буду благодарен за комментарии к коду:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
.model small 
.stack 256 
 
.data 
mas_A db 4 dup ('ABCDEFGHUJKLMNOPQASTUVWXY') 
len_mas equ $ - mas_A 
mas_B db len_mas dup (?) 
 
.code 
Start: 
 mov ax,@data 
 mov ds,ax 
 mov es,ax 
 lea si,mas_A 
 lea di,mas_B 
 mov cx,len_mas 
 rep movsb 
 
 lea si,mas_B 
 mov cx,len_mas 
 call OutArray 
 mov ah,8 
 int 21h 
 
 lea di,mas_B 
 xor al,al 
 mov cx,len_mas 
 rep stosb 
 
 lea si,mas_B 
 mov cx,len_mas 
 call OutArray 
 mov ah,8 
 int 21h 
 
 mov ax,4C00h 
 int 21h 
 
OutArray proc 
 lodsb 
 mov ah,al 
 shr al,4 
 call OutHex 
 mov al,ah 
 call OutHex 
 mov al,20h 
 int 29h 
 int 29h 
 loop OutArray 
 mov al,13 
 int 29h 
 mov al,10 
 int 29h 
 ret 
OutArray endp 
 
OutHex proc 
 and al,0Fh 
 add al,30h 
 cmp al,39h 
 jbe Print 
 add al,7 
Print: 
 int 29h 
 ret 
OutHex endp 
 end Start
И почему выводятся именно такие числа?
Пересылка элементов из одного массива в другой
0
proc3nt
волшебник
943 / 517 / 155
Регистрация: 26.05.2012
Сообщений: 1,459
13.05.2016, 19:00 4
Лучший ответ Сообщение было отмечено Max00766 как решение

Решение

Цитата Сообщение от Max00766 Посмотреть сообщение
Буду благодарен за комментарии к коду
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
.model small        ;модель памяти          
.386                ;процессор, для которого написана программа         
 
.data               ;сегмент данных
;объявление и инициализация байтового массива mas_A длиной 4*25=100 элементов (байтов)
mas_A   db 4 dup ('ABCDEFGHUJKLMNOPQASTUVWXY')
;константа, равная длине массива mas_A в байтах
len_mas equ $-mas_A  
;объявление неинициализированного массива mas_B такой же длины, что и массив mas_A      
mas_B   db len_mas dup (?)
 
.stack              ;сегмент стека              
    db  256 dup(?)  ;выделяем память под стек   
 
.code               ;сегмент кода               
start:              ;метка с которой начинается выполнение программы                    
    mov ax,@data    ;регистр ax служит промежуточным регистром
    mov ds,ax       ;для инициализации сегмента данных, т.к. напрямую
                    ;запись в сегментный регистр ds запрещена
    mov es,ax       ;чтобы сегментный регистр es тоже указывал на сегмент данных 
    lea si,mas_A    ;загружаем адрес массива mas_A
    lea di,mas_B    ;загружаем адрес массива mas_B
    mov cx,len_mas  ;количество копирований будет равно длине массива mas_A
    rep movsb       ;копируем побайтово весь массив mas_A в массив mas_B
    
    lea si,mas_B    ;загружаем адрес массива mas_B
    mov cx,len_mas  ;количество элементов для вывода (весь массив)
    call OutArray   ;вызываем функцию вывода элементов массива
    mov ah,8        ;функция ожидания нажатия клавиши с клавиатуры без эха
    int 21h         ;прерывание, чтобы функция выполнилась
    
    lea di,mas_B    ;загружаем адрес массива mas_B
    xor al,al       ;обнуляем регистр al
    mov cx,len_mas  ;количество элементов для обнуления (весь массив)
    rep stosb       ;обнуляем побайтово весь массив mas_B
    
    lea si,mas_B    ;загружаем адрес массива mas_B
    mov cx,len_mas  ;количество элементов для вывода (весь массив)
    call OutArray   ;вызываем функцию вывода элементов массива
    mov ah,8        ;функция ожидания нажатия клавиши с клавиатуры без эха
    int 21h         ;прерывание, чтобы функция выполнилась
    
    mov ah,4Ch      ;функция выхода из программы                
    mov al,00h      ;код возврата           
    int 21h         ;прерывание, чтобы функция выполнилась
    
    OutArray proc   ;начало процедуры
        lodsb       ;загружаем в регистр al значение (ASCII-код элемента массива)
                    ;по адресу, который в регистре si. продвижение регистра si 
                    ;к следующему элементу массива
        mov ah,al   ;запоминаем загруженное значение также в регистре ah 
        shr al,4    ;сдвигаем загруженное значение на четыре бита вправо
        call OutHex ;вызываем функцию для вывода символа (старшие четыре бита загруженного значения)
        mov al,ah   ;снова помещаем первоначально загруженное значение в регистр al
        call OutHex ;вызываем функцию для вывода символа (младшие четыре бита загруженного значения)
        mov al,20h  ;ASCII-код пробела
        int 29h     ;выводим символ, который лежит в регистре al (пробел), на консоль
        int 29h     ;выводим символ, который лежит в регистре al (пробел), на консоль
        loop OutArray;повторяем cx раз
    
        mov al,13   ;символ возврата каретки
        int 29h     ;вывод на консоль
        mov al,10   ;символ перевода строки
        int 29h     ;вывод на консоль
        
        ret         ;выход из процедуры
    OutArray endp   ;конец процедуры
    
    OutHex proc     ;начало процедуры
        and al,0Fh  ;обнуляем старшие четыре бита 
        add al,30h  ;переводим число в его ASCII-код
        cmp al,39h  ;проверка на ASCII-код числа
        jbe Print   ;если ASCII-код числа, то прыгаем на метку Print
        add al,7    ;в ином случае делаем ASCII-код буквы
        
        Print:      ;метка Print
        int 29h     ;вывод на консоль
        
        ret         ;возврат из процедуры
    OutHex endp     ;конец процедуры    
end start           ;указывается метка, с которой должна начаться выполняться программа
Цитата Сообщение от Max00766 Посмотреть сообщение
почему выводятся именно такие числа?
потому что реализован алгоритм вывода на консоль ASCII-кодов элементов массива
A - 41h
B - 42h
C - 43h и т.д.
1
Max00766
1 / 1 / 1
Регистрация: 20.10.2015
Сообщений: 246
13.05.2016, 21:13  [ТС] 5
proc3nt, Огромное спасибо Вам, безумно помогли, не подскажите ресурсы где поподробнее объясняется ассемблер, а то что то очень тяжело, не могу понять где и как надо использовать команды, еще и на ютубе практически ничего нету.
Еще раз спасибо
0
proc3nt
волшебник
943 / 517 / 155
Регистрация: 26.05.2012
Сообщений: 1,459
13.05.2016, 21:44 6
правила форума CyberForum.ru

5. Запреты и ограничения
5.8 => Запрещено публиковать ссылки на другие форумы, а также их пропаганда
0
Constantin Cat
2984 / 1118 / 376
Регистрация: 28.02.2015
Сообщений: 2,458
Завершенные тесты: 1
13.05.2016, 21:51 7
Цитата Сообщение от Max00766 Посмотреть сообщение
не подскажите ресурсы где поподробнее объясняется ассемблер
Спрашивайте тут.
Ассемблер, или точнее сказать поцессор выполняет всего несколько операций:
-пересылка А=В;
-сложение А=А+В
-сдвиги А=А/2 или А=А*2;
-логика AND, OR, XOR и NOT;
-сравнения ?А=В устанавливая флаги;
-передача управленние условно(см. флаги) и безусловная;
Может, что-то и пропустил, но остальные команды - микропрограммы записанные в процессор.
0
Max00766
1 / 1 / 1
Регистрация: 20.10.2015
Сообщений: 246
14.05.2016, 10:01  [ТС] 8
Constantin Cat,
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Спрашивайте тут.
Ассемблер, или точнее сказать поцессор выполняет всего несколько операций:
-пересылка А=В;
-сложение А=А+В
-сдвиги А=А/2 или А=А*2;
-логика AND, OR, XOR и NOT;
-сравнения ?А=В устанавливая флаги;
-передача управленние условно(см. флаги) и безусловная;
Может, что-то и пропустил, но остальные команды - микропрограммы записанные в процессор.
Это я с литературы понял, но вот где и как использовать команды никак не могу понять, даже тот же "Здравствуй, мир", не могу понять почему там те команды и все, почему нельзя как в других языках написать writeln или printf и все))
0
R71MT
5309 / 1470 / 313
Регистрация: 29.07.2014
Сообщений: 2,511
Записей в блоге: 5
14.05.2016, 11:50 9
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Цитата Сообщение от Max00766 Посмотреть сообщение
почему нельзя как в других языках написать writeln или printf и все
А кто сказал, что нельзя? Writeln/Printf - это уже готовые API-функции винды, которые ты вызываешь из своего кода в языках высокого уровня. В дос'е нет никаких API и приходиться всё делать вручную.

Для этого, нужно создать свои инклуды или макросы, где описать все действия.
Например, так будет выглядеть "Hello World!" с использованием макроса Printf на фасме:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; FASM code
; Описываем макросы ==========================
macro Printf [text]
{ mov  ah,9
  mov  dx,text
  int  21h  }
 
macro Exit
{ xor  ax,ax
  int  16h
  int  20h  }
 
;=== НАЧАЛО КОДА =============================
org  100h
jmp  start
 
mess0  db  'Hello World!$'
 
start:
     Printf  mess0     ; зовём макросы
     Exit
0
Max00766
1 / 1 / 1
Регистрация: 20.10.2015
Сообщений: 246
14.05.2016, 13:26  [ТС] 10
Цитата Сообщение от R71MT Посмотреть сообщение
macro Printf [text]
{ mov *ah,9
* mov *dx,text
* int *21h *}
macro Exit
{ xor *ax,ax
* int *16h
* int *20h *}
Проблема заключается в том что я не могу разобраться в каких местах и как использовать mov,int,lea и другие команды, знаю что они делают, но как их использовать в коде не могу понять
0
Mikl___
Автор FAQ
13374 / 6377 / 629
Регистрация: 11.11.2010
Сообщений: 11,539
14.05.2016, 13:35 11
Цитата Сообщение от Max00766 Посмотреть сообщение
Проблема заключается в том что я не могу разобраться в каких местах и как использовать mov,int,lea и другие команды, знаю что они делают, но как их использовать в коде не могу понять
А чего ты хочешь от обитателей ветки "Ассемблер"? Что бы зарифмовали команды mov, int, lea и правила использования этих команд? Чтобы хором читали учебник для Max00766? Что бы выстроились в очередь и начали писать обучающие программы для Max00766? А может быть проблема заключается в том, что Max00766 сам должен прилагать усилия и начать читать учебники?...
0
Constantin Cat
2984 / 1118 / 376
Регистрация: 28.02.2015
Сообщений: 2,458
Завершенные тесты: 1
16.05.2016, 10:14 12
Цитата Сообщение от Max00766 Посмотреть сообщение
Проблема заключается в том что я не могу разобраться в каких местах и как использовать mov,int,lea и другие команды, знаю что они делают, но как их использовать в коде не могу понять
С MOV и LEA, думаю все понятно, они загружают регистры определенными программистом значениями.
С INT, несколько сложнее, но тоже можно разобратся.
В BIOS все прерывания сгрупированы по устройствам. Графика - 0х10; Диски - 0х13; Клавиатура - 0х16 и т.д.
В DOS основным считается прерывание 0х21, в нем собраны различные функции: файловые, ввода/вывода, управления и системные. Каждое прерывание имеет входные и выходные парметры.
К примеру вывод строки. Для вызова функции указанные регистры должны содержать следующие значения:
AH = 09h - номер функции прерывания 0х21
DSX - адрес сегмент:смещение строки с символом '$' в конце
Все теперь можно вызывать прерывание.

Полное описание прерываний можно найти в Ralf Brown's Interrupt List.
Если с английским плохо, то на русском в сети есть книга Данкан Р. Профессиональная работа в MS-DOS. В книге в доступной форме описаны прерывания BIOS и DOS.
0
16.05.2016, 10:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2016, 10:14

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

Переписать все отрицательные числа из одного массива в другой
Суть такая Дан массив чисел со знаком. Нужно все отрицательные числа переписать...

Пересылка массива слов. Ассемблер, tasm
Изменить данную программу в программу для пересылки массива слов. sseg...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru