2013-10-22 17 views
8

jestem montaż Widzę dwa przykłady definiowania ciąg learning:jaka jest składnia definicji stałej łańcuchowej w złożeniu?

msg db 'Hello, world', 0xa

  • co robi 0xa tu na myśli?

wiadomość DB 'Uwielbiam to!', 0

  • dlaczego mamy 0 tutaj?
  • czy to jest końcowa pusta litera?
  • dlaczego mamy 0xa powyższy przykład, ale 0 tutaj? (nie wydaje się, że są one związane z długością napisu)

Jeśli powyższe przykłady to dwa sposoby definiowania ciągu złożeniowego, w jaki sposób program może je rozróżnić?

Dzięki wyprzedzeniem za pomoc :)

+1

To zależy od tego, z jakiego asemblera korzystasz. Wszystkie mają różne wymagania dotyczące składni. –

Odpowiedz

6

Różne asemblery mają różną składnię, ale w przypadku dyrektywy db są całkiem spójne.

db to dyrektywa montażowa, która określa bajty o danej wartości w miejscu, w którym znajduje się dyrektywa w źródle. Opcjonalnie do dyrektywy można przypisać pewną etykietę.

Wspólne składni:

[label] db n1, n2, n3, ..., nk 

gdzie n1..nk pewne liczby rozmiarów bajtów (z 0..0xff) lub część stała łańcuchowa.

Dopóki ciąg znaków ASCII składa się z bajtów, dyrektywa po prostu umieszcza te bajty w pamięci, tak jak inne numery w dyrektywie.

przykład:

db 1, 2, 3, 4 

przydziela 4 bajtów i wypełnia je numerami 1, 2, 3 i 4

string db 'Assembly', 0, 1, 2, 3 

zostaną opracowane do:

string: 41h, 73h, 73h, 65h, 6Dh, 62h, 6Ch, 79h, 00h, 01h, 02h, 03h 

Znak z kodem ASCII 0Ah (0xa) jest znakiem LF (wiersz), który jest używany w Linuksie jako nowe polecenie linii dla konsoli.

Znak z kodem ASCII 00h (0) jest znakiem NULL, który jest używany jako znak końca łańcucha w językach C-podobnych. (i prawdopodobnie w wywołaniach OS API, ponieważ większość systemów operacyjnych jest napisana w języku C)

Dodatek 1: Istnieje kilka innych dyrektyw dotyczących montażu podobnych do DB, ponieważ definiują niektóre dane w pamięci, ale z innym rozmiarem. Najczęściej są to DW (zdefiniować słowo), DD (zdefiniuj podwójne słowo) i DQ (zdefiniuj poczwórne słowo) dla danych 16, 32 i 64-bitowych. Jednak ich składnia akceptuje tylko liczby, a nie ciągi.

+0

możesz wyjaśnić kod, do którego zostanie skompilowana wspomniana pozycja danych "ciąg", jeśli użyty zostanie DD zamiast DB. To jest zmodyfikowany kod "string dd" Assembly ", 0, 1, 2, 3" – Kaustav

+0

@Kaustav Większość asemblerów da ci błąd z "DD" zamiast dyrektywy "DB". – johnfound

+0

Jestem nowy dla asm, ale myślę, że jeśli zdefiniuję DD, asembler przydzieli 16 bitów dla elementu easch. Również w jaki sposób można przechowywać wartość większą niż 255 w pamięci 8-bitowej przy użyciu DB? – Kaustav

1

0 jest zerowy spływu, tak. 0xa jest znakiem nowej linii. Nie definiują tego samego ciągu znaków, więc możesz je rozróżnić.

1

0xa oznacza wartość szesnastkową "A", która jest 10 w postaci dziesiętnej. Znak kontrolny Linefeed ma kod 10 ASCII (Return ma D w systemie szesnastkowym lub 13 w systemie dziesiętnym).

Łańcuchy są zwykle zakończone znakiem nul, aby wskazać ich koniec.

Powiązane problemy