Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
КротВалера
0 / 0 / 1
Регистрация: 05.02.2012
Сообщений: 15
#1

Посмотрите, что можете подсказать - Assembler

16.09.2014, 12:18. Просмотров 352. Ответов 13
Метки нет (Все метки)

Помогите причесать код. Может покритикуете.

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
TITLE KR    ; название программы
 
.MODEL small    ; отводим под стек и под данные по 64 Кб
 
.STACK 100h ; отмечаем начало сегмента стека
 
.DATA       ; отмечаем начало сегмента данных
ARR1 DB 10,74,13,26,11,8,0,62,1
LEN_ARR1 DW $-ARR1
ARR2 DB 88,24,0,54,87,22,101,16,35
LEN_ARR2 DW $-ARR2
FL DB 0
 
.CODE       ; отмечаем начало сегмента кодов
main PROC
mov AX, @data
mov DS, AX  
lea BX, ARR1
mov CX, LEN_ARR1 
call PROCESSING_
mov AL, 0Dh ; возврат каретки
int 29h
mov AL, 0Ah ; перевод строки
int 29h
lea BX, ARR2
mov CX, LEN_ARR2
call PROCESSING_
mov AH, 0
int 16h
mov AX, 4C00h
int 21h
main ENDP
 
; ----- процедура обработки массива -----
processing_ PROC
xor SI, SI
xor AX, AX
CYCLE:
mov AL, [BX+SI]
test AL, 1
jnz L1
call OUTPUT_
L1:
inc SI
loop CYCLE
 
processing_ ENDP
 
; ------- процедура вывода -------
output_ PROC
aam
add AX, 3030h 
mov DL, AH 
mov DH, AL 
mov AH, 02 
int 21h 
mov DL, DH 
int 21h
mov AX, ' '
int 29h
ret
output_ ENDP
 
END main
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2014, 12:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Посмотрите, что можете подсказать (Assembler):

посмотрите надеюсь что задание для ассемблер
дали задание на заочном отделении, абсолютно не понимаю перерыла весь интернет...

Написал код, а он не работает. Посмотрите, что с ним не так? =)
Создать консольную программу, которая определяет число вызовов таймера. В...

Что можете посоветовать в качестве "задачника" по ассемблеру
Собственно, так получилось, что 28 числа нужно будет пересдавать...

можете прокомментировать код?
.model small .stack 100h .data ch_get db 13 ten db 10 ten_w dw 10 ...

Может кто подсказать хорошую книгу , или какой нибудь полезный источник по masm32 ?
Может кто подсказать хорошую книгу , или какой нибудь полезный источник по...

Можете подсказать что за тип TVATP?
Добрый день расскажите про тип TVATP для чего нужен как используется по...

13
Полный 30h
Эксперт быдлокодинга
1532 / 445 / 61
Регистрация: 04.11.2010
Сообщений: 1,219
16.09.2014, 17:50 #2
Не совсем понял в одном случае используется int 21h Fn 02, а в другом отдаётся предпочтение Int 29h.

Assembler
1
2
3
4
5
6
7
8
lea BX, ARR1
xor SI, SI
 
CYCLE:
mov AL, [BX+SI]
...
inc SI
loop CYCLE
можно немножко сократить

Assembler
1
2
3
4
5
6
7
8
9
10
cld ; достаточно указать один раз где то до начала первого "processing_"
lea SI, ARR1
; xor SI, SI
 
 
CYCLE:
lodsb 
...
;inc SI
loop CYCLE
0
Mikl___
Автор FAQ
11362 / 5905 / 533
Регистрация: 11.11.2010
Сообщений: 10,931
16.09.2014, 17:52 #3
КротВалера,
а попробуй заменить 101 на 102 и посмотри какую ерунду выведет твоя программа, твой вывод работает только от 0 до 99
0
Полный 30h
Эксперт быдлокодинга
1532 / 445 / 61
Регистрация: 04.11.2010
Сообщений: 1,219
16.09.2014, 18:10 #4
А вообще конечно помимо программы неплохо указывать цель, которую автор преследует своим кодом. Потому как между тем что пытается изобразить автор и тем что на самом деле делает код может лежать такая пропасть, до середины которой редкий телепат долетит

