Array-Ausgabe
-
sry - wenn du selber drauf kommst, hilft dir das mehr als wenn ich es einfach nur raushaue.
Das stimmt natürlich, doch weiß ich nicht, wie ich drauf kommen soll.
Mein Verständnis von EAX, AX, AH und AL habe ich geschrieben, das gibt mir aber keine neue Idee.vielleicht kannste mir ja noch einen Hinweis geben
-
EAX ist ein 32Bit Register. AX stellt die 16 niederwertigen bits EAX's dar,AL die die untersten 8.
Die funktion print_int gibt dir den inhalt von EAX (also 32Bit) wieder.
-
EAX ist ein 32Bit Register. AX stellt die 16 niederwertigen bits EAX's dar,AL die die untersten 8.
Die funktion print_int gibt dir den inhalt von EAX (also 32Bit) wieder.Genauso hatte ich das auch verstanden.
mov eax,1
belegt das niederwertigste Byte mit "1", die anderen bleiben null.
mov al,1
belegt "al" mit "1". Da "al" das niederwertigste Byte von "EAX" darstellt, müsste bei beiden Varianten doch das gleiche rauskommen, oder nicht?
nämlich EAX=00000001
-
peak_me schrieb:
mov al,1
belegt "al" mit "1". Da "al" das niederwertigste Byte von "EAX" darstellt, müsste bei beiden Varianten doch das gleiche rauskommen, oder nicht?
nämlich EAX=00000001nur wenn in EAX vorher nichts drin war - mov al,1 ändert nur die untersten 8 Bit
-
nur wenn in EAX vorher nichts drin war - mov al,1 ändert nur die untersten 8 Bit
Deswegen habe ich ja extra vorher mov eax,0 gemacht.
Dann müssten ja
mov eax, 0 mov eax, [var + 1] call print_int
und
mov eax, 0 mov al, [var + 1] call print_int
das gleiche Ergbenis liefern. Tun sie aber nicht.
Die erste Variante gibt "262914" und die andere "2" aus.Mein ganzes Programm sieht so aus:
%include "asm_io.inc" segment .data var db 1,2,3,4 segment .text global _asm_main _asm_main: enter 0,0 pusha mov eax, 0 mov eax, [var + 1] call print_int popa mov eax, 0 leave ret
-
es ist doch Richtig! - was macht den MOV EAX,[...]?
-
es ist doch Richtig!
Ist es nicht; ich wil das zweite Element aus dem Array haben und das ist "2" und nicht "262914".
- was macht den MOV EAX,[...]?
Das packt "[...]" in "EAX".
-
EAX ist ein 32Bit Register, AL ein 8Bit Register. - dem entsprechend wird aus dem Speicher gelsen.
-
EAX ist ein 32Bit Register, AL ein 8Bit Register. - dem entsprechend wird aus dem Speicher gelsen.
aha
Ein Element aus dem Array muss das gesamte Register ausfüllen, also müssen die einzelnen Elemente im EAX dann double-words ein.
mitvar dd 1,2,3,4
bekomme ich dann das erste Element mit mov eax, [var]
das zweite mit mov eax, [var + 4]
das dritte mit mov eax, [var + 8]
und das vierte mit mov eax, [var + 12]Ist das tatsächlich das Standardvorgehen beim Laden von Array-Elementen?
-
ja (hängt natürlich von der Elementgröße ab)
Dynamischer ist folgendes (eine von vielen Möglichkeiten):array dd 1,2,3,4,5,6,7,8,9,10 ; 10 Elemente xor ecx,ecx ; index register lea edx,array l1: cmp ecx,10 jae l2 mov eax,[edx+ecx*4] ;eax = array[ecx] ;... lea ecx,[ecx+1] jmp l1 l2:
-
alles klar
vielen Dank für deine schnelle Hilfe!