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
'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.) –
Ja, Sie haben Recht. Es ist einfach und verzweigt Übung. Es funktioniert jetzt. Danke – mwater07
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