2016-04-09 17 views
0

Ich möchte den maximalen Wert aus dem Array berechnen. Ich habe nur mit Registern gemacht, aber jetzt habe ich Probleme beim Manipulieren von Variablen im Speicher. Am Anfang möchte ich die erste Zahl den maximalen Wert machen. Ich habe movl array(, %edi, 4), &max es gibt Fehler, ungültige Char '&'. Was ist der richtige Weg? Ich habe ein ähnliches Problem mit der decl &n Anweisung.ungültiges Zeichen '&' Variablen im Speicher manipulieren

Im Code verwende ich% edi für den Index und% eax für den aktuellen Wert.

.data 
    array: 
     .int 31, 9, 42, 18, 40 
    n: 
     .int 5 
    max: 
     .int 0 

.text 
.globl _start 

_start: 
    movl $0, %edi 
    movl array(, %edi, 4), &max 
start_loop: 
    incl %edi 
    decl &n 
    cmpl $0, n 
    je exit_loop 
    movl array(, %edi, 4), %eax 
    cmpl max, %eax 
    jle start_loop 
    movl %eax, &max 
    jmp start_loop 

exit_loop: 
    movl $1, %eax 
    movl &max, %ebx 
    int $0x80 
+2

Was wollen Sie, dass magische '&' zu tun? Sie benötigen es nicht, um auf Variablen zuzugreifen. – Jester

+5

Sie verwenden '' '' nicht, um eine Adresse anzugeben. 'max' _IS_ die Adresse des Etiketts. Ihr zweites Problem besteht darin, dass auf Intel x86-Anweisungen zwei Speicheroperanden nicht verwendet werden können. Sie müssten es in zwei Anweisungen unter Verwendung eines Zwischenregisters aufteilen. –

+0

Und die Zeile, die ich meine, du müsstest brechen, ist 'movl array (,% edi, 4), & max'. Ein Beispiel wäre 'movl array (,% edi, 4),% eax'' movl% eax, max' –

Antwort

0

Ich möchte, den Maximalwert aus dem Array berechnen.

Ein naiver Ansatz, das Problem des Erhaltens der Maximalwert eines Arrays wird der folgende Code (kopieren Sie die Daten Prolog) zu lösen:

_start: 
    movl n, %ecx    ; %ecx is now equal to the array len 
    lea array, %esi    ; %esi points to the beginning of the array 
    xorl %edx, %edx    ; first maximum value is 0 
start_loop: 
    movl (%esi), %eax   ; get value from array to %eax 
    cmpl %edx, %eax    ; is new value greater (or equal) to the current max? 
    cmovge %eax, %edx   ; then replace it 
    add $4, %esi    ; set pointer to next element of array 
    loop start_loop    ; decrement %ecx and jump to label if not 0 
exit_loop: 
    movl $1, %eax    ; SYS_EXIT 
    movl %edx, %ebx    ; copy max to 'exit status' 
    int $0x80     ; execute SYSCALL 
+0

Movl-Array, würde% esi eine ganze Zahl nach esi verschieben? Es verwirrt mich, weil Array eine Adresse bezeichnet. –

+0

Ich bin mir wirklich nicht sicher, was du mir sagen willst. Nirgends im obigen Code existiert eine Zeile wie 'movl array,% esi'. Ich habe '% esi' an die Adresse von' array' mit der Anweisung 'lea array,% esi' zugewiesen. Danach greife ich auf die Werte des Arrays, das den indirekten Adressierungsmodus anwendet, mit 'movl (% esi),% eax '. Der Befehl 'movl array,% esi' würde nur die ersten vier Bytes von' array' nach '% esi' verschieben (' array' ist ein Label und 'movl' bewegt 4 Bytes von diesem Label zum Ziel). – zx485