Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 21.12.2013
Сообщений: 20
1

Loop в ассемблере

10.06.2015, 16:47. Показов 922. Ответов 1
Метки нет (Все метки)

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
data segment
    num1 db 0, 0, 0, 0, 0, 0, 0 ; ïåðâîå ÷èñëî 
    num2 db 0, 0, 0, 0, 0, 0, 0 ; âòîðîå ÷èñëî                                                                                               
    len dw $-num2 ; äëèíà ìàññèâà (7)
    forCompare2 dw 0 ; ïåðåìåííàÿ äëÿ ñðàâåíèíÿ ñ ðåãèñòðîì ax
    forCompare1 db 10 ; ïåðåìåííàÿ äëÿ ñðàâíåíèÿ ñ ðåãèñòðîì al
data ends 
 
code segment
start:  
    assume cs:code, ds:data
    mov ax, data
    mov ds, ax
    lea si, num1 ; áåðåì â si àäðåñ ïåðâîãî ýëåìåíòà ìàññèâà num1
    lea di, num2 ; áåðåì â di àäðåñ ïåðâîãî ýëåìåíòà ìàññèâà num2
    
    mov ah, 08
    mov cx, len ; ñ÷åò÷èê öèêëà 
readNum1:
    int 21h
    sub al, 30h
    mov [si], al
    inc si
    loop readNum1
    
    mov cx, len ; ñ÷åò÷èê öèêëà
readNum2:
    int 21h
    sub al, 30h
    mov [di], al
    inc di
    loop readNum2
    
    mov cx, len ; ñ÷åò÷èê öèêëà
    mov si, 6h ; çàãðóæàåì â si 6 (ïîñëåäíèé ýëåìåíò ïåðâîãî ìàññèâà)
    mov di, 0dh ; çàãðóæàåì â di 6 (ïîñëåäíèé ýëåìåíò ïåðâîãî ìàññèâà)
    
addNums:
    mov al, [si] ; çàãðóæàåì çíà÷åíèå ýëåìåíòà ìàññèâà â al, àäðåñ êîòîðîãî õðàíèòñÿ â si 
    mov ah, [di] ; çàãðóæàåì çíà÷åíèå ýëåìåíòà ìàññèâà â al, àäðåñ êîòîðîãî õðàíèòñÿ â di
    add al, ah ; ñêëàäûâàåì çíà÷åíèÿ ýëåìåíòîâ ìàññèâà
    cmp al, forCompare1 ; ñðàâíèâàåì çíà÷åíèå al ñ 10 (íà ñëó÷àé, åñëè ñóììà ýëåìåíòîâ => 10)
    jb case1 ; âûïîëíÿåì case1 åñëè al < 10 
    jae case2 ; âûïîëíÿåì case2 åñëè al => 10
case1: 
    mov [si], al ; âîçâðàùàåì èçìåíåííîå çíà÷åíèå ýëåìåíòà ïåðâîãî ìàññèâà
    sub si, 1 ; óâåëè÷èâàåì si íà åäèíèöó
    sub di, 1; óâåëè÷èâàåì di íà åäèíèöó
    cmp cx, forCompare2 ; ñðàâíèâàåì çíà÷åíèå ðåãèñòðà cx ñ 0
    je cont ; åñëè ñõ = 0, òî âûõîäèì èç öèêëà
    loop addNums ; âîçðàùàåìñÿ â íà÷àëî addNums 
case2:
    aam ; ascii êîððåêöèÿ 
    mov [si], al ; âîçâðàùàåì èçìåíåííîå çíà÷åíèå ýëåìåíòà ïåðâîãî ìàññèâà 
    sub si, 1 ; óâåëè÷èâàåì si íà åäèíèöó
    mov al, [si] ; çàãðóæàåì ñëåäóþùåå çíà÷åíèå ýëåìåíòà ìàññèâà â al 
    add al, 1h ; óâåëè÷èâàåì ýòî çíà÷åíèå íà 1
    mov [si], al ; âîçðàùàåì èçìåíåííîå çíà÷åíèå îáðàòíî â ìàññèâ
    sub di, 1 ; óâåëè÷èâàåì di íà åäèíèöó
    cmp cx, forCompare2 ; ñðàâíèâàåì çíà÷åíèå ðåãèñòðà cx ñ 0
    je cont ; åñëè ñõ = 0, òî âûõîäèì èç öèêëà
    loop addNums ; âîçðàùàåìñÿ â íà÷àëî addNums   
    
cont:
    mov cx, len ; åùå ðàç çàãðóæàåì â cx ðàçìåð ìàññèâà len
    lea si, num1 ; áåðåì â si àäðåñ ïåðâîãî ýëåìåíòà ìàññèâà num1
    mov ah, 02 ; çàãðóæàåì â ah 2 äëÿ 21 ïðåðûâàíèÿ (âûâîä ñèìâîëà íà ýêðàí)
 
printNum:
    mov dl, [si] ; çàãðóæàåì çíà÷åíèå ýëåìåíòà ìàññèâà â dl, àäðåñ êîòîðîãî õðàíèòñÿ â si
    or dl, 30h ; êîððåêòèðóåì çíà÷åíèå äëÿ ïðàâèëüíîãî âûâîäà ÷èñëà
    int 21h ; âûçûâàåì 21 ïðåðûâàíèå
    inc si ; óìåíüøàåì si íà åäèíèöó
    loop printNum ; âîçðàùàåìñÿ â íà÷àëî printNum
                
    mov ax, 4c00h
    int 21h
