Задача на ассемблере
| |
gil9red | Дата: Воскресенье, 22 Января 2012, 13:10 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Здравствуйте, помогите разобраться в чем ошибка моей программы
Смысл такой: есть два массива по 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 Так меньше кода будет.
Quote (gil9red) ждем пока пользователь не нажмет какой нибудь символ Нажать символ (на клавиатуре)?
*** Quote (gil9red) lea dx, [msg2] Вот не знаю, чем это лучше, но в книге, которую я читал, предлагалось вот так писать (mov с директивой offset): Наверное, это одно и тоже...
Сообщение отредактировал 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 ругается на
и соответственно на
пишет не соответствие типов операндов, что ему конкретно не нравится? может действия с массивом, или регистр bx не подходит как временный буфер?
я написал так
и все равно компилятор не доволен
может это из-за индексации массива в asm? в моем коде индекс сначало равен 0
Добавлено (22.01.2012, 16:57) --------------------------------------------- или из-за того что переменная sum1 двухбайтовая, а эл-ты массива однобайтовые?
В программировании нет совершенства, но к нему нужно стремиться. ©
Сообщение отредактировал gil9red - Воскресенье, 22 Января 2012, 16:58 |
|
| |
|