缺少或需要更改此C代码的哪一部分?

时间:2016-03-31 07:10:30

标签: c assembly switch-statement

对于我的任务,我必须填写下面C代码的缺失部分。 但是,我不确定哪些部分缺失或哪部分我必须填写。 我有一个示例汇编代码,此代码将生成,但不知道我必须更改哪些部分才能获得我的预期结果。我只是想澄清一下。

typedef enum {MODE_A, MODE_B, MODE_C, MODE_D, MODE_E} mode_t;
long switch3 (long *p1, long *p2, mode_t action) {
  long result = 0;
  switch(action){
  case MODE_A:
  case MODE_B:
  case MODE_C:
  case MODE_D:
  case MODE_E:
  default;
  }
  return result;
}

其他要点:

  • 可能有些情况应该写在C中 带有漏洞的代码
  • 代码显示交换机中枚举类型值的分支 声明。 (问:这究竟是什么意思?我的教授提供了一个我不理解的复杂定义。)

汇编代码结果示例:

# p1 in %rdi, p2 in %rsi, action in %edx
.L2:                         # MODE_E
      movl    $27, %eax
      ret
.L7:                         # MODE_A
      movl    (%rsi), %rax
      movq    (%rdi), %rdx
      movq     %rdx, (%rsi)
      ret
.L5:                         # MODE_B
      movq     (%rdi), %rax
      addq     (%rsi), %rax
      movq      %rax, (%rdi)
      ret
.L4:                         # MODE_C
      movq     $59, (%rdi)
      movq     (%rsi), %rax
      ret
.L3:                         # MODE_D
      movq     (%rsi), %rax
      movq      %rax, (%rdi)
      movl      $27, %eax
      ret
.L8:                         # default
      movl      $12, %eax
      ret

2 个答案:

答案 0 :(得分:8)

由于这是一项任务,我不会给你代码。但这里有关于这两点的澄清。

RewriteEngine On Options All #php_flag display_errors Off #php_value error_reporting 1 #php_value post_max_size 8M #php_value upload_max_filesize 8M #php_value memory_limit 150M # These settings when uncommented, giving 500 Internal Server Error on # the new server http://119.18.48.12 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #RewriteRule ^/(.*).php /uat/index.php/$1.php [L,NC] RewriteRule ^/(.*).php index.php/$1.php [L,NC] #Local Server Setting #RewriteRule ^admin/(.*) administration.php/$1 [L,NC] #LIVE Server setting RewriteRule ^admin/(.*) /uat/administration.php/$1 [L,NC] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #Local Server Setting #RewriteRule ^(.*)$ index.php/$1 [L] #LIVE Server setting RewriteRule ^(.*)$ /uat/index.php/$1 [L] 通常可被视为一个块,如:

switch() case

每个if(myvar == ...){ //branch1 } else if(myvar == ...){ //branch2 } ... 都是一个分支,在您的情况下,每个分支条件都取决于枚举值。这应该回答if问题。

我写了“一般”,因为实际上branching on an enumerated type value in a switch statement更像是asm switch case。因此,一旦达到正确的jump if equals,将执行以下所有代码,甚至是下一个case语句中的代码。您必须通过以编程方式停止case块来处理此问题(您可以将其中断或返回)。那是switch点。

您可以找到大量网站来解释fall-through的工作原理。

现在你必须用正确的实现来填充每个switch case - 它似乎是排列。

答案 1 :(得分:6)

它不是很清楚。但据我所知,教授提供了汇编代码和C代码 我想他希望你以这种方式扩展C代码,编译它会产生类似于他提供的汇编代码。

我希望我没有搞砸了(我在阅读AT& T语法时遇到了重大问题),但对我来说这看起来像是:

typedef enum {MODE_A, MODE_B, MODE_C, MODE_D, MODE_E} mode_t;
long switch3 (long *p1, long *p2, mode_t action) {
  long result = 0;
  switch(action){
    case MODE_A:  result = *p2; *p2 = *p1; break;
    case MODE_B:  result = *p2; *p1 = *p1 + *p2; break;
    case MODE_C:  result = *p2; *p1 = 59; break;
    case MODE_D: *p1 = *p2;  // fallthru to E
    case MODE_E: result = 27 break;
    default: result = 12;
  }
  return result;
}

"可能存在应该在C代码中写入带有漏洞的情况"对我来说是暗示

    case MODE_D: *p1 = *p2;  // fallthru to E
    case MODE_E: result = 27 break;

应该写,而不是

    case MODE_D: *p1 = *p2;  result = 27 break;
    case MODE_E: result = 27 break;
即使编译器为此

选择了另一个标签,

(也会产生相同的结果)