Assembler Strings zusammensetzen?


15.02.2020, 18:23

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

Vom Fragesteller als hilfreich ausgezeichnet

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 :)

Simon221585 
Fragesteller
 18.02.2020, 18:12

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

0
max0028  18.02.2020, 20:15
@Simon221585

Bootloader ist wirklich ein sehr interessantes Thema! :)

Vermutlich einen UEFI-Bootloader?

0
Simon221585 
Fragesteller
 18.02.2020, 22:04
@max0028

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

0