Need help!!! Сумма э-ов под главной диаганалью

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
HiGenius
Сообщения: 4
Зарегистрирован: 03 ноя 2009, 21:47

Дана матрица 6х6. Определить суммы элементов над и под главной диагональю.
Выводится ошибка. Не могу найти где.

Вот мой код

Код: Выделить всё


; Template for console application
         .586
         .MODEL  flat, stdcall
         OPTION CASEMAP:NONE

Include kernel32.inc
Include masm32.inc

IncludeLib kernel32.lib
IncludeLib masm32.lib

         .CONST
MsgExit  DB    0AH,0DH,"Press Enter to Exit",0AH,0DH,0

         .DATA
Note DB 13,10,'input array 6x6   ',0
ResultMsg DB 'Result= '
resstr db 16 dup(' ')



         .DATA?
buffer db 100 dup (?)       
inbuf    DB    100 DUP (?)
result dword ?
array dword 36 dup (0)
r dword ?
k dword ?

         .CODE
Start:
;vvod massiva

        Mov ECX,36
        Mov EBX,0
Label1:
        push ECX
        Invoke StdOut,addr Note
        Invoke StdIn,addr buffer,lengthof buffer 
        Invoke StripLF,addr buffer
        Invoke atol,addr buffer 
        mov dword ptr array[EBX],eax
        add EBX,4
        pop ECX
        Mov r,0               ;perviy prohod po vnutrennemu ciklu 0 raz
        Loop Label1
        mov	EAX,0
		lea	EBX,array          ;postavil ukazatel' v nachalo matrici
		mov	ECX,5              ;zadal kolichestvo povtoreniy
  cycle:
        Push ecx               ;pomeschayu v stek schetchik
        mov ECX,r              ;zadayu noviy schetchik
  cycle2:
        add EAX,0[EBX]        ;nachinayu c 1 elementa no ne prohogu v perviy raz t.k. schetchik = 0
        add ebx,4              ;pribavlyayu 4 bayta
        inc r                  ;uvelichivayu sled prohod po vnutrennemu ciklu na 1
        pop ecx                ;vitaskivayu znachenie dlya vneshnego schetchika
		loop cycle2          
        add ebx,24             ;izmenyayu sled poziciyu na 6 elementov 
        Loop cycle
        mov result,EAX	       ;zapisivayu resultat

        Invoke dwtoa,result,addr resstr
         Invoke StdOut,addr ResultMsg
         XOR    EAX,EAX
        Invoke StdOut,ADDR MsgExit
        Invoke StdIn,ADDR inbuf,LengthOf inbuf	 
        
         Invoke ExitProcess,0
         End    Start
         
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

Код: Выделить всё

cycle:
        Push ecx               ;pomeschayu v stek schetchik
        mov ECX,r              ;zadayu noviy schetchik
  cycle2:
        add EAX,0[EBX]        ;nachinayu c 1 elementa no ne prohogu v perviy raz t.k. schetchik = 0
        add ebx,4              ;pribavlyayu 4 bayta
        inc r                  ;uvelichivayu sled prohod po vnutrennemu ciklu na 1
[B]        pop ecx                ;vitaskivayu znachenie dlya vneshnego schetchika
		loop cycle2  [/B]        
        add ebx,24             ;izmenyayu sled poziciyu na 6 elementov 
        Loop cycle
неправильно работаете со стеком во сложенном цикле
icq:3(один)7748666
mail:airyashov( а)inbox.ru
HiGenius
Сообщения: 4
Зарегистрирован: 03 ноя 2009, 21:47

Спасибо за помощь. Возник следующий вопрос. Почему нельзя назначать количество "LOOP"ов равное нулю. То есть если я ECX приравниваю ноль то идёт бесконечный цикл...относительно бесконечный равный (FFFFFFFF).
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

именно так предварительно нужно проверить на 0 перед циклом
icq:3(один)7748666
mail:airyashov( а)inbox.ru
HiGenius
Сообщения: 4
Зарегистрирован: 03 ноя 2009, 21:47

Код: Выделить всё


; Template for console application
         .586
         .MODEL  flat, stdcall
         OPTION CASEMAP:NONE

Include kernel32.inc
Include masm32.inc

IncludeLib kernel32.lib
IncludeLib masm32.lib

         .CONST
MsgExit  DB    0AH,0DH,"Press Enter to Exit",0AH,0DH,0

         .DATA
Note DB 13,10,'input array 4x4   ',0
ResultMsg DB 'Result= '
resstr db 16 dup(' ')



         .DATA?
buffer db 100 dup (?)       
inbuf    DB    100 DUP (?)
result dword ?
array dword 16 dup (0)
r dword ?
k dword ?

         .CODE
Start:
;vvod massiva

        Mov ECX,16
        Mov EBX,0
Label1:
        push ECX
        Invoke StdOut,addr Note
        Invoke StdIn,addr buffer,lengthof buffer 
        Invoke StripLF,addr buffer
        Invoke atol,addr buffer 
        mov dword ptr array[EBX],eax
        add EBX,4
        pop ECX
        Loop Label1
        Mov edx,1               
        mov	EAX,0
		lea	EBX,array          
		mov	ECX,3  
		add ebx,16            
  cycle:
        Push ecx               
        mov ECX,edx              
  cycle2:
        add EAX,0[EBX]        
        add ebx,4            
		loop cycle2 
		Push EAX
        mov ecx,4
        sub ecx,edx
        inc edx                  
        mov eax,ecx
        mov ecx,4
        imul eax,ecx
        add ebx,eax 
        pop EAX           
        pop ECX               
        Loop cycle
        mov result,EAX	      

        Invoke dwtoa,result,addr resstr
         Invoke StdOut,addr ResultMsg
         XOR    EAX,EAX
        Invoke StdOut,ADDR MsgExit
        Invoke StdIn,ADDR inbuf,LengthOf inbuf	 
        
         Invoke ExitProcess,0
         End    Start
         

Спасибо помощь, всё получилось. Вот готовый код (masm).
Виктор Александрович
Сообщения: 3
Зарегистрирован: 07 ноя 2009, 01:45

HiGenius писал(а):Спасибо за помощь. Возник следующий вопрос. Почему нельзя назначать количество "LOOP"ов равное нулю. То есть если я ECX приравниваю ноль то идёт бесконечный цикл...относительно бесконечный равный (FFFFFFFF).
LOOP уменьшает счетчик на единицу после каждого шага, до тех пор, пока счетчик не становится равнім нолю. т.е. выполнил шаг, отнял единицу от счетчика, сравнил его с нолем. если установить изначально 0, то он после выполнения в регистре появится -1, что нолику явно не равно, поэтому он будет выполнятся до FFFFFFFF, потому что это уже переполнения разрядной сетки, там флаговый регистр остановит цикл.
HiGenius
Сообщения: 4
Зарегистрирован: 03 ноя 2009, 21:47

Спасибо за пояснение.
Ответить