Dale
Гость
|
|
« : 27-10-2004 16:15 » |
|
Подскажите мне мою ошибку. Данная программа должна выдать сумму всех отрицатльных элементов заданного массива в интервале от -4 до -15 Результат должен выводиться на экран.
model small .data mas db -2,0,2,-7,8,-12,1,3,-9,-18,11,12,-15 ;Инициализируем массив. Размер каждого элемента байт message db 'Сумма отрицательных элементов в интервале (-4,-15): $',0ah,0dh .stack 256 .code start:
mov ax,@data mov ds,ax
mov cx,13 ;Значение счетчика цикла mov dx,0 lea bx,mas
m1: mov ax,[bx] or ax,ax cmp ax,15 ;сравнить al c 4 jnle m2 ;перейти на метку если al=<-4 cmp ax,4 jnge m2 ;перейти на метку если al=>-15 add ax,30h add dx,ax m2: inc bx ;Переходим на следующий элемент массива loop m1 ;В начало цикла, если cx не равен 0
mov bx,dx mov ah,09h ;Выводим сообщение message lea dx,message int 21h
mov dx,bx mov ah,02h add dx,30h int 21h
exit: mov ah,4ch int 21h end start
Количество отрицательных элементов массива считается правельно, если поставить счетчик inc dx вместо сумирования элементов. Само сумирование не идет
Пробовал считать сумму положительных элементов массива на интервале от 4 до 15
Количество элементов при этом считается правельно, но сумма не выводится. Причем, в регистр dx записывается правельное значение суммы, но на экран оно не выводиться....
Подскажите кто что может.... Заранее спасибо
|
|
|
Записан
|
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #1 : 27-10-2004 17:45 » |
|
Ну ты чего-то с исходником наворотил прежде чем послать . Из того, что в текущем: получается, что ты считаешь непонятно что. model small .data mas db -2,0,2,-7,8,-12,1,3,-9,-18,11,12,-15 ;Инициализируем массив. Размер каждого элемента байт message db 'Сумма отрицательных элементов в интервале )-4,-15:{ $',0ah,0dh .stack 256 .code start{
mov ax,@data mov ds,ax
mov cx,13 ;Значение счетчика цикла mov dx,0 lea bx,mas
m1{ mov ax, bx ; or ax,ax лишнее по-моему cmp ax, -15 ;сравнить al c 15 jl m2 ;перейти на метку если al=<-15 cmp ax, -4 jg m2 ;перейти на метку если al=>-4 ; add ax,30h не пойму зачем {) add dx,ax m2{ inc bx ;Переходим на следующий элемент массива loop m1 ;В начало цикла, если cx не равен 0
mov bx,dx mov ah,09h ;Выводим сообщение message lea dx,message int 21h mov ah,02h mov dx,"код минуса" ; не помню конечно int 21h
; теперь подготовим сумму к выводу mov ax, dx mov bx, 10 idiv bx mov bx, ax mov ah, 06h mov dl, bl add dl, 30h int 21h mov ah, 02h mov dl, bh add dl, 30h int 21h
exit{ mov ah,4ch int 21h end start
Должно быть видимо вот так, или именно так и не работает? Или не сумма нужна, а количество? Ой, в первый раз забыл отформатировать и 30h прибавить перед выводом. Сейчас исправлю
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
Dale
Гость
|
|
« Ответ #2 : 29-10-2004 12:22 » |
|
Дико извеняюсь за ту хрень, которую забыл удалить пред отправкой мессаги. Это были эксперименты отчаянного меня.
Объясни логику того что ты делал при выводе символа наэкран
mov ah,02h mov dx,"код минуса" ; не помню конечно int 21h
; теперь подготовим сумму к выводу mov ax, dx mov bx, 10 idiv bx mov bx, ax mov ah, 06h mov dl, bl add dl, 30h int 21h mov ah, 02h mov dl, bh add dl, 30h int 21h
Я что-то не совсем ето понял. И еще. Скажи не легче будет складывать модули элементов массива в цикле, а потом дописать "-" к числу, как впринципе ты и делаешь???
И еще вопрос, ассемблер может выводить отрицательные числа на экран??? Если я не ошибаюсь разница между отрицательными и положительными цифрами заключается в старшем бите.... Как объеснить ассемблеру при выводе числа, что старший бит - знаковый???
И последний вопрос, но уже не по теме..... есть строка. Я заменяю в ней определенные символы на другие. Как заменить мне определенные символы на "$"? Это же вроде как конец строки. Ассемблер это так и понимает и ничего хорошего не делает.... Пример последнего кода:
model small .data stroka db 'A gdo-tO LonDonskiy dogdy OK','$' SMV DB '$' .stack 256 .code assume ds:@data, es:@data, ss:@data
start: mov ax,@data mov ds,ax mov es,ax lea bx,stroka ;Пишем в di адрес нашей строки mov cx,28 ;количество символов
m1: mov al,[bx] or al,al cmp al,40h ;сравнить al c jle m2 ;перейти на метку если cmp al,5Bh jge m2 mov al,25h ; Это код % Можно mov al,"%" mov [bx],al
m2: inc bx ;Переходим на следующий элемент массива loop m1 ;В начало цикла, если cx не равен 0
exit: ;Вывод на экран результата и выход mov ah,09h lea dx,stroka
int 21h mov ax,4c00h int 21h
end start
|
|
|
Записан
|
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #3 : 29-10-2004 13:31 » |
|
Dale, Я что-то не совсем ето понял. И еще. Скажи не легче будет складывать модули элементов массива в цикле, а потом дописать "-" к числу, как впринципе ты и делаешь???
Фиг его знает, но я об этом не подумал И кстати у меня еще одна ошибка, при знаковом делении, частное получиться со знаком, а остаток без, поэтому частное нужно neg вот здесь: ; теперь подготовим сумму к выводу mov ax, dx mov bx, 10 idiv bx mov bx, ax mov ah, 06h mov dl, bl neg dl ; здесь исправлено add dl, 30h int 21h mov ah, 02h mov dl, bh add dl, 30h int 21h
Фигня в том, что ассемблер, вообще не может выводить числа на экран самостоятельно, нужно превращать числа в символы и уже символы выводить на экран, что я собственно и делаю в этом куске кода. Сумма может быть двузначной, применим целочисленное деление на 10, в частном получим десятки, а в остатке единицы. Дорисовываем минус и выводим сначала десятки, потом единицы. 30h - это код нуля, если его прибавить к цифре, получим код этой цифры. И последний вопрос, но уже не по теме..... есть строка. Я заменяю в ней определенные символы на другие. Как заменить мне определенные символы на "$"? Это же вроде как конец строки. Ассемблер это так и понимает и ничего хорошего не делает....
Если честно, то по-моему никак Надо не использовать стандартные функции строковой обработки, а написать свои. Но я могу и ошибаться.
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
Dale
Гость
|
|
« Ответ #4 : 29-10-2004 13:58 » |
|
Конечный код: model small .data mas db -2,0,2,-7,8,-12,1,3,-9,-18,11,12,-15 ;Инициализируем массив. Размер каждого элемента байт message db 'Сумма отрицательных элементов в интервале (-4,-15): $',0ah,0dh .stack 256 .code start:
mov ax,@data mov ds,ax
mov cx,13 ;Значение счетчика цикла mov dx,0 lea bx,mas m1: mov al,[bx] or al,al cmp al,-4 jnle m2 cmp al,-15 jnge m2 add dx,ax
m2: inc bx loop m1
mov bx,dx mov ah,09h ;Выводим сообщение message lea dx,message int 21h
mov dx,bx ; теперь подготовим сумму к выводу mov ax,dx mov bx,10h idiv bx ;mov bx, ax ;mov ah, 06h ;mov dl, bl ;neg dl ; здесь исправлено ;add dl, 30h ;int 21h ;mov ah, 02h ;mov dl, bh ;add dl, 30h ;int 21h
;mov ah,02h ;add dl,30h ;int 21h
exit: mov ah,4ch int 21h end start Компиляция идет нормально. При выполнении программы выдается Divide overflow
Я так понимаю - это переполнение. Ошибка возникает при делении на 10
|
|
|
Записан
|
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #5 : 29-10-2004 14:06 » |
|
Все может быть я же не тестирую код. Попробуй mov bl, 10 idiv bl Ой-ей-ей ты же делишь на шестнадцать mov bx,10h idiv bx
Тогда напиши mov bl, 0Ah или все-таки просто 10 или можно neg ax, а потом div bl. Тогда не надо будет думать о знаках остатка и частного. Даже наверное лучше так сделать. Еще можешь понавтыкать отладочные сообщения, хотя в данном случае и так ясно, что переполнение при делении
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
|