Добавлено через 11 минут
Цитата Сообщение от Mikl___ Посмотреть сообщение
а попробуй заменить 101 на 102 и посмотри какую ерунду выведет твоя программа, твой вывод работает только от 0 до 99
да вроде команда aam как бы уже это подразумевает
1
Mikl___
Автор FAQ
11362 / 5905 / 533
Регистрация: 11.11.2010
Сообщений: 10,931
16.09.2014, 18:17 #5
Цитата Сообщение от Полный 30h Посмотреть сообщение
да вроде команда aam как бы уже это подразумевает
но знает ли об этом ТС?
ARR2 DB 88,24,0,54,87,22,101,16,35 Судя по решению подразумевается вывод на экран четных чисел из массивов ARR1 и ARR2 101 нечетное число и поэтому не вывелось, но если сделать его четным 100 или 102 то получим ошибку, команда aam примененная дважды позволяет выводить на экран числа от 0 до 255, а можно предусмотреть еще и вывод отрицательных чисел
1
Полный 30h
Эксперт быдлокодинга
1532 / 445 / 61
Регистрация: 04.11.2010
Сообщений: 1,219
16.09.2014, 18:27 #6
Массив и не глянул даже, спасибо. А вообще забавно, то народ условие без кода вываливает, теперь вот код без условия. Тренируют наверное местных гуру
0
Mikl___
Автор FAQ
11362 / 5905 / 533
Регистрация: 11.11.2010
Сообщений: 10,931
16.09.2014, 18:30 #7
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
    mov al,247
    aam
    add al,'0'
    push ax
    mov al,ah
    aam
    add ax,'00'
    rol ax,8
    int 29h
    rol ax,8
    int 29h
    pop ax
    int 29h
2
КротВалера
0 / 0 / 1
Регистрация: 05.02.2012
Сообщений: 15
17.09.2014, 04:49  [ТС] #8
Виноват, действительно, как заметил Mikl, вывожу четные элементы массивов. Про работу команды aam и правда этой тонкости не знал, буду изучать что-то более объемное, чем краткое описание. Очень заинтересовала возможность обработки и отрицательных элементов, но временно отложил изучение. Отпуск кончился, на работе времени пока нет заняться.
0
Mikl___
Автор FAQ
11362 / 5905 / 533
Регистрация: 11.11.2010
Сообщений: 10,931
17.09.2014, 06:50 #9
Цитата Сообщение от КротВалера Посмотреть сообщение
Про работу команды aam и правда этой тонкости не знал, буду изучать что-то более объемное, чем краткое описание.
КротВалера,
http://www.cyberforum.ru/assembler-articles/thread1005284.html для начала хватит
1
КротВалера
0 / 0 / 1
Регистрация: 05.02.2012
Сообщений: 15
17.09.2014, 13:40  [ТС] #10
Огромное спасибо за учебник. С вашим кодом вывода на экран тоже быстро разобрался.

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
TITLE KR        ; название программы
 
.MODEL small        ; отводим под стек и под данные по 64 Кб
 
.STACK 100h     ; отмечаем начало сегмента стека
 
.DATA           ; отмечаем начало сегмента данных
ARR1 DB 15,174,143,6,105,118,12
LEN_ARR1 DW $-ARR1
ARR2 DB 68,214,0,87,22,188,55
LEN_ARR2 DW $-ARR2
 
.CODE           ; отмечаем начало сегмента кодов
main PROC
mov AX, @data       ; копируем адрес
mov DS, AX              ; сегмента данных
lea BX, ARR1            ; помещаем в BX смещение массива ARR1
mov CX, LEN_ARR1    ; помещаем в CX длину массива ARR1
call PROCESSING_    ; вызываем процедуру PROCESSING_
mov AL, 0Dh     ; возврат
int 29h         ; каретки
mov AL, 0Ah     ; перевод
int 29h         ; строки
lea BX, ARR2        ; помещаем в BX смещение массива ARR2
mov CX, LEN_ARR2    ; помещаем в CX длину массива ARR2
call PROCESSING_    ; вызываем процедуру PROCESSING_
mov AH, 0       ; выполнить ввод
int 16h         ; с клавиатуры
mov AX, 4C00h       ; выход из
int 21h         ; программы
main ENDP
 
; ------- процедура обработки массива -------
processing_ PROC
xor SI, SI      ; очищаем регистр SI
xor AX, AX      ; очищаем регистр AX
CYCLE:
mov AL, [BX+SI]     ; помещаем в AL байт по адресу [BX+SI]
test AL, 1      ; если нулевой бит регистр AL равен 1,
jnz L1          ; то переходим на метку L1
call OUTPUT_        ; иначе, вызываем процедуру OUTPUT_
L1:
inc SI          ; инкрементируем регистр SI
loop CYCLE      ; циклично повторяем действия
processing_ ENDP
 
