汇编和 C 中的字符串长度验证问题

问题描述 投票:0回答:1

我是汇编语言新手,正在开发一个将汇编语言与C编写的部分相结合的程序。我的目标是提示用户输入一串字符并确保它不超过50个字符。但是,我在验证字符串长度时遇到问题。

这是我的代码:

#include <stdio.h>
#include <string.h>

int main() {
    char str[51];  // Allow for 50 characters + null terminator
    char temp[101]; // Temporary buffer to detect overflow

    // Prompt user for input
    printf("Enter a string (max 50 characters): ");
    fgets(temp, sizeof(temp), stdin);

    // Remove newline character if present
    temp[strcspn(temp, "\n")] = '\0';

    // Validate string length
    int length = strlen(temp);
    if (length > 50) {
        printf("String exceeds 50 characters.\n");
        return 1;
    }

    // Copy the validated string to the main buffer
    strcpy(str, temp);

    // Inline assembly to reverse the string
    __asm__ (
        "mov %[len], %%esi\n\t"     // esi = length
        "decl %%esi\n\t"            // esi = length - 1 (last character index)
        "xor %%ecx, %%ecx\n\t"      // ecx = 0 (starting index)

        "reverse_loop:\n\t"
        "cmp %%esi, %%ecx\n\t"      // Compare start and end indexes
        "jge loop_end\n\t"          // If start >= end, end loop

        "movb (%[str], %%ecx), %%al\n\t"  // al = str[ecx]
        "movb (%[str], %%esi), %%bl\n\t"  // bl = str[esi]

        "movb %%bl, (%[str], %%ecx)\n\t"  // str[ecx] = bl
        "movb %%al, (%[str], %%esi)\n\t"  // str[esi] = al

        "incl %%ecx\n\t"            // Increment start index
        "decl %%esi\n\t"            // Decrement end index
        "jmp reverse_loop\n\t"      // Repeat loop

        "loop_end:\n\t"
        :
        : [str] "r" (str), [len] "r" (length)
        : "%esi", "%ecx", "%al", "%bl"
    );

    // Print the reversed string
    printf("Reversed string: %s\n", str);

    return 0;
}

我遇到的问题是,程序错误地报告输入的字符串超过 50 个字符,尽管输入字符串实际上包含的字符少于 50 个。附件是演示此问题的屏幕截图。

In the provided screenshot, the issue can be observed where the program incorrectly reports that the entered string exceeds 50 characters, despite the input string actually containing fewer than 50 characters.

注意:使用的命令是:gcc -Wall -g string.c -o string

我已经检查了我的代码,并认为该问题可能与我如何删除换行符以及如何计算字符串的长度有关。但是,我无法查明问题的确切原因。

我将非常感谢任何有关如何排查和解决此问题的建议或指导,以确保字符串长度验证正常工作。谢谢您的帮助!

c linux assembly gcc x86
1个回答
0
投票

将输入限制为最大 (50) 个字节

要么更换

fgets(temp, sizeof(temp), stdin);
fgets(temp, sizeof(str)-1, stdin);

或保持原样并删除长度测试

    int length = strlen(temp);
    if (length > 50) {
        printf("String exceeds 50 characters.\n");
        return 1;
    }

也许有通知(例如......)

 if( strlen(temp) > sizeof(str)-1 )
   printf("String is %lu length, only %lu will be taken.\n", strlen(temp), sizeof(str)-1 );

最后更换

strcpy(str, temp);
strncpy(str, temp, sizeof(str)-1 );

保证

str
不会溢出

© www.soinside.com 2019 - 2024. All rights reserved.