Mail Archives: djgpp/1997/10/02/07:15:27
Hello all,
I'm a beginner here and I need some,lots of help in converting Intel
to the At&T syntax,the code that i'm trying to convert was written for the
Borlands4.0 Tasm asembler,I have used both Nasm and the utility prg Ta2as,
while the latter does not do a complete correct conversion i am able to edit
the code without too much difficulty,however,some of my editing i'm not sure
of,even though i get no errors assembling the file,I'm not sure if it's
correct,I have run into a few problems that I cannot fathom out and I wish to
post them here and see if someone is kind enough to help me with these querys.
I must metion here that I'm new to assembly language and do not have all that
much knowledge of it as yet,and all the querys here relate to converting from
Intel to AT&T syntax.I have over a period of the last few months followed this
echo and gleaned a few clues,but most importantly,been able to get doc's and
such mentioned on this echo to help me and I have read the faq on this,but
this dos'nt mean I understand it.
Here goes...
Query 1: I have in a include file a expression..
Color equ ebp-4 converts to .equ Color, ebp-4
I get no errors with this,however it does not seem right as the registers I
believe need to be prefixed by the % character,I have tried prefixing it with
the % character,and a error occurs and if I do -4(%ebp)still a error.How do I
go about converting this.
Query 2: In the file that includes the include file there is a expression..
.data .data
COLOR dw ? converts to COLOR: .short ?
SX dd ? " " SX: .int ?
I get a error if I leave in the "?" character,is this conversion correct,also
I believe that "Color" and "COLOR" are different from each other,they're both
referenced through the program as follows.. but not in the same file
mov [word ptr COLOR],ax to movw %ax,COLOR
mov [word ptr Color],ax to movw %ax,Color
To the way i figure it the variable" Color" has something to do with
referencing the base pointer register,how do i go about the right conversion
for this to work.Am I correct in assuming that "COLOR" & "Color" are seperate
variables to each other.What confuse's me here is the fact that "COLOR" has
the directive .short and used in the prg as "word ptr",are these two
expressions the same,ie,.short and word.
Query 3: This relates to indirect memory referencing,in the faq in one of the
examples given it states..
*Intel:* [foo] *AT&T:* foo(,1)
How does one know that one is indirectly referencing a memory location,I
presume "foo" is a variable maybe in the form as the "Color" variable given
above,ok that makes sense to me,but if any variable is enclosed by [ ],does
this mean it has to follow the above criteria.In Brennans guide to inline
assembly,it states that you must suffix the instruction with b,w,or l to
specify the width of the destination register,then states the equivalent
forms for Intel are byte ptr,word ptr,dword ptr but that is for only when you
are referencing memory.
Query 4:
How does one tell which is the BASE or INDEX if one of them is missing, are
there registers that can only be used for BASE and only for INDEX,or are they
inter_changeable and can be put into anyone of those two,ie,BASE,INDEX,also
can SCALE be a predetermined value and put into a variable.
Query 5:Does it matter in what order the base,index,scale are put,like
Intel's [ebx + 4 * eax + _array]
base + scale * index + disp
now GAS dos'nt choke if I do this...
_array(%ebx,4,eax)
yet would this be legal.
I have noticed that GAS does not pick up many obvious errors,notably that when
this code was converted,it would not convert edx and would append the "$" on
to the front of it and never picked it up,yet it assembled with these
mistakes.
Query 6:I have come across two words,"large" and "short" in Borlands code,the
word "short"is used in the Jxx and jmp instruction's such as..
jge short inbetween
.
inbetween:
The word "large" is used as per..
mov [dword ptr _x_xNext],large 64
cmp edx,large 4096
I deleted the "short" from the Jxx and jmp instructions and in the case of the
others I did as follows "movl $64,_x_xNext" and "cmpl $4096,%edx" have I done
the correct conversion here for "short & large"if not could you advise as to
what it should be.
Query 7: I have an instruction "rep stosd" doing what I read in the DJGPP
QuickAsm guide by putting the stosd instruction on the next line I get a error
as such "no such 386 instruction" now if I use "stosl" it assembles without a
error,I have a prg that gives me the instruction set yet it only mentions the
suffixes "b,w,d" is this,"stosl" wrong,if so,how do I go about it correctly.
Query 8: I have some code as per...
call [dword ptr ebp+saFnc] where "saFnc" has been defined as a member of a
struct as per ".equ saFnc, 17" and also in a "C" header file as a member in
a struct declaration as... void (*Fnc)(void);
and another call as per... call [dword ptr _FloorCeilRtn] now this variable
was mentioned at the to of the file as... extrn _FloorCeilRtn:dword which
was stripped out in the conversion process,it is also mentioned in a .c file
as... void (*FloorCeilRtn)(void); .
They have been converted as follows "calll saFnc(%ebp)" and "calll
_FloorCeilRtn" is this a valid instruction,I get no errors on this,this one
has me more than puzzled as I can put the suffixes "b & w"there with no errors
yet have not seen in any readings mention of these,I have seen mention of
lcall but I think that applys to far calls.
Thanking you all in anticipation of your help,I apologise for this lengthy cry
of help and if I have strayed from the subject of this newsgroup please tell
me so.
Gary LLoyd.
<glloyd AT bbs DOT st DOT net DOT au>
- Raw text -