对于我的任务,我必须填写下面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;
}
其他要点:
汇编代码结果示例:
# 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
答案 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;
即使编译器为此选择了另一个标签,(也会产生相同的结果)