2016-04-25 13 views
0

Ich verstehe, dass dieser Code wahrscheinlich viel sauberer und effizienter sein könnte, aber ich verwende nur den Code, der bisher in unserem Buch bereitgestellt wurde. Ich versuche, ein 2D-Array zu erstellen, lassen Sie den Benutzer eine Verkäufer-Nummer (Zeilennummer), Menge verkauft (Wert) und Produkt-ID (Spaltennummer) eingeben. Sobald sie fertig sind, geben sie einen Wert von -1 ein. Es sollte den Gesamtumsatz jedes Verkäufers (Zeilensummen) und die Gesamtverkäufe aller Produkte (Spaltensummen) anzeigen. Ich kann zwar Informationen für die erste Zeile eingeben, aber das Programm friert ein, wenn ich versuche, Informationen für Verkäufer 2, 3 oder 4 einzugeben. Hier ist der Teil des Codes, von dem ich glaube, dass er das Problem hat.Fehler beim Lesen von mehr als einer Datenzeile in einem 2D-Array

L1: mov  edx, OFFSET msg1 
     call WriteString 
     call ReadInt 
     .WHILE(eax != quit) 
      mov  ebx, OFFSET tableE 
      dec  eax 
      add  ebx, RowSizeE 
      imul ebx, eax 
      call Crlf 
      mov  edx, OFFSET msg2 
      call WriteString 
      call ReadDec 
      mov  ecx, eax 
      call Crlf 
      mov  edx, OFFSET msg3 
      call WriteString 
      call ReadDec 
      mov  esi, eax 
      dec  esi 
      mov  tableE[ebx + esi*TYPE tableE], ecx 
      call Crlf 
      mov  eax, 0 
      mov  ebx, 0 
      mov  edx, 0 
      mov  ecx, 0 
      mov  esi, 0 
      loop L1 
     .ENDW 
+0

Als Höflichkeit, wenn Sie Ihre Frage sehen mit gebrochener Formatierung kommt es bitte selbst beheben (auch die Vorschau verwenden, während der Bearbeitung). Kommentiere deinen Code auch, besonders wenn du anderen helfen willst. Last but not least, geben Sie Details, nicht nur sagen, dass das Programm einen Fehler hat. – Jester

+0

Dies ist das Gegenteil eines minimalen vollständigen Beispiels, das Ihr Problem veranschaulicht. Das ist dein ganzes Programm. Nehmen Sie Dinge so lange heraus, bis Sie ein Programm haben, das so klein wie möglich ist (und nicht viel tut), aber immer noch das gleiche Problem hat. Sie werden wahrscheinlich Ihren Fehler auf dem Weg finden, während Sie Sachen auspacken, besonders. Wenn Sie einen Debugger verwenden, um Register/Speicher zu untersuchen und zu sehen, ob das Problem immer noch vorhanden ist. –

+1

Vielen Dank, dass Sie den Code verkleinert haben, aber es gibt immer noch keine Kommentare, die erklären, was Sie bei jedem Schritt tun sollen oder warum. Wie auch immer, Nullstellung von 'ecx' direkt vor einer [' loop' Anweisung] (http://stackoverflow.com/questions/35742570/why-is-the-loop-instruction-slow-couldnt-intel-have-implemented-it- effizient) ist wahrscheinlich ein Fehler. –

Antwort

1

Zwei Probleme in Ihrem Programm.

  • Sie versuchen 4 mal Schleife (denn es gibt 4 Verkäufer), aber nirgends im Programm tun Sie Setup solche Zähler in ECX. Schlimmer noch, Sie schaffen es sogar, das ECX-Register vor der Anweisung loop auf Null zu setzen (wie von @PeterCordes bemerkt).

    mov  ecx, 4   ;NEW 
    L1: mov  edx, OFFSET msg1 
        call WriteString 
        call ReadInt 
        .WHILE(eax != quit) 
         push ecx   ;NEW 
         mov  ebx, OFFSET tableE 
         ... 
         mov  tableE[ebx + esi*TYPE tableE], ecx 
         call Crlf 
         xor  eax, eax  \ 
         xor  ebx, ebx  | Better way to zero these registers 
         xor  edx, edx  | 
         xor  esi, esi  /
         pop  ecx   ;NEW 
         loop L1 
        .ENDW 
    
  • Sie initialisieren das EBX-Register falsch. Dies ist der richtige Weg:

    dec  eax     ;Decrement salesman number [1,4] -> [0,3] 
    imul eax, RowSizeE 
    mov  ebx, eax 
    
+0

ew, push/pop des Schleifenzählers innerhalb der Schleife? Verwenden Sie einfach ein anderes Register für den Schleifenzähler und verwenden Sie nicht "loop". Es erscheint auch unwahrscheinlich, dass das Nullen von vier ganzzahligen Regs jeder Iteration tatsächlich notwendig ist. –