编译器和汇编

时间:2016-11-22 04:38:54

标签: c assembly compiler-construction x86 x86-16

为什么编译器永远不会从基指针的索引零开始偏移,请参阅here

! 1
! 1 # 1 "test.c"
! 1 struct test{
! 2  int a;
!BCC_EOS
! 3  int b;
!BCC_EOS
! 4 };
!BCC_EOS
! 5
! 6 int main()
! 7 {
export  _main
_main:
! 8   int a;
!BCC_EOS
! 9   char array[5];
!BCC_EOS
! 10   array[a] = 10;
push    bp
mov     bp,sp
push    di
push    si
add     sp,*-8
! Debug: ptradd int a = [S+$E-8] to [5] char array = S+$E-$D (used reg = )
mov     ax,-6[bp]
mov     bx,bp
add     bx,ax
! Debug: eq int = const $A to char = [bx-$B] (used reg = )
mov     al,*$A
mov     -$B[bx],al
!BCC_EOS
! 11   return array[a];
! Debug: ptradd int a = [S+$E-8] to [5] char array = S+$E-$D (used reg = )
mov     ax,-6[bp]
mov     bx,bp
add     bx,ax
! Debug: cast int = const 0 to char = [bx-$B] (used reg = )
mov     al,-$B[bx]
xor     ah,ah
add     sp,*8
pop     si
pop     di
pop     bp
ret
!BCC_EOS
! 12
! 13 }
! 14
! Register BX used in function main

我正在编写自己的编译器,如果它们是理由,我不想成为一个不幸的错误。

上面生成的代码如何安全使用,因为BX寄存器默认为数据段,无论如何都不应该指向堆栈。

0 个答案:

没有答案