assembler copy char[]

nobody not at possible.net
Thu Jun 7 06:58:53 PDT 2007


Daniel Keep Wrote:

> 
> 
> nobody wrote:
> > Wow, that's exactly what i want.
> > In dmd it's all ok, but the gdc  didn't like it: 
> > 
> > mov EDX, dword ptr [mystring+4];
> > mov [st+4],EDX;
> > 
> > 
> > gdmd  string.d
> > /tmp/cc4h5AKo.s: Assembler messages:
> > /tmp/cc4h5AKo.s:30: Error: junk `(%ebp)+4' after expression
> > /tmp/cc4h5AKo.s:31: Error: junk `(%ebp)+4' after expression
> 
> IIRC, that's because local variables are actually EBP plus some offset.
>  I think DMD is inlining the two offsets, but GDC isn't.
> 
> If you want to learn assembler, the best way is to just write code in D,
> compile it, and then disassemble it.  I assume you're running under
> Linux; gdb should have an option to disassemble the current function.
> That way, you can read the original line of source code, and what the
> compiler actually produces.  Here's what ddbg gives me for the program
> 
> void main()
> {
>     auto mystring = "Hello, World!";
>     auto st = mystring;
> }
> 
> Disassembly:
> 
> copy_string.d:2 void main()
> 00402010: c8200000                enter 0x20, 0x0
> 00402014: 53                      push ebx
> 
> copy_string.d:4     auto mystring = "Hello, World!";
> 00402015: 8d45e0                  lea eax, [ebp-0x20]
> 00402018: 50                      push eax
> 00402019: 6a0d                    push 0xd
> 0040201b: ff3594f04000            push dword [0x40f094]
> 00402021: ff3590f04000            push dword [0x40f090]
> 00402027: 6a01                    push 0x1
> 00402029: e87e010000              call 0x4021ac __d_arraycopy
> 
> copy_string.d:5     auto st = mystring;
> 0040202e: 8d4df0                  lea ecx, [ebp-0x10]
> 00402031: 51                      push ecx
> 00402032: 6a0d                    push 0xd
> 00402034: 8d55e0                  lea edx, [ebp-0x20]
> 00402037: bb0d000000              mov ebx, 0xd
> 0040203c: 52                      push edx
> 0040203d: 53                      push ebx
> 0040203e: 6a01                    push 0x1
> 00402040: e867010000              call 0x4021ac __d_arraycopy
> 00402045: 31c0                    xor eax, eax
> 00402047: 83c428                  add esp, 0x28
> copy_string.obj
> 0040204a: 5b                      pop ebx
> 0040204b: c9                      leave
> 0040204c: c3                      ret
> 
> 	-- Daniel


With gdb

Dump of assembler code for function main:
0x08049a70 <main+0>:    lea    0x4(%esp),%ecx
0x08049a74 <main+4>:    and    $0xfffffff0,%esp
0x08049a77 <main+7>:    pushl  0xfffffffc(%ecx)
0x08049a7a <main+10>:   push   %ebp
0x08049a7b <main+11>:   mov    %esp,%ebp
0x08049a7d <main+13>:   push   %ecx
0x08049a7e <main+14>:   sub    $0x14,%esp
0x08049a81 <main+17>:   mov    (%ecx),%edx
0x08049a83 <main+19>:   mov    0x4(%ecx),%eax
0x08049a86 <main+22>:   mov    $0x8049154,%ecx
0x08049a8b <main+27>:   mov    %ecx,0x8(%esp)
0x08049a8f <main+31>:   mov    %edx,(%esp)
0x08049a92 <main+34>:   mov    %eax,0x4(%esp)
0x08049a96 <main+38>:   call   0x8049af0 <_d_run_main>
0x08049a9b <main+43>:   add    $0x14,%esp
0x08049a9e <main+46>:   pop    %ecx
0x08049a9f <main+47>:   pop    %ebp

Ok,  i try it tomorrow again, with ESP .
I have thought that's only needed by naked asm blocks?




More information about the Digitalmars-d-learn mailing list