2013-02-14 3 views
0

Моя программа будет получать номера в виде ввода от пользователя, используя массив, и будет печатать номера на мониторе. SO ожидает ввода и вывода моей программы выглядит следующим образом:Array Input, Output

i/p: 1 2 3 4 
    o/p: 1 2 3 4 

Но моя программа дает выход этим способом, исключая номер:

o/p: 4 3 2 

Моя программа выглядит следующим образом:

section .data 
     msg db "%d" 
     four dd 4 
     msga db "%d",10,0 
    section .bss 
     arr resd 4 
    section .text 
     global main 
     extern printf,scanf 
    main: 
     xor ecx,ecx 
    lp: 
     mov ebx,arr 
     mov eax,ecx 
     mul dword[four] 
     add ebx,eax 
     pusha 

     push ebx 
     push msg 
     call scanf 
     add esp,8 
     popa 
     inc ecx 
     cmp ecx,4 
     jnz lp 

     mov ecx,3 
lp1: 
     mov ebx,arr 
     mov eax,ecx 

     mul dword[four] 
     add ebx,eax 
     pusha 
      push dword[ebx] 
     push msga 
     call printf 
     add esp,8 
     popa 
      dec ecx 
     jg lp1 

Вы посоветуете мне в этой программе? Я использую Ubuntu 11.04 Thanx заранее

ответ

1

В первом контуре, ecx изменяется от 0 до 4:

xor ecx,ecx ;;; ecx <= 0 
lp: 
... 
inc ecx ;;; ecx <= ecx + 1 
cmp ecx, 4 
jnz lp ;;; if (ecx!=4) goto lp; 

Во втором цикле, ecx изменяется от 3 DOWNTO 0, но не включая 0 :

xor ecx, ecx ;;; ecx <= 0, useless here 
mov ecx, 3 ;;; ecx <= 3, overwrites 0 
lp1: 
... 
loop lp1  ;;; ecx <= ecx-1; if (ecx>0) goto lp1; 

вы можете реорганизовать вторую петлю, чтобы сделать это так же, как первый, если вы хотите напечатать тот же массив в том же порядке. Просто замените материал из второго контура, который I привел здесь здесь с соответствующими частями сначала.

+0

Антон Коваленко: Дорогой сэр, я попытался исправить код, как вы предлагаете. (PLS см. Повторно отредактированный код выше). Но выход по-прежнему показывает 4 3 2. – sabu

+1

Что так сложно в отношении ** копирования ** кода из части 1 в часть 2, ** дословно **, без каких-либо ** творческих размышлений **? Вы инициализируете ECX с 3, затем вы уменьшаете ecx и 'dec ecx; jg..' примерно эквивалентен вашей прежней «петле». Вместо этого вы должны начать с 'xor ecx, ecx', затем' inc ecx', затем 'cmp ecx, 4' и' jne lp1' - ** точно **, как вы уже это делали в первом цикле. –

+0

Спасибо, сэр. Оно работает. Я редактирую код выше. – sabu