0

こんにちは、アセンブルと OS の世界では初心者です。はい、これは私の宿題で、i386 マニュアルの深い闇に閉じ込められています。助けてください、またはヒントを教えてください..これは、行ごとに分析する必要があるコードです。この機能はEOS(教育用OS)の一部で、hal(ハードウェア抽象化層)で割り込み要求を処理しています。「objdump -d interrupt.o」を実行し、このアセンブル コードを取得しました。もちろんi386で。

00000000 <eos_ack_irq>:
   0:   55                      push   %ebp  ; push %ebp to stack to save stack before
   1:   b8 fe ff ff ff          mov    $0xfffffffe,%eax  ; what is this??
   6:   89 e5                   mov    %esp,%ebp   ; couple with "push %ebp". known as prolog assembly function.   
   8:   8b 4d 08                mov    0x8(%ebp),%ecx ; set %ecx as value of (%ebp+8)...and what is this do??
   b:   5d                      pop    %ebp ; pop the top of stack to %ebp. i know this is for getting back to callee..
   c:   d3 c0                   rol    %cl,%eax  ; ????? what is this for???
   e:   21 05 00 00 00 00       and    %eax,0x0  ; make %eax as 0. for what??
  14:   c3                      ret    ; return what register??

00000015 <eos_get_irq>:
  15:   8b 15 00 00 00 00       mov    0x0,%edx
  1b:   b8 1f 00 00 00          mov    $0x1f,%eax
  20:   55                      push   %ebp
  21:   89 e5                   mov    %esp,%ebp
  23:   56                      push   %esi
  24:   53                      push   %ebx
  25:   bb 01 00 00 00          mov    $0x1,%ebx
  2a:   89 de                   mov    %ebx,%esi
  2c:   88 c1                   mov    %al,%cl
  2e:   d3 e6                   shl    %cl,%esi
  30:   85 d6                   test   %edx,%esi
  32:   75 06                   jne    3a <eos_get_irq+0x25>
  34:   48                      dec    %eax
  35:   83 f8 ff                cmp    $0xffffffff,%eax
  38:   75 f0                   jne    2a <eos_get_irq+0x15>
  3a:   5b                      pop    %ebx
  3b:   5e                      pop    %esi
  3c:   5d                      pop    %ebp
  3d:   c3                      ret    

0000003e <eos_disable_irq_line>:
  3e:   55                      push   %ebp
  3f:   b8 01 00 00 00          mov    $0x1,%eax
  44:   89 e5                   mov    %esp,%ebp
  46:   8b 4d 08                mov    0x8(%ebp),%ecx
  49:   5d                      pop    %ebp
  4a:   d3 e0                   shl    %cl,%eax
  4c:   09 05 00 00 00 00       or     %eax,0x0
  52:   c3                      ret    

00000053 <eos_enable_irq_line>:
  53:   55                      push   %ebp
  54:   b8 fe ff ff ff          mov    $0xfffffffe,%eax
  59:   89 e5                   mov    %esp,%ebp
  5b:   8b 4d 08                mov    0x8(%ebp),%ecx
  5e:   5d                      pop    %ebp
  5f:   d3 c0                   rol    %cl,%eax
  61:   21 05 00 00 00 00       and    %eax,0x0
  67:   c3                      ret    

ここに事前に組み立てられたCコードがあります

/* ack the specified irq */
void eos_ack_irq(int32u_t irq) {
    /* clear the corresponding bit in _irq_pending register */
    _irq_pending &= ~(0x1<<irq);
}

/* get the irq number */
int32s_t eos_get_irq() {
    /* get the highest bit position in the _irq_pending register */
    int i = 31;
    for(; i>=0; i--) {
        if (_irq_pending & (0x1<<i)) {
            return i;
        }
    }
    return -1;
}

/* mask an irq */
void eos_disable_irq_line(int32u_t irq) {
    /* turn on the corresponding bit */
    _irq_mask |= (0x1<<irq);
}

/* unmask an irq */
void eos_enable_irq_line(int32u_t irq) {
    /* turn off the corresponding bit */
    _irq_mask &= ~(0x1<<irq);
}

したがって、これらの関数は、割り込み要求に対して ack と get と mask と unmask を行います。そして、私は最初のもので立ち往生しています。よろしければ、最初の関数を分析するためのヒントまたは答えを教えていただけませんか? 私は他のものを手に入れようとします...そして、別の宿題で申し訳ありません..(私のTAは電子メールを見ていません)

4

1 に答える 1