Assembler Strings zusammensetzen?
Hallo, ich versuche derzeit in NASM Assembler Strings bzw. zu einer Zeichenkette ein Zeichen hinzuzufügen, das klappt auch, aber nur wenn ich in Zeile 15 schreibe:
mov rsi, 30h <- Sagt dem Assembler er soll 0 als ASCII Code schreiben
Aber wenn ich versuche hier direkt meinen msg2 einzusetzen
mov rsi, msg2 <- kommt in der Konsole ein Fragezeichen bzw. seltsame Zeichen
Die erste Ausgabe auf der Konsole kommt Zustande bei: mov rsi, msg2
Die zweite bei mov rsi, 30h <- So möchte ich es btw. auch!
Wundert euch nicht über diese Formulierungen, ich bin absoluter Anfänger!
Console output:
simon@simon:~/Projekte/NASM$ bash ./run.sh
Ich verbinde mich mit �`
simon@simon:~/Projekte/NASM$ bash ./run.sh
Ich verbinde mich mit 0
Code:
%include 'functions.asm'
SECTION .data
msg1 db 'Ich verbinde mich mit ', 0h;23
msg2 db '0';2
SECTION .bss
name: RESB 255
SECTION .text
global _start
_start:
mov rax, msg1
mov rsi, 30h ;so it will work and so mov rsi, msg2 not!
push rax
call strlen
mov rdi, rax;rdi ist jetzt die Länge
pop rax
mov [rax + rdi], rsi;Ursprungsstring + Länge
call print
call exit
functions.asm
strlen:
push rbx;Auf den Stack werfen
mov rbx, rax
nextchar:
cmp byte [rax], 0
jz finished
inc rax
jmp nextchar
finished:
sub rax, rbx
pop rbx;Aus dem Stack ziehen
ret
exit:
push rax
push rbx
mov rax, 1;op code 1
mov rbx, 0;0 errors
int 80h
pop rax
pop rbx
ret
printstrlen:;rbx repräsentiert Nachricht, rax die Länge.
push rcx
push rdx
push rax
push rbx
mov rcx, rbx
mov rdx, rax
mov rax, 4
mov rbx, 1
int 80h
pop rcx
pop rdx
pop rax
pop rbx
ret
print:
push rbx
mov rbx, rax
call strlen
call printstrlen
pop rbx
ret
1 Antwort
Zu diesem "Fragezeichen-Symbol" das sind meistens Steuerzeichen (siehe ASCII-Code), "moderne" Betriebssysteme stellen diese dann meistens mit einem Fragezeichen-Symbol dar. Auf älteren Betriebssystemen (z.B MS-DOS) bekommt man andere Symbole ausgegeben, so konnte man auch das eine oder andere Spielchen im Textmodus schreiben!: https://theasciicode.com.ar/
Bevor ich deine Frage beantworte will ich dich wegen deinem Code-Stil loben, sehr übersichtlich! :)
Dein erwartetes Ergebnis ist das am Ende des Strings 0 ausgegeben wird, jedoch bekommst als Ergebnis "Müll".
Ausschlagebend ist diese Zeile:
mov [rax+rdi], rsi
Wenn du direkt 30h in rsi gibst, funktioniert das was du willst.Wie du vielleicht weißt ist es bei NASM & FASM so das '[...]' immer auf einen Speicherzugriff hindeutet.
MOV rsi, msg2 ;rsi = Adresse von msg2
MOV al, byte [msg2] ;al= Inhalt von msg2, erstes Byte
MOV rsi, [msg2] ;rsi = Inhalt von msg2, 8 Bytes
Ich bezweifle ob es wirklich nötig ist 8 Byte in rsi zu packen, wenn du doch nur 1 brauchst, aber das ist ein anderes Thema.
JEDOCH pass auf damit:
mov [rax + rdi], rsi
Es besteht immer die Gefahr das du etwas überschreibst das du eigentlich nicht überschreiben willst (aussehr du willst wirklich 8 Bytes überschreiben!).
Ich finde es sehr cool wie du erstmal kleine Projekte umsetzt! Weiter so :)
Bootloader ist wirklich ein sehr interessantes Thema! :)
Vermutlich einen UEFI-Bootloader?
Muss mich erst einlesen aber wahrscheinlich etwas auf dem BMR der dann einfach hello world ausgeben soll xD oder wie auch immer das heißt
Danke, ich bin Anfänger und lerne gerade gezielt Assembler. C#,C und Java kann ich schon. Mein Ziel ist es einen Bootloader zu schreiben aber ich glaube das dauert noch bissl... Derzeit versuche ich itoa zu implementieren