汇编错误的寄存器预期值

时间:2014-06-01 23:04:44

标签: c assembly x86 att

代码的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的最佳方法是什么?

0 个答案:

没有答案