Commit bd73e6eb authored by Laeticia Evertz's avatar Laeticia Evertz

Lösung in Readme eingefügt

parent 756fa050
......@@ -29,63 +29,108 @@ Somit ergibt sich für die exemplarische Anweisung der Maschinencode `0x0C30148
3. Vollziehen Sie nun die Phase 2 des Assemblers nach, indem Sie eine Objektdatei im in der Vorlesung vorgestellten Objektformat erzeugen. Zur Vereinfachung können alle Zahlen im *Big Endian*-Format dargestellt werden, außerdem seien alle Sprünge relativ und alle Funktionsaufrufe absolut. Kodieren Sie, soweit möglich, genau drei Befehle in einem T-Datensatz. Nutzen Sie auch den den S-Datensatz. Gehen Sie davon aus, dass der Dateiname und damit auch der Modulname *cntdwn* lautet.
```nasm
extern printf
global main
SECTION .text
main:
push ebp
mov ebp,esp
sub esp,4
mov ebx,0x39
mov dword [ebp-4],0x30
schleife:
cmp ebx,dword [ebp-4]
je .ende
mov byte [msg+msg_len-3],bl
push dword msg
call printf
add esp,4
dec ebx
jmp .schleife
ende:
add esp,4
pop ebp
push dword 0
call exit
add esp,4
mov eax,1
mov ebx,0
int 0x80
SECTION .data
msg db `Hello World! ebx = ?\n`,0
msg_len equ $-msg
; Aufg. 1: Funktionsweise des Programms:
; - Zunächst Sicherung des ebp, sowie Anlegen von Speicher auf dem Stack (4Byte)
; - Lade in ebx 0x39 und auf den Stack lokale Variable mit Wert 0x30
; - Schleife wird solange ausgeführt, bis ebx den Wert der lokalen Variablen hat
; - In msg wird hinter "=" das Lower-Byte des ebx eingefügt
; - dann printf mit msg ausgeführt, ebx dekrementiert und wiederholt
; -> in Schleife wird msg mit den Werten 57,...,48 hinter "=" gedruckt
; - Programmende nach Calling-Convention
extern exit ;Pseudoop
extern printf ;Pseudoop
global main ;Pseudoop
0000 SECTION .text ;Pseudoop
0000 main: ;Pseudoop
0000 push ebp ;[2]
0002 mov ebp,esp ;[3]
0005 sub esp,4 ;[7]
000C mov ebx,0x39 ;[7]
0013 mov dword [ebp-4],0x30 ;[11]
001E.schleife: ;Pseudoop
001E cmp ebx,dword [ebp-4] ;[7]
0025 je .ende ;[6]
002B mov byte [msg+msg_len-3],bl ;[15]
003A push dword msg ;[6]
0040 call printf ;[6]
0046 add esp,4 ;[7]
004D dec ebx ;[2]
004F jmp .schleife ;[6]
0055 .ende: ;Pseudoop
0055 add esp,4 ;[7]
005C pop ebp ;[2]
005E push dword 0 ;[6]
0064 call exit ;[6]
006A add esp,4 ;[7]
0071 mov eax,1 ;[7]
0078 mov ebx,0 ;[7]
007F int 0x80 ;[6]
0085
0000 SECTION .data ;Pseudoop
0000 CR equ 13 ;Pseudoop
0000 LF equ 10 ;Pseudoop
0000 msg db `Hello World! ebx = ?`, CR, LF, 0 ;[20]
0014 msg_len equ $-msg ;Pseudoop
;Länge Codesemgent: 0x85 = 133
;Länge Datensegment: 0x14 = 20
;Gesamtlänge: 0x99 = 153
```
* Symboltabele
| Symbol | Typ | Wert | Global sichtbar? (Ja/Nein) | Weitere Attribute |
| ------ | --- | ---- | -------------------------- | ----------------- |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
|exit |extern |0000 |J | |
|printf |extern |0000 |J | |
|main |global |0000 |J | |
|.text |SECTION |0000 |J | |
|.schleife |near |001E |N |in .text |
|.ende |near |0055 |N |in .text |
|.data |SECTION |0085 |J | |
|CR |equ |13 |J | |
|LF |equ |10 |J | |
|msg |BYTE |"Hello World! ebx = ?" |J |.data |
|msg_len |equ |14 |J | |
* Objektdatei
```
H |cntdwn |00000000 |00000099
S |.text |00000000 |00000085 |.data |00000085 |00000020
D |_main |00000000
R |_exit |_printf
T |00000000 |0C |0504 0C4050 02500100000004
T |0000000C |07 |0C100100000039
T |00000013 |0B |0C45000000040100000030
T |0000001E |0D |0A104500000004 0B0200000055
T |0000002B |0F |0C020000008500000014FFFFFFFDC0
T |0000003A |0C |050100000085 080100000000
T |00000046 |09 |01500100000004 0410
T |0000004F |0F |07010000001E 01500100000004 0640
T |0000005E |0C |050100000000 080100000000
T |0000006A |07 |01500100000004
T |00000071 |0E |0C000100000001 0C1000000000
T |0000007F |06 |0D0100000080
T |00000085 |14 |48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0D 0A 00
M |0000002D |0004 |+|cntdwn
M |0000003C |0004 |+|cntdwn
M |00000042 |0004 |+|_printf
M |00000066 |0004 |+|_exit
E
```
* Opcodes
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment