2012-06-05 9 views
5

Attualmente sto lavorando su un incarico in AT & Assemblea T e ora devo aggiungere due stringhe:Aggiungendo due stringhe in assembly x86

message: .asciz "String 1" 
before: .asciz "String 2" 

ho davvero idea di come fare questo o come inizio. Ho già cercato su internet ma non sono riuscito a trovare alcuna informazione utile. Penso di dover copiare manualmente i caratteri della seconda stringa fino alla fine della prima stringa, ma non ne sono sicuro.

Qualcuno potrebbe spiegarmi come si fa? :)

+0

L'assembly AT & T non esiste, è solo una sintassi diversa .. Immagino che intendessi forse l'assemblaggio di x86? :) – BlackBear

+0

Ecco cosa intendevo;) – Devos50

+0

Ok, mi sono preso la libertà di modificare la tua ricerca :) – BlackBear

risposta

2

Questa non è una cosa da poco. Le stringhe sono di lunghezza variabile e occupano diversi spazi nella memoria e ci deve essere un modo per sapere quanto tempo sono o dove finiscono. Con C o C++, un byte nul (byte di valore zero) indica la fine della stringa. Con alcuni altri linguaggi di programmazione , si ha un puntatore all'inizio della stringa e la lunghezza della stringa memorizzata separatamente, che ha il vantaggio di consentire di memorizzare binari (inclusi i byte del valore zero ) nella stringa. Anche con C e il resto, devi avere un puntatore a dove inizia la stringa.

Ciò che in genere deve accadere è che è necessario utilizzare asm per contattare il sistema operativo e richiedere un blocco di memoria attualmente libero che sia abbastanza grande da contenere il contenuto delle due stringhe una volta collegate.Questa sarebbe la memoria separata da una delle due stringhe per iniziare, e proviene da ciò che viene definito come Memory Heap, una volta assegnato il punto di inizio di quel blocco di memoria, si copia il contenuto della prima stringa in esso, quindi si continua mentre si copia il contenuto della seconda stringa in proprio dietro il primo. Quindi si rilascia la memoria che era stata assegnata alla prima stringa e si riassegna il blocco a quella stringa modificandone il puntatore ed eventualmente la sua lunghezza è . La memoria rilasciata viene restituita al Memory Heap dal sistema operativo per il riutilizzo altrove.

In realtà, il sistema operativo non è l'unica fonte di memoria liberata. Alcuni compilatori, anche gli assemblatori, gestiscono autonomamente la gestione della memoria o forniscono gli strumenti adeguati al programmatore per farlo in caso di necessità.

In altre parole, questa può essere un'impresa molto ambiziosa e devi conoscere piuttosto un bit su cosa sta succedendo per farlo bene. Lo fai male, puoi aspettarti le conseguenze come il crash del sistema e il riavvio.

+0

Non sai come puoi mandare in crash il tuo sistema eseguendo un programma che concatena le stringhe. – Simon

5

Questa domanda non menziona la memoria di destinazione, il che rende piuttosto difficile rispondere. Inoltre, non so se sei a 16 bit, 32 bit o 64 bit. Per ragioni di convenienza, supporterò anche che siano stringhe a 0 terminate in stile C.

In ogni caso, questa sembra essere la procedura generale:

  • ottenere la lunghezza della prima stringa (istruzioni su come scrivere uno strlen ASM può essere trovato qui: http://www.int80h.org/strlen/)
  • Impostare Il PTR al bersaglio memoria
  • Copia la prima stringa nella memoria di destinazione, utilizzando rep(e/ne) movsb con la dimensione in ecx.

Questo può essere CPU ottimizzata utilizzando 'movsd' dapprima facendo un shr ecx, 2 sulla lunghezza per ottenere in lotti di 4 byte, e poi facendo il rimanente con movsb. Ho visto questo fatto come questo:

mov  edi, dest 
mov  esi, string_address 
mov  ecx, string_length 
mov  eax, ecx 
shr  ecx, 2 
repne movsd 
mov  cl, al 
and  cl, 3 
repne movsb ; esi and edi move along the addresses as they copy, meaning they are already set correctly here 
  • Ottenere la lunghezza della seconda stringa (assicuratevi di eseguire il backup del edi in pila o un altro registro, se necessario, ma contiene l'indirizzo è necessario copiare il stringa successiva a)
  • Copia la seconda stringa nella memoria di destinazione (come ho detto, l'indirizzo corretto dovrebbe essere in edi dopo la prima operazione di stringa)
  • Per sicurezza, aggiungere un nuovo 0 dietro di esso.

Se si sta copiando la seconda stringa alla fine della prima stringa, è necessario uno meno operazione di copia, ma si avere per assicurarsi che ci sia abbastanza spazio in realtà lì per copiare la seconda stringa senza sovrascrivere altre cose importanti.

Problemi correlati