代码的C版:
#include <stdio.h>
char S2[] = {65, 108, 111, 32, 123, 103, 97, 108, 101, 114, 97, 125, 33, 0};
int main (void)
{
char *pc = S2;
int count;
for (count = 0; *pc; count++)
{
*pc++;
}
printf ("%d", count);
printf("\n");
return 0;
}
目的是计算并打印S2阵列的长度,不包括'0'。 接下来是换行符。
汇编代码:
.data
S2: .byte 65, 108, 111, 32, 123, 103, 97, 108, 101, 114, 97, 125, 33, 0
Sf: .string "%d" # format string for printf
.text
.globl main
main:
/****** do no change, prologue !!!! */
push %ebp
movl %esp, %ebp
pushl %ebx
/*******/
movl $S2, %ecx
movl $0, %ebx
L1:
cmpl $0, (%ecx)
je after
incl %ecx
incl %ebx
jmp L1
after:
movl %ebx, %eax
/****** do not change - prints the value of %eax !!!! */
/* may crash the value of %eax ******/
pushl %ecx
pushl %edx
pushl %eax
pushl $Sf
cal printf
addl $8, %esp
popl %edx
popl %ecx
/*******/
movl $0, %eax /* return value */
/****** do not change - end!!!! */
popl %ebx
movl %ebp, %esp
popl %ebp
ret
/*******/
首先,我不确定如何插入新的printf。通过在Sf中添加.string“\ n”,它会更改计数值。如果我创建一个Sf2,不确定是否必须创建一个全新的printf调用,因为它在'不要更改'框中或只是在其上插入Sf2。
在任何情况下,我都会得到奇怪的值,如16,17或18,尽管S2的长度为13。 认为它可能是关于元素的大小(字节)和指令很长的东西。但改变这种情况只会让我更头疼。
那么,为什么错误的价值呢? 做新printf的最佳方法是什么?