2017-06-27 5 views
0

Ich versuche Assembly-Prozedur zu schreiben, die einen Parameter im Register ebx empfängt, und gibt den absoluten Wert des Parameters im Register eax, dann ruft diese Prozedur in einer Schleife alle Elemente eines bestimmten Arrays und um ihre absoluten Werte zu erhalten. Wenn ich den Code ausführe, erhalte ich die folgenden Segmentfehler von Assembler.Assembly Array absoluten Wert

Assembling: abs.asm 
abs.asm(3) : error A2034: must be in segment block : ABS 
abs.asm(4) : error A2034: must be in segment block : $$$00001 
abs.asm(4) : error A2034: must be in segment block 
abs.asm(5) : error A2034: must be in segment block : $$$00001 
abs.asm(5) : error A2034: must be in segment block 
abs.asm(6) : error A2034: must be in segment block : $$$00001 
abs.asm(6) : error A2034: must be in segment block 
abs.asm(7) : error A2034: must be in segment block : $$$00001 
abs.asm(7) : error A2034: must be in segment block 
abs.asm(8) : error A2034: must be in segment block 
abs.asm(9) : error A2034: must be in segment block : $$$00001 
abs.asm(9) : error A2034: must be in segment block 
abs.asm(10) : error A2034: must be in segment block 
abs.asm(11) : fatal error A1010: unmatched block nesting : ABS 
INCLUDE Irvine32.inc 

ABS PROC 
cmp ebx,0  ;compare ebx to zero 
jle L1   ;Jump if less then or equal to zero 
mov eax, ebx ;copy ebx to eax, means eax is positive 
Jmp L2   ;jumps to label return 
L1:neg ebx  ;negates ebx  
mov eax,ebx  ;copy neagted ebx to eax   
L2:ret 
ABS ENDP 

.DATA 
arrayW SDWORD 3, -2, 5, 7, 2, 9, -11, 32, -19, 18, 17, 15, -5, 2, 3, 1, -21, 27,-29, 20 

.CODE 
main PROC 

    mov esi, OFFSET arrayW  ;address of arary 
    mov ecx, LENGTHOF arrayW ;loop counter 

top: 
    mov ebx,[esi]    ; move first element of arrayw to ebx 
    call ABS     ; calls procedure abs and gets the eax value 
    call Writeint    ; displays eax 
    add esi, TYPE arrayW  ;points next element in array 
    loop top     ;loop goes to the top 
    call clrscr 

    exit 
main ENDP 

END main 
+4

'ABS' ein Verfahren ist, das heißt, es Code ist. Daher sollte es unter dem Abschnitt ".CODE" gehen. (Außerdem gibt es mehrere Möglichkeiten, 'ABS' zu schreiben, was wesentlich effizienter wäre. Aber ich denke, das ist nur eine Übung zum Thema Verzweigen.) –

+0

Ja, Sie haben Recht. Es ist einfach und verzweigt Übung. Es funktioniert jetzt. Danke – mwater07

+0

Sie haben keine Fehler erhalten, wenn Sie den Code ausgeführt haben, aber wenn Sie versuchten, es zu kompilieren/assemblieren, sind das Kompilierungsfehler. Die Laufzeitfehler in der Assembly sehen etwas anders aus ... Grundsätzlich ist jeder beliebige Zufallseffekt möglich, oder zumindest waren moderne Betriebssysteme überraschend robust gegen zufällige Maschinencodeausführung, aber bei frühen Computern endete ein Fehler im Assemblercode normalerweise durch einen Neustart von ganze Maschine (Verlust irgendwelcher Fortschritte, die Sie vorher nicht auf einem externen Speichergerät gespeichert haben). – Ped7g

Antwort

4

Ich brauchte die ABS Verfahren nach dem .CODE Abschnitt zu bewegen:

INCLUDE Irvine32.inc 

.DATA 

arrayW SDWORD 3, -2, 5, 7, 2, 9, -11, 32, -19, 18, 17, 15, -5, 2, 3, 1, -21, 27,-29, 20 


.CODE 

ABS PROC 
    cmp ebx,0  ;compare ebx to zero 
    jle L1   ;Jump if less then or equal to zero 
    mov eax, ebx ;copy ebx to eax, means eax is positive 
    jmp L2   ;jumps to label return 
    L1:neg ebx  ;negates ebx  
    mov eax,ebx  ;copy neagted ebx to eax   
    L2:ret 
ABS ENDP 

main PROC 

    mov esi, OFFSET arrayW  ;address of arary 
    mov ecx, LENGTHOF arrayW ;loop counter 

top: 
    mov ebx,[esi]    ;move first element of arrayw to ebx 
    call ABS     ;calls procedure abs and gets the eax value 
    call Writeint    ;displays eax 
call Crlf 
    add esi, TYPE arrayW  ;points next element in array 
    loop top     ;loop goes to the top 

    exit 
main ENDP 

END main 
Verwandte Themen