Пятница, 19 Апреля 2024, 23:34

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Низкоуровневое программирование » Задача на ассемблере (не могу понять в чем ошибка)
Задача на ассемблере
gil9redДата: Воскресенье, 22 Января 2012, 13:10 | Сообщение # 1
частый гость
Сейчас нет на сайте
Здравствуйте, помогите разобраться в чем ошибка моей программы cry

Смысл такой: есть два массива по 10 элементов, они содержат однобайтовые целые числа без знака
нужно определить двухбайтовую сумму эл-тов массивов, какого массива больше, и вывести на экран
строку с соответствующим сообщением

[code]
.MODEL SMALL
.STACK 100h
.DATA
mas1 db 2,3,1,1,4,5,2,1,2,2
mas2 db 4,1,1,4,4,3,3,5,1,2

msg1 db 'Mas1 > Mas2', 13, '$'
msg2 db 'Mas2 > Mas1', 13, '$'

sum1 dw 0
sum2 dw 0

count equ 10

.CODE

start:

; текущий индекс массива
mov ax, 0

; кол-во повторений цикла
mov cx, count

l1:
mov bx, mas1[ax]
add sum1, bx
inc ax
loop l1

mov ax, 0
l2:
mov bx, mas2[ax]
add sum2, bx
inc ax
loop l2

cmp sum1, sum2
JG end1
JL end2

end2:
; выводим строку
lea dx, [msg2]
mov ah,9h
int 21h

; ждем пока пользователь не нажмет какой нибудь символ
mov ah,1h
int 21h
; выход в ос
ret

end1:
; выводим строку
lea dx, [msg1]
mov ah,9h
int 21h

; ждем пока пользователь не нажмет какой нибудь символ
mov ah,1h
int 21h
; выход в ос
ret

end start
[code]


В программировании нет совершенства, но к нему нужно стремиться. ©

Сообщение отредактировал gil9red - Воскресенье, 22 Января 2012, 13:27
GECKДата: Воскресенье, 22 Января 2012, 15:46 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
А в что выдает программа? Асма под рукой нет, увы, говорю навскидку:
Quote (gil9red)
; кол-во повторений цикла
mov cx, count

l1:
mov bx, mas1[ax]
add sum1, bx
inc ax
loop l1

; может здесь тоже нужен mov cx, count ?

mov ax, 0
l2:
mov bx, mas2[ax]
add sum2, bx
inc ax
loop l2


Всё гениальное просто. И хреново работает.
TimKruzДата: Воскресенье, 22 Января 2012, 16:07 | Сообщение # 3
старожил
Сейчас нет на сайте
Quote (GECK)
А в что выдает программа? Асма под рукой нет, увы, говорю навскидку: может здесь тоже нужен mov cx, count ?

Точно. Правильно так:
Code
mov ax, 0
mov cx, count
l1:
mov bx, mas1[ax]
add sum1, bx
inc ax
loop l1
mov ax, 0
mov cx, count
l2:
mov bx, mas2[ax]
add sum2, bx
inc ax
loop l2

Первый цикл обнуляет cx, так что второй цикл выполнится только один раз.
Дальше, вроде бы, ошибок нет. Вот только на счёт рациональности: ожидание нажатия клавиши лучше написать один раз, а потом просто ссылку вставить. Тоже касается вывода строки...
Code
cmp sum1, sum2
JG end1
JL end2

end2:
lea dx, [msg2]
jmp endprog

end1:
lea dx, [msg1]

endprog:
mov ah,9h
int 21h

mov ah,1h
int 21h
ret

end start

Так меньше кода будет. smok

Quote (gil9red)
ждем пока пользователь не нажмет какой нибудь символ

Нажать символ (на клавиатуре)? laugh

***
Quote (gil9red)
lea dx, [msg2]

Вот не знаю, чем это лучше, но в книге, которую я читал, предлагалось вот так писать (mov с директивой offset):
Code
mov dx, offset msg2

Наверное, это одно и тоже...




Сообщение отредактировал TimKruz - Воскресенье, 22 Января 2012, 16:15
gil9redДата: Воскресенье, 22 Января 2012, 16:57 | Сообщение # 4
частый гость
Сейчас нет на сайте
GECK, программа просто выдает текст в консоли, в каком массиве сумма эл-тов больше)
Quote, ты прав, я ошибся в комментариях, нажатие клавиши, а не символа)

Добавлено (22.01.2012, 16:38)
---------------------------------------------
да и циклы можно было объединить=)

mov cx, count
lall:
mov bx, mas1[ax]
add sum1, bx

mov bx, mas2[ax]
add sum2, bx

inc ax
loop lall

Добавлено (22.01.2012, 16:56)
---------------------------------------------
скажите пожалуйста,
во время создания obj файла компилятор tasm ругается на
Code

mov bx, mas1[ax]


и соответственно на

Code

mov bx, mas2[ax]


пишет не соответствие типов операндов, что ему конкретно не нравится?
может действия с массивом, или регистр bx не подходит как временный буфер?

я написал так
Code
   
add sum1, mas1[ax]


и все равно компилятор не доволен

может это из-за индексации массива в asm?
в моем коде индекс сначало равен 0

Добавлено (22.01.2012, 16:57)
---------------------------------------------
или из-за того что переменная sum1 двухбайтовая, а эл-ты массива однобайтовые?


В программировании нет совершенства, но к нему нужно стремиться. ©

Сообщение отредактировал gil9red - Воскресенье, 22 Января 2012, 16:58
Форум игроделов » Программирование » Низкоуровневое программирование » Задача на ассемблере (не могу понять в чем ошибка)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг