Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 2
1
TASM

Деление регистра на регистр

12.01.2017, 15:42. Показов 4799. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
model small
.stack  100h    
.data        
len db  5          
len2 db 10     
masA    db  1,2,3,4,5,1,1,1,1,1
masB    db  2,2,1,3,2   
res db  5
res2 db    10
.code
 
c2:
mov ax,bl   
mov bx,len 
div bx  
mov res,al
jmp c3
 
c4: 
mov ax,dl
mov bx,len2 
div bx  
mov res2,al
jmp tata
 
next:
inc si   
cmp si,4
ja c2
jmp c1
 
next2:
inc si  
cmp si,9
ja c4
jmp c3
 
start:     
mov ax,@data    
mov ds,ax   
xor ax,ax
xor bx,bx
xor dx,dx 
xor si,si
 
c1:
add bl,masB[si]  
Call next
 
c3:
add dl,MasA[si]  
Call next2
 
tata:
 
 
exit:
mov ax,4c00h    
int 21h 
end start
Написал данную программу. Она должна находить среднее арефметическое каждого из двух массивов. Сумма массивов заноситься в регистры dl и bl в подпрограммах с1 и с3. Проверка условия на то надо ли делить сумму для получения среднего арефметического выполняется в подпрограммах next и next2 для каждого массива. Деление суммы на количество элементов происходит в подпрограммах с2 и с4. И тут возникает проблема-массивы masA и masB являются числами размером в байт(masB db 2,2,1,3,2 masA db 1,2,3,4,5,1,1,1,1,1) и длина len и len2 тоже (len db 5 len2 db 10). Поэтому заносить делимое нужно в регистр ax (так написано в методичке), но при созданиии файла формата obj выдаёт ошибку operand tipes do not match. Я так понимаю, ругается на несовместимость типов данных(типа как в c++ приравнять переменную типа double к переменной типа char), но ума не приложу как можно исправить эту ошибку при делении.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2017, 15:42
Ответы с готовыми решениями:

Как в регистр сопроцессора записать значение регистра ах?
Как в регистр сопроцессора записать значение регистра ах, например? И как обратно передать значение...

Занести в регистр AX значение регистра CS, а в регистр BL записать заданное число
Здравствуйте, у меня такая проблема: Нужно составить программу, которая заносит в регистр AX...

Осуществить деление содержимого регистра на содержимое ячейки памяти
Осуществить деление содержимого регистра DX=5643 на содержимое ячейки памяти. Занести значение...

Как проверить, что регистр умножения будет занимать больше одного регистра?
как проверить что регистр уиножения будет занимать больше одного регистра?

3
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
12.01.2017, 15:50 2
Цитата Сообщение от StepanKrab Посмотреть сообщение
mov ax,dl
mov bx,len2
div bx
Команда div
делит двойное слово dx:ax на делитель, если делитель - слово, при этом частное в ax, остаток в dx
делит слово ax на делитель, если делитель - байт, при этом частное в al, остаток в ah

Добавлено через 1 минуту
Assembler
1
2
3
4
mov al, dl
mov ah, 0 ;старший байт делимого занулим
mov bl, len2
div bl
вот так ты поделишь байт dl на байт len2

Добавлено через 2 минуты
Кстати в начале твоей программы ни bl, ни dl никак не определяются и ты начинаешь ими, такими неопределенными, пользоваться.
1
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
12.01.2017, 16:15 3
Предложу свой скромный вариант
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
.model small
.data
masA db 1,2,3,4,5,1,1,1,1,1
lenA db $-offset masA
masB db 2,2,1,3,222
lenB db $-offset masB
resA db 0
resB db 0
.stack 100h
.code
start:
mov ax,@data
mov ds,ax
 
lea si,masA
mov cl,lenA
call Average
mov resA,al
 
lea si,masB
mov cl,lenB
call Average
mov resB,al
    
mov ax, 4c00h
int 21h
 
Average:
xor ch,ch
xor ax,ax
mov bl,cl
S1:add al,[si]
   adc ah,0
   inc si
   loop S1
div bl
ret
end
1
0 / 0 / 0
Регистрация: 12.01.2017
Сообщений: 2
12.01.2017, 16:49  [ТС] 4
Цитата Сообщение от Ethereal Посмотреть сообщение
Команда div
делит двойное слово dx:ax на делитель, если делитель - слово, при этом частное в ax, остаток в dx
делит слово ax на делитель, если делитель - байт, при этом частное в al, остаток в ah

Добавлено через 1 минуту
mov al, dl
mov ah, 0 ;старший байт делимого занулим
mov bl, len2
div bl
вот так ты поделишь байт dl на байт len2

Добавлено через 2 минуты
Кстати в начале твоей программы ни bl, ни dl никак не определяются и ты начинаешь ими, такими неопределенными, пользоваться.
Спасибо, всё заработало)
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
model small
.stack  100h    
.data        
len db  5          
len2 db 10     
masA    db  1,2,3,4,5,1,1,1,1,1
masB    db  2,2,1,3,2   
res db  5
res2 db    10
.code
 
c2:
mov al, bl
mov ah, 0
mov dl, len
div dl
mov res,al
mov si, 0
jmp c3
 
c4:
mov ah, 0
mov bl, 0
mov al, 0
mov al, dl
mov bl, len2
div bl
mov res2,al
jmp tata
 
next:
inc si   
cmp si,4
ja c2
jmp c1
 
next2:
inc si  
cmp si,9
ja c4
jmp c3
 
start:     
mov ax,@data    
mov ds,ax   
xor ax,ax
xor bx,bx
xor dx,dx 
xor si,si
 
c1:
add bl,masB[si]  
Call next
 
c3:
add dl,MasA[si]  
Call next2
 
tata:
 
 
exit:
mov ax,4c00h    
int 21h 
end start
Вот финальная версия проги, может пригодиться тем кто темы просматривать будет, если не секрет как правильно обьявить используемые регистры в start?
0
12.01.2017, 16:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2017, 16:49
Помогаю со студенческими работами здесь

Записать в регистр bx старшую половину регистра eax с одновременным ее обнулением в регистре eax
Необходимо создать программу на ассемблере (любом) перезаписывающую в регистр bx старшую половину...

Даны два числа. Записать в регистр SI меньшее, а в регистр DI - большее из них
Даны два числа. Записать в регистр SI меньшее, а в регистр DI - большее из них.

Поместить в регистр BX константу 100 (16). Старший байт BX переместить в регистр BL
здраствуйте помогите пож-та разобраться в задаче!написал прогу но не работает! Поместить в регистр...

(MCS-51) Внести в регистр А двоично-десятичное число XX, в регистр R5 — XX
Внести в регистр А двоично-десятичное число XX, в регистр R5 - XX, попеременно отображать эти числа...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru