2016-05-06 12 views
0

Ich bin ziemlich neu in der Assemblersprache und ich versuche, dieses Programm herauszufinden. Ich will nur wissen, ob ich mit dem Programm auf dem Laufenden bin. Wie korrigiere ich dieses Programm?Assembly Sprache x86 Irvine32

Schreiben Sie eine Schleife, die die Summe aller Elemente im Array von Bytes berechnet. Drucken Sie das Ergebnis. Einige Hinweise: Laden Sie die Größe des Arrays in ein entsprechendes Register. Laden Sie den Offset des aktuellen Elements des Arrays und ändern Sie ihn bei jeder Iteration der Schleife entsprechend.

Hier ist, was ich bisher habe:

INCLUDE Irvine32.inc 

.data 
    val1 BYTE 1,2,3 
    counter = 0 
.code 

main PROC 

    mov ax, 0 

    mov ax, (LENGTHOF val1) 
    mov ax, OFFSET Counter 
    movzx ecx,ax 
L1: 
    add eax, val1[ecx] 
    inc eax 

loop L1 

    Call WriteDec 

exit 
END PROC 
    end main 
+1

_ "Wie korrigiere ich diesen pr ogram? "_ Wie funktioniert es nicht wie beabsichtigt? – Michael

Antwort

2

Sie in Ihrem Code mehrere Fehler haben: In der folgenden Sequenz, die Sie immer wieder ax gesetzt, die ziemlich nutzlos ist: Sie

mov ax, 0       ; you set ax to 0 
mov ax, (LENGTHOF val1)   ; you set ax to 3 
mov ax, OFFSET Counter    ; you set ax to an address (and try to use a 16-bit register for a 32-bit address 

Dann Fügen Sie diesen Offset einem anderen Offset in

hinzu
movzx ecx,ax 
L1: 
    add eax, val1[ecx]    ; add offset(val1)[offset(Counter)] to offset(Counter) 

Mit Sicherheit gibt dies einen Speicherfehler, weil die Adresse irgendwo sein kann. Dann erhöhen Sie diesen Offset mit

inc eax       ; you probably confused this with a counter/index register 

Und danach verwenden Sie diesen Offset in ECX, die Sie dort setzen von movzx ecx, ax als Index in ECX in der LOOP Anweisung

loop L1       ; decrements ECX and loops if ECX != 0 

Nach Wenn Sie alle diese Fehler beheben, könnte der Code wie folgt aussehen:

INCLUDE Irvine32.inc  
.data 
    val1 BYTE 1,2,3 
    counter = 0 
.code 
main:  
    xor eax, eax      ; 32-bit register for the sum 
    xor edx, edx      ; 32-bit register for the counter/index 
    mov ecx, LENGTHOF val1   ; number of entries in fixed size array in ECX as maximum limit 
L1: 
    movsx ebx, byte ptr val1[edx] ; extend BYTE at offset val1 + EDX to 32-bit 
    add eax, ebx      ; add extended BYTE value to accumulator 
    inc edx       ; increase index in EDX 
loop L1       ; decreases ECX and jumps if not zero 

    Call WriteDec     ; I assume this prints EAX 
    exit 
end main 
+0

** addieren Sie eax, val1 [edx]; Offset von val1 + EDX ** Ist das nicht ein ungültiger Befehlsoperand? Ich glaube, das ist der Grund, warum ich das Problem habe. –

+0

Ja. Du hast recht, ich habe vergessen, dass das Array von BYTE Größe ist. Ich habe den Code geändert, um das zu berücksichtigen. In diesem Fall bewegt MOVSX 8 Bit vom Speicher in ein 32-Bit-Register (signiert). – zx485

+0

Sie könnten vermeiden, ein Register, das normalerweise callee-gespeichert wird ('ebx'), wenn Sie Schleife mit' inc edx/cmp edx, LENGTHOF val1/jle'. Das gibt ecx als Scratch für movsx frei. Oder Sie können auf das Array in umgekehrter Reihenfolge zugreifen, sodass Sie immer noch eine Dec-and-Branch-Schleife verwenden können. (Obwohl du dann 'val1 - 1 [edx]' verwenden würdest, weil du Elemente 0..len-1, nicht 1..len). Oder Sie können sogar mit einem Zähler beginnen, der bei '-LENGTHOF val1' beginnt und gegen Null zählt. Laden von 'val1 + LENGTHOF val1 [edx]' oder etwas. –

Verwandte Themen