2002-12-07, 02:24
  #1
Medlem
Har ett litet problem.. jag undrar hur man lägger till en sträng till en annan sträng (text strängar alltså) i assembly.

Till exempel skulle det sett ut ungefär såhär i ett annat programmeringsspråk (ni förstår säkert)

a = "123"
b = "456"
c = a + b (c blir alltså "123456")

Jag har försökt med lite olika tekniker men inte riktigt lyckats.. jag kör MASM för övrigt.
Citera
2002-12-07, 15:15
  #2
Medlem
Så kan du inte skriva i c.
Citera
2002-12-07, 15:26
  #3
Medlem
Hehe ops jaja, hursomhelst du förstår nog vad jag menar, frågan är hur man gör det i assembly.
Citera
2002-12-07, 18:57
  #4
Medlem
Okay, vilken plattform är det du programmerar mot? 16 bitars i386 32 i386 assembler, 68k (Amiga mac) ...
Citera
2002-12-07, 22:17
  #5
Medlem
Det är 32 bitars, kör med 386ans opkod uppsättningen, vanlig win32 assembly alltså
Citera
2002-12-07, 23:55
  #6
Medlem
KODEN BÖRJAR HÄR!
---------

.model tiny
.stack
.data
a_var db '123'
b_var db '456'
c_var db 6 dup(?) ;6 dup(?) betyder 6st ? (dup = duplicate)
.code
main proc
mov ax,@data ;ladda data segment till ax
mov es,ax ;och sen till es
mov ds,ax ;och till ds
lea di,c_var ;ladda c_var's offset till di, kan skrivas mov di,offset c_var
lea si,a_var

cld ;sätter direction flag till 0, får loopen att räkna ner!
mov cx,6 ;sex tecken!
add_vars:
lodsb ;ladda ds:si till al och öka si med 1
stosb ;spara al i es:di
loop add_vars ;om cx>0 hoppa till add_a_var

mov ax,4c00h
int 21h ;ger tebax kontrollen till DOS
main endp
end main



-----------------
KOD SLUTAR HÄR!!!!

det borde hjälpa dig. kom ihåg att a_var och b_var måste ligga eftervarandra desutom får a_var inte ligga sist (finns risk för att programmet krashar annars hehe).
om det var nått du inte förstod så messa tebax så ska jag försöka förklara bättre...

//law
Citera
2002-12-08, 10:49
  #7
Medlem
Tack för din hjälp :!: Jag antar att det ser ungefär lika ut i 32 bitars förutom att man kan använda 32 bitars register och istället för 'int 24h' call'a ExitProcess()
Citera
2002-12-09, 13:15
  #8
Medlem
det stämmer det!

kom på en sak... istället för

add_vars:
lodsb ;ladda ds:si till al och öka si med 1
stosb ;spara al i es:di
loop add_vars ;om cx>0 hoppa till add_a_var

kan du använda

rep movsb

rep betyder repeat antalet i cx alltså 6. och mosvb betyder flytta en byte från ds:si till es:di och öka si,di med ett...

get the point?

//law
Citera
2002-12-09, 19:17
  #9
Medlem
Stockos avatar
Det är ju snyggare (och enklare) att köra med nullterminerade strängar. Då kan man dessutom köra med repnz, och slipper därmed veta hur långa strängarna är.
Citera
2002-12-10, 04:17
  #10
Medlem
r2d2s avatar
Citat:
Ursprungligen postat av Stocko
Det är ju snyggare (och enklare) att köra med nullterminerade strängar. Då kan man dessutom köra med repnz, och slipper därmed veta hur långa strängarna är.

..cch skriva en generell procedur, typ C's strcat
Citera
2002-12-10, 16:13
  #11
Medlem
Tack för alla svaren! Jag har bekantat mig med movsb instruktionen samt rep och repnz! Tackar tackar
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in