为什么编译器永远不会从基指针的索引零开始偏移,请参阅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寄存器默认为数据段,无论如何都不应该指向堆栈。