; ------- процедура вывода -------
output_ PROC
push CX         ; помещаем в стек содержимое регистра CX
mov CL, 8       ; помещаем в CL константу 8
aam         ; преобразовываем содержимое AL
            ; в неупакованный BCD-эквивалент
            ; в AH - частное, в AL - остаток
add AL, '0'     ; преобразуем в ASCII-представление
push AX         ; помещаем в стек содержимое регистра AX
mov AL, AH      ; помещаем в AL содержимое регистра AH
aam         ; преобразовываем содержимое AL
            ; в неупакованный BCD-эквивалент
            ; в AH - частное, в AL - остаток
add AX, '00'        ; преобразуем в ASCII-представление
rol AX, CL      ; меняем местами содержимое регистров AH и AL
int 29h         ; выводим содержимое AL на экран (сотни)
rol AX, CL      ; меняем местами содержимое регистров AH и AL
int 29h         ; выводим содержимое AL на экран (десятки)
pop AX          ; восстанавливаем из стека
            ; содержимое регистра AX
int 29h         ; выводим содержимое AL на экран (единицы)
mov AX, ' '     ; помещаем в AX код символа "пробел"
int 29h         ; выводим на экран символ "пробел"
pop CX          ; восстанавливаем из стека
            ; содержимое регистра CX
ret         ; возврат из подпрограммы
output_ ENDP
 
END main
Результат выполнения кода следующий:
174 006 118 012 032
068 214 000 022 188 055


Не пойму, почему если массив заканчивается четным значением, выводится еще и 032 (подозреваю, что тут виноват STX, ascii-код 02h). Если нечетным, то выводится этот нечетный член массива. Разве я не верно выполняю проверку на четность?
0
Not at all!
193 / 190 / 18
Регистрация: 06.10.2013
Сообщений: 360
17.09.2014, 14:00 #11
Цитата Сообщение от КротВалера Посмотреть сообщение
почему если массив заканчивается четным значением, выводится еще и 032
Assembler
1
2
loop CYCLE      ; циклично повторяем действия
processing_ ENDP
ret между этими строками не хватает.
0
Полный 30h
Эксперт быдлокодинга
1532 / 445 / 61
Регистрация: 04.11.2010
Сообщений: 1,219
17.09.2014, 22:30 #12
КротВалера,
вот это всё
Assembler
1
2
3
4
5
6
push CX         ; помещаем в стек содержимое регистра CX
mov CL, 8       ; помещаем в CL константу 8
.....
rol AX, CL      ; меняем местами содержимое регистров AH и AL
.....
pop CX          ; восстанавливаем из стека
можно делать проще
Assembler
1
rol AX, 8      ; меняем местами содержимое регистров AH и AL
или
Assembler
1
xchg AH,AL      ; меняем местами содержимое регистров AH и AL
Добавлено через 2 минуты
lodsb так и не освоил...
0
КротВалера
0 / 0 / 1
Регистрация: 05.02.2012
Сообщений: 15
18.09.2014, 04:53  [ТС] #13
Нет, lodsb (lodsw/lodsd) освоил, применял в предыдущей лабораторной. Сейчас, увы, не могу применить, ограничение по заданию. А вот
Assembler
1
rol ax, 8
не работает, говорит: Rotate count out of range (Недопустимое значение для счетчика сдвига, на сколько мне позволяет понять мой английский). Про эксчейндж, кстати, забыл совсем, видеть видел - вспомнить или предположить - не предположил и не вспомнил. Его применю, дабы код избыточным не был.
p.s. Асм дается крайне туго, это похоже не моё, дельфи и шарп были проще, а тут нужно мыслить совсем иначе.
0
Mikl___
Автор FAQ
11362 / 5905 / 533
Регистрация: 11.11.2010
Сообщений: 10,931
18.09.2014, 04:56 #14
КротВалера,
перед строкой ".MODEL small" вставь строку ".286" и тогда rol ax, 8 заработает
0
18.09.2014, 04:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2014, 04:56
Привет! Вот еще темы с решениями:

Массив? ArrayList? Что можете подсказать?
Добрый всем день. Я новичок в программировании. Возник вопрос, что же лучше...

Не работает код, можете подсказать, что не так?
Имеется собственный класс с несколькими полями, пытаюсь записать его в бинарное...

Что можете подсказать по этой видеокарте intel hd video 1274 mb
Добрый день форумчане. Подскажите на что способна эта видеокарта intel hd video...

Можете подсказать что не так.Я недавно начал работать в матлабе,и еще не все знаю
Gapa=4900/3600; %Debitul de apa, ti=17; %Temperatura de intrare a apei,...


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

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

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