2012-04-16 18 views
45

Montaj için yeni bir başlangıç ​​yapıyorum ve tüm db, dw, dd, şeylerin ne anlama geldiğini bilmiyorum. 1 + 1 yapan, bir değişkende saklayan ve sonucu görüntüleyen bu küçük betiği yazmaya çalıştım. Ben db, dw, dd şeyler ne anlama geldiğini anlamamız gerekirx86 Montaj - Kullanılacak değişken büyüklüğü (db, dw, dd)

.386 
.model flat, stdcall 
option casemap :none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\masm32.inc 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\masm32.lib 
.data 
num db ? ; set variable . Here is where I don't know what data type to use. 
.code 
start: 
mov eax, 1    ; add 1 to eax register 
mov ebx, 1    ; add 1 to ebx register 
add eax, ebx    ; add registers eax and ebx 
push eax     ; push eax into the stack 
pop num     ; pop eax into the variable num (when I tried it, it gave me an error, i think thats because of the data type) 
invoke StdOut, addr num ; display num on the console. 
invoke ExitProcess  ; exit 
end start 

ve nasıl değişken ortam ve birleştirme ve bu tür bir şey etkiler: İşte benim şimdiye kadar kodudur. peşin

sayesinde Progrmr

+2

db bayt, 8 bit, dw word 16 bit, dd çift sözcük 32 bit. Bu, diğer platformlarda x86 için bir kelime 32 bit ve yarım bit 16 bit olduğunu unutmayın. Diğerleri bir bayt 9 bit, vb. Bir db ile oluşturduğunuz şey, bir bayt koleksiyonudur. sadece imzasız char [] = ... gibi. –

+0

'itme eax' /' pop [num] 'gülünç. Sadece "mov [num], eax". Veya 'mov dword [num], 1 + 1', toplayıcının, çalışma zamanı yerine, montaj zamanında 1 + 1 yapmasına izin vermek ve' mov m32, imm32' komutunu kodlamak. ('Dword' boyutuna ihtiyaç vardır çünkü boyuttan çıkacak bir kayıt işleneni yoktur). Veya 'mov eax, 1' /' add eax, 1'. –

+0

Bu kitabın gerçek sayısından google'da daha yüksek olan RTFM sorularından biri olduğunu düşünüyorum.** Referans materyale ve öğreticilere bağlantılar için [x86 tag wiki] (http://stackoverflow.com/tags/x86/info) ** adresini ziyaret edin. Cevaplarda belirtilmeyen bir incelik, MASM'nin bir etiketin ardından bildirilen alanın boyutunu, kendisine atıfta bulunan talimatların işlenen büyüklüğünü ima edecek şekilde kullanmasıdır. NASM sözdiziminde herhangi bir garip tahmin-ne-demek istediğin şeyler olmaz: başka bir kaynağa bakmadan bir komutun nasıl bir araya getirileceğini anlatabilirsiniz. –

cevap

59

Hızlı inceleme,

  • DB - Byte tanımlayın. 8 bit
  • DW - Kelimeyi tanımlayın. Genel olarak x86 32 bit sistemde 2 bayt
  • DD - Çift sözcüğü tanımlayın. Genel olarak, tipik bir x 86 32-bitlik bir sistem x86 assembly tutorial kaynaktan

4 bayt,

açılır talimat içine üst donanım destekli yığını 4 baytlık veri öğesi kaldırır belirtilen işlenen (ör. veya hafıza konumu). İlk belirtilen yazmacı veya bir hafıza konumuna Bellek konumda [SP] 'de bulunan 4 bayt hareket eder ve daha sonra Kişisel num 1 bayt olan 4.

ile SP artırır. DD ile bildirmeyi deneyin, böylece 4 bayt olur ve pop semantiği ile eşleşir.

+2

Teşekkürler. Bu çok yardımcı oldu! – Progrmr

20

tam listesi:

DB, DW, GG, DQ, DT, DDQ ve DO

See (çıkış dosyasında başlatıldı veri bildirmek için kullanılır.): http://www.tortall.net/projects/yasm/manual/html/nasm-pseudop.html

bunlar yollardan geniş bir alanda çağrılabilir: (not: Görsel-Studio - örneğin - yerine "0x" sözdizimi "h" kullanın: yerine 0x55 değil ama 55H):

db  0x55    ; just the byte 0x55 
    db  0x55,0x56,0x57  ; three bytes in succession 
    db  'a',0x55   ; character constants are OK 
    db  'hello',13,10,'$' ; so are string constants 
    dw  0x1234    ; 0x34 0x12 
    dw  'A'     ; 0x41 0x00 (it's just a number) 
    dw  'AB'    ; 0x41 0x42 (character constant) 
    dw  'ABC'    ; 0x41 0x42 0x43 0x00 (string) 
    dd  0x12345678   ; 0x78 0x56 0x34 0x12 
    dq  0x1122334455667788 ; 0x88 0x77 0x66 0x55 0x44 0x33 0x22 0x11 
    ddq  0x112233445566778899aabbccddeeff00 
    ; 0x00 0xff 0xee 0xdd 0xcc 0xbb 0xaa 0x99 
    ; 0x88 0x77 0x66 0x55 0x44 0x33 0x22 0x11 
    do  0x112233445566778899aabbccddeeff00 ; same as previous 
    dd  1.234567e20   ; floating-point constant 
    dq  1.234567e20   ; double-precision float 
    dt  1.234567e20   ; extended-precision float 

DT kabul etmez sayısal c işlenenler olarak sıralar ve DDQ, işlenenler olarak kayan sabitleri kabul etmez. DD'den daha büyük herhangi bir boyut, dizgileri işlenen olarak kabul etmez.

+0

hmm, gibi @LeoMingo yaptığı yorumda (bir cevap olarak gönderildi) işaret etti, bu örnek buggy! Dizeler, bu ASCII değerlerini vermek için büyük harf olmalıdır. Küçük harfli ascii, 0x20'ye göre daha yüksek hex değerlerine sahiptir. –

+0

Çok iyi görünüyor! Onardım. – cnd