GDC 6.3.0 real mode wrong get array string

jila via D.gnu d.gnu at puremagic.com
Thu Apr 13 03:17:26 PDT 2017


Good afternoon, I decided to write the operating system loader on 
D.
Build with
- gdc-6.3.0+2.068.2-x86_64-linux-gnu
- real mode 16bit, gdc –m16
I can not understand what happens when I access a char array

extern (C) int _main()
{
         string he="1234567890";
	for (int i=0; i<he.length;i++)
	{
		char cc =he[i];
		//print(cc);
	}
}
As a result, I get - 0,2,0,4,0,6,0,8,0
As you can see, non-even elements have zero. What can be wrong?
--------------------- ld ----------------------------------
ENTRY(_main);
SECTIONS
{
     . = 0x7C00;
     .text : AT(0x7C00)
     {
         *(.text);
     }
     .data :
     {
         *(.data);
         *(.bss);
         *(.rodata);
     }
     .sig : AT(0x7DFE)
     {
         SHORT(0xaa55);
     }
}
--------------------- register -------------------
eax = 0x00000000
ecx = 0x00000000
edx = 0x0000009f
ebx = 0x00000000
esp = 0x000007c0
ebp = 0x000003fc
esi = 0x00000000
edi = 0x00000000
eip = 0x00007c20

cs = 0x000007c0 ss = 0x00000000 ds = 0x00000040 es = 0x00000000 
fs = 0x00000000 gs = 0x00000000

eflags = 0x00000206 al = 0x00 cl = 0x00 dl = 0x9f bl = 0x00 ah = 
0x00 ch = 0x00 dh = 0x00 bh = 0x00 ax = 0x0000 cx = 0x0000 dx = 
0x009f
bx = 0x0000 bp = 0x03fc si = 0x0000 di = 0x0000

---------------------  asm -------------------------

// address he ->0x8058
string he="1234567890";
000x7c0e  mov              WORD PTR [di-0x20],0xa
000x7c15  add              BYTE PTR [eax],al
000x7c17  mov              WORD PTR [di-0x1c],0x8058
000x7c1e  add              BYTE PTR [eax],al
	for (int i=0; i<he.length;i++)
000x7c20  mov              WORD PTR [di-0xc],0x0
000x7c27  add              BYTE PTR [eax],al
000x7c29  mov              dx,WORD PTR [di-0x20]
000x7c2e  mov              ax,WORD PTR [di-0xc]
000x7c33  cmp              dx,ax
000x7c36  jbe              0x7c58 <_main+88>
	{
		char cc =he[i];
// dx <- address he - 0x8058
000x7c38  mov              dx,WORD PTR [di-0x1c]
// ax <- i
000x7c3d  mov              ax,WORD PTR [di-0xc]
// ax <- he+i
000x7c42  add              ax,dx
// bx=0, si=0
000x7c45  movzx            ax,BYTE PTR [bx+si]
000x7c4a  mov              BYTE PTR [di-0x11],al
		//print(cc);
000x7c50  add              WORD PTR [di-0xc],0x1
000x7c56  jmp              0x7c29 <_main+41>
	}




More information about the D.gnu mailing list