code ends
end start
Мой код. Меня интересует часть
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
addNums:
    mov al, [si] ; çàãðóæàåì çíà÷åíèå ýëåìåíòà ìàññèâà â al, àäðåñ êîòîðîãî õðàíèòñÿ â si 
    mov ah, [di] ; çàãðóæàåì çíà÷åíèå ýëåìåíòà ìàññèâà â al, àäðåñ êîòîðîãî õðàíèòñÿ â di
    add al, ah ; ñêëàäûâàåì çíà÷åíèÿ ýëåìåíòîâ ìàññèâà
    cmp al, forCompare1 ; ñðàâíèâàåì çíà÷åíèå al ñ 10 (íà ñëó÷àé, åñëè ñóììà ýëåìåíòîâ => 10)
    jb case1 ; âûïîëíÿåì case1 åñëè al < 10 
    jae case2 ; âûïîëíÿåì case2 åñëè al => 10
case1: 
    mov [si], al ; âîçâðàùàåì èçìåíåííîå çíà÷åíèå ýëåìåíòà ïåðâîãî ìàññèâà
    sub si, 1 ; óâåëè÷èâàåì si íà åäèíèöó
    sub di, 1; óâåëè÷èâàåì di íà åäèíèöó
    cmp cx, forCompare2 ; ñðàâíèâàåì çíà÷åíèå ðåãèñòðà cx ñ 0
    je cont ; åñëè ñõ = 0, òî âûõîäèì èç öèêëà
    loop addNums ; âîçðàùàåìñÿ â íà÷àëî addNums 
case2:
    aam ; ascii êîððåêöèÿ 
    mov [si], al ; âîçâðàùàåì èçìåíåííîå çíà÷åíèå ýëåìåíòà ïåðâîãî ìàññèâà 
    sub si, 1 ; óâåëè÷èâàåì si íà åäèíèöó
    mov al, [si] ; çàãðóæàåì ñëåäóþùåå çíà÷åíèå ýëåìåíòà ìàññèâà â al 
    add al, 1h ; óâåëè÷èâàåì ýòî çíà÷åíèå íà 1
    mov [si], al ; âîçðàùàåì èçìåíåííîå çíà÷åíèå îáðàòíî â ìàññèâ
    sub di, 1 ; óâåëè÷èâàåì di íà åäèíèöó
    cmp cx, forCompare2 ; ñðàâíèâàåì çíà÷åíèå ðåãèñòðà cx ñ 0
    je cont ; åñëè ñõ = 0, òî âûõîäèì èç öèêëà
    loop addNums ; âîçðàùàåìñÿ â íà÷àëî addNums
. Не обращайте внимания на коментарии. Вопрос вот в чем: почему в case1 и case2 по достижению cx 0 нет выхода из цикла по команде loop? Мне приходится делать это вручную
Assembler
1
2
cmp cx, forCompare2 ; ñðàâíèâàåì çíà÷åíèå ðåãèñòðà cx ñ 0
    je cont ; åñëè ñõ = 0, òî âûõîäèì èç öèêëà
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2015, 16:47
Ответы с готовыми решениями:

Цикл Loop в ассемблере
Здравствуйте, помогите пожалуйста переделать код под цикл Loop format PE entry start a dd...

команда loop
Какое число вставить вместо вопроса? mov ecx, 0 start_loop: ; the code here would be executed ?...

Существует ли переход для инструкции loop на дальнюю метку
существует ли в тасме для управлением цыклом команда loop дальняя метка ??? обычной длины loop...

Код команды loop
Подскажите, пожалуйста, есть строка ассемблерного листинга 00000049 E2 D4 loop cycle Что значат...

1
6558 / 2653 / 365
Регистрация: 17.02.2013
Сообщений: 3,884
10.06.2015, 16:54 2
А зачем ты, когда конец цикла loop достигнут при case1 исполняешь case2 ?
Цитата Сообщение от eremeevskij Посмотреть сообщение
loop addNums ; âîçðГ*Г№Г*åìñÿ Гў Г*Г*Г·Г*ëî addNums
case2:
Вот это место.
Если достигнут конец цикла, то начинает исполняться то, что после loop. А там case2
А от нее исполнение выкатится на второй loop. А cx-то уже равен нулю. Значит цикл нарежет еще 65536 оборотов.

Добавлено через 2 минуты
Может
Assembler
1
2
3
loop addNums ; âîçðГ*Г№Г*åìñÿ Гў Г*Г*Г·Г*ëî addNums 
jmp nafig
 case2:
где метка nafig должна стоять сразу после нижнего loop
Тогда при завершении по обоим loop управление придет в одну точку.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2015, 16:54

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

Loop в Debug.exe
-a 0100 MOV CL,01 0102 MOV AH,02 0104 MOV DL,2A ;* 0106 INT 21 0108 LOOP 102 010A INT...

цикл loop assembler
Всем привет! в чем ошибка? Разработать программу, подсчитывающую количество нулевых элементов...

Что делает команда loop $ ?
Имеется некоторая процедура подскажите что делает команда loop $. как работает команда Loop...

Цикл Loop вычислить величину капитала
Нужно написать программу, которая позволит вычислить величину капитала через 15 лет при постоянном...


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

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

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