English 中文(简体)
是否有任何语言/编辑用非零门槛的电离层电离层指示?
原标题:Do any languages / compilers utilize the x86 ENTER instruction with a nonzero nesting level?
  • 时间:2014-10-12 08:20:45
  •  标签:

熟悉x86组装方案的人非常用于典型的职能对话/对话:

push ebp ; Save old frame pointer.
mov  ebp, esp ; Point frame pointer to top-of-stack.
sub  esp, [size of local variables]
...
mov  esp, ebp ; Restore frame pointer and remove stack space for locals.
pop  ebp
ret

也可使用<条码>ENTER和LEAVE指令实施同一条码:

enter [size of local variables], 0
...
leave
ret

ENTER号指令第2版是nesting Level,允许从指定职能中获取多个母体框架。

这一点在C中并未使用,因为没有冻结的职能;当地变量只具有它们重新宣布的职能范围。 这一结构不存在(尽管我有时希望这样做):

void func_a(void)
{
    int a1 = 7;

    void func_b(void)
    {
        printf("a1 = %d
", a1);  /* a1 inherited from func_a() */
    }

    func_b();
}

Python functions

def func_a():
    a1 = 7
    def func_b():
        print  a1 = %d  % a1      # a1 inherited from func_a()
    func_b()

当然,斯图尔特的代码是直译为x86机器代码的,因此无法(类似吗)利用这一指示。

www.un.org/Depts/DGACM/index_spanish.htm 是否有任何语言能够编集X86,并提供封顶功能? 有没有编辑人员可以发布“ENTER指令,但不是第二版吗?。

国际英特尔公司将非零时间/金钱投入到这种宽松级操作中,如果有人使用,则基本是一味的:

参考资料:

最佳回答
问题回答

http://stackoverflow.com/questions/263215/do-any-languages-compilers-utilize-the-x86-enter-instruction-with-a-zero-ne#comment41311163_263215” Idonotexist 指出,“海合会>/em>利用上文所显示的精确辛迪-克斯一号支持职能。

但是,它没有使用<条码>ENTER指令。 相反,用于加固功能的变数在地方变数领域被组合在一起,而这一组的一个点被移至封顶功能。 有趣的是,这一“母体变量的点子”是通过非标准机制通过的: 关于x64,在<代码>r10上通过,在x86(cdecl)上通过,保留在C++的<代码>this点(在任何方面不支持封闭功能)。

#include <stdio.h>
void func_a(void)
{
    int a1 = 0x1001;
    int a2=2, a3=3, a4=4;
    int a5 = 0x1005;

    void func_b(int p1, int p2)
    {
        /* Use variables from func_a() */
        printf("a1=%d a5=%d
", a1, a5);
    }
    func_b(1, 2);
}

int main(void)
{
    func_a();
    return 0;
}

• 编制以下(不适用)代码,用于64比值:

00000000004004dc <func_b.2172>:
  4004dc:   push   rbp
  4004dd:   mov    rbp,rsp
  4004e0:   sub    rsp,0x10
  4004e4:   mov    DWORD PTR [rbp-0x4],edi
  4004e7:   mov    DWORD PTR [rbp-0x8],esi
  4004ea:   mov    rax,r10                    ; ptr to calling function "shared" vars
  4004ed:   mov    ecx,DWORD PTR [rax+0x4]
  4004f0:   mov    eax,DWORD PTR [rax]
  4004f2:   mov    edx,eax
  4004f4:   mov    esi,ecx
  4004f6:   mov    edi,0x400610
  4004fb:   mov    eax,0x0
  400500:   call   4003b0 <printf@plt>
  400505:   leave  
  400506:   ret    

0000000000400507 <func_a>:
  400507:   push   rbp
  400508:   mov    rbp,rsp
  40050b:   sub    rsp,0x20
  40050f:   mov    DWORD PTR [rbp-0x1c],0x1001
  400516:   mov    DWORD PTR [rbp-0x4],0x2
  40051d:   mov    DWORD PTR [rbp-0x8],0x3
  400524:   mov    DWORD PTR [rbp-0xc],0x4
  40052b:   mov    DWORD PTR [rbp-0x20],0x1005
  400532:   lea    rax,[rbp-0x20]              ; Pass a, b to the nested function
  400536:   mov    r10,rax                     ; in r10 !
  400539:   mov    esi,0x2
  40053e:   mov    edi,0x1
  400543:   call   4004dc <func_b.2172>
  400548:   leave  
  400549:   ret  

objdump-no-show-raw-insn> - d-Mintel

这相当于像以下几句:

struct func_a_ctx
{
    int a1, a5;
};

void func_b(struct func_a_ctx *ctx, int p1, int p2)
{
    /* Use variables from func_a() */
    printf("a1=%d a5=%d
", ctx->a1, ctx->a5);
}

void func_a(void)
{
    int a2=2, a3=3, a4=4;
    struct func_a_ctx ctx = {
        .a1 = 0x1001,
        .a5 = 0x1005,
    };

    func_b(&ctx, 1, 2);
}

我们的PARLANSE汇编者(关于SMP x86)的精细平行方案,有条理性的范围。

PARLANSE试图生产许多小块平行的mputation,然后将其 multiple上(每个CPU)。 事实上, st子分配得太大;我们不希望支付每块谷物的“大 st”价格,因为我们有许多,我们确实不想限制深层东西的再发生。 由于平行的ks子, st实际上是一种 ca。

每个程序在入境时都进行灵活展示,以便能够进入周围的灵活范围。 我们考虑使用ENTER指令,但出于以下两个原因决定予以反对:

  • As others have noted, it isn t particularly fast. MOV instructions do just as well.
  • We observed that the display is often sparse, and tends to be denser on the lexically deeper side. Most internal helper functions do fine with access only to their direct lexical parent; you don t always need access to all of your parents. Sometimes none.

因此,汇编者准确地表明,在ENTER将要到处的代理职能中,职能范围具有哪些灵活性,只需要复制实际需要的母体显示部分。 这往往变成了1或2平方。

因此,我们在使用ENTER方面取得两倍的业绩。

IMHO, ENTER is now one of those LegacyCISC Directive, which prostitution and child prostitution and child prostitution and child pornography

我用Simics虚拟平台对六氯环己烷boot进行了一些计算,发现从未使用过ENTER。 然而,组合中的独角兽部队指示数很多。 CALL与LEAVE之间几乎存在1-1相关性。 这似乎证实了这样一种想法,即ENTER只是缓慢和昂贵的,而LEAVE是相当强大的手法。 这是按2.6号编计算。

在4.4英亩和3.14英亩的油轮试验中,低浓缩铀或ENTER的用途为零。 简言之,用于汇编这些掩体的新电梯的电梯法生成已停止排放液态(或机器选择有不同规定)。

IMP77 (developed at Edinburgh University) allows nested routines/functions. The Intel version of the compiler uses the ENTER instruction sometimes with a non-zero level value.

Vector Pascal汇编者利用这一指示进入程序。 帕斯卡尔允许任意放任,而由拉普公司支持的展示是有用的。

Corresponding Intel instructions showing IMP source and generated machine code ! main routine/program %begin 0000 C8 00 00 01 ENTER 0000,1

! global variable
%integer sum

! nested routine
%integer %function mcode001( %integer number, x )
 0004 EB 00                                 JMP L1001
 0006                      L1002  EQU $
 0006 C8 00 00 02                           ENTER 0000,2
    ! local variable
    %integer r

    r = number + x
 000A 8B 45 0C                              MOV EAX,[EBP+12]
 000D 03 45 08                              ADD EAX,[EBP+8]
 0010 89 45 F4                              MOV [EBP-12],EAX

    %result = r
 0013 8B 45 F4                              MOV EAX,[EBP-12]
 0016 C9                                    LEAVE
 0017 C3                                    RET
%end
 0018                      L1001  EQU $

! call the nested routine
sum = mcode001(46,24)&255
 0018 6A 2E                                 PUSH 46
 001A 6A 18                                 PUSH 24
 001C E8 00 00                              CALL  MCODE001  (INTERNAL L1002 )
 001F 83 C4 08                              ADD ESP,8
 0022 25 FF 00 00 00                        AND EAX,255
 0027 89 45 F8                              MOV [EBP-8],EAX

! show the result itos converts binary integer to text
printstring("Result =".itos(sum,3)); newline
 002A FF 75 F8                              PUSH WORD PTR [EBP-8]
 002D 6A 03                                 PUSH 3
 002F 8D 85 F8 FE FF FF                     LEA EAX,[EBP-264]
 0035 50                                    PUSH EAX
 0036 E8 42 00                              CALL  ITOS  (EXTERN 66)
 0039 83 C4 0C                              ADD ESP,12
 003C 8D 85 F8 FD FF FF                     LEA EAX,[EBP-520]
 0042 50                                    PUSH EAX
 0043 B8 00 00 00 00                        MOV EAX,COT+0
 0048 50                                    PUSH EAX
 0049 68 FF 00 00 00                        PUSH 255
 004E E8 03 00                              CALL  _IMPSTRCPY  (EXTERN 3)
 0051 83 C4 0C                              ADD ESP,12
 0054 8D 85 F8 FD FF FF                     LEA EAX,[EBP-520]
 005A 50                                    PUSH EAX
 005B 8D 85 F8 FE FF FF                     LEA EAX,[EBP-264]
 0061 50                                    PUSH EAX
 0062 68 FF 00 00 00                        PUSH 255
 0067 E8 05 00                              CALL  _IMPSTRCAT  (EXTERN 5)
 006A 83 C4 0C                              ADD ESP,12
 006D 81 EC 00 01 00 00                     SUB ESP,256
 0073 89 E0                                 MOV EAX,ESP
 0075 50                                    PUSH EAX
 0076 8D 85 F8 FD FF FF                     LEA EAX,[EBP-520]
 007C 50                                    PUSH EAX
 007D 68 FF 00 00 00                        PUSH 255
 0082 E8 03 00                              CALL  _IMPSTRCPY  (EXTERN 3)
 0085 83 C4 0C                              ADD ESP,12
 0088 E8 34 00                              CALL  PRINTSTRING  (EXTERN 52)
 008B 81 C4 00 01 00 00                     ADD ESP,256
 0091 E8 3C 00                              CALL  NEWLINE  (EXTERN 60)

%endofprogram
 0094 C9                                    LEAVE
 0095 C3                                    RET
      _TEXT  ENDS
      CONST  SEGMENT WORD PUBLIC  CONST 
 0000                                       db 08,52 ; .R
 0002                                       db 65,73 ; es
 0004                                       db 75,6C ; ul
 0006                                       db 74,20 ; t.
 0008                                       db 3D,00 ; =.
      CONST  ENDS
      _TEXT  SEGMENT WORD PUBLIC  CODE 
             ENDS
      DATA  SEGMENT WORD PUBLIC  DATA 
      DATA    ENDS
              ENDS
      _SWTAB  SEGMENT WORD PUBLIC  _SWTAB 
      _SWTAB   ENDS

我在Pascal汇编者中使用。 虽然据说比对等法要慢,但比较紧凑。 31年的宽限不是大的,但64kb的限额进入地方可能是一个问题。 我使用的解决办法是让0名当地人进入,然后在进入指示后分配当地人。 只有在当地人超过64kb时才需要这样做。

有一些最佳办法可以消除进入的用途,甚至可以消除一般的隔.。 例如,不需要使用零封顶功能。 此外,你也可以通过电子冲抵当地人,因此,你不需要完全的白盔交换。

! main routine/program
%begin

! global variable
%integer sum

! nested routine
%integer %function mcode001( %integer number, x )
    ! local variable
    %integer r

    r = number + x

    %result = r
%end

! call the nested routine
sum = mcode001(46,24)&255

! show the result itos converts binary integer to text
printstring("Result =".itos(sum,3)); newline

%endofprogram




相关问题
热门标签