PDA

Tam Sürümünü Görmek İçin : inline asm


ceeyt
21/12/2004, 02:59
Asagidaki koda gore a degiskenin degerinin 4 olmasini bekliyorum ama 65476 gibi garip bir sonuc veriyor.

Neden oldugu hakkinda pek fikrim yok. Yardimci olabilir misiniz?
MS VC++ 7.0 da yaziyorum.



unsigned short a = 20;
unsigned short n = 5;
unsigned short *p = new unsigned short;

p = &a;

__asm push eax;
__asm mov eax,0;
__asm mov ax,word ptr[p];
__asm mov cx,n;
__asm cwd;
__asm idiv cx;
__asm mov a,ax;
__asm pop eax;

cout << a << endl;



tesekkur ederim...


Euclides
21/12/2004, 12:27
mov ax,word ptr[p];
ile a'in pointerin low kısmını almış oluyorsun.
__asm xxxx 'den noktalı virgül gerekmez.

DWORD nA=20,nB=5,nC;
//EAX'i korumaya gerek yok EBP,EBX,ESI,EDI korunmalı
__asm
{
mov eax,nA
mov ecx,nB
div ecx
mov nC,eax
}

masm değiken büyüklüklerini hatırlayabilir.
mov eax,nA'yi söyle yapar mov eax,dword ptr[nA]
nA=Offset

ceeyt
24/12/2004, 01:18
Euclides, verdigin kodda bolme isleminden once "cdq" komutu kullanmamanin bir nedeni var mi ?


DWORD nA=20,nB=5,nC;

__asm
{
mov eax,nA
mov ecx,nB
; cdq
div ecx
mov nC,eax
}

Euclides
25/12/2004, 10:27
haklısın
"sub edx,edx" yapmam lazımdı unutmuşum
Fakat "cdq" kullanamam çünkü unsigned divison yapıyorum (div) AMA cdq signed çevirm yapıyor
bir başka değişle x>0x80000000 ise çevirim bölme hatalı olur ve büyük ihtimalle integer overflow ile sonuçlanır.

fakat signed çalışırsak olur
mov eax,.....
cdq
mov ecx,....
idiv ecx
.....