【问题标题】:Assembly in C - Printing specific word backwardsC 中的汇编 - 向后打印特定单词
【发布时间】:2015-02-01 20:17:40
【问题描述】:

我在向后打印特定单词时遇到了很大的问题。我正在尝试在开头找到带有“*”的单词并将它们向后打印,其余的应该正常打印。

例如:

输入aaa1 ab0 1kk *ddd *lel 2cccc2 c1

输出 aaa1 ab0 1kk ddd* lel* 2cccc2 c1

我所拥有的只是找到单词,找到带有''的单词并正常打印没有''的单词。 请帮助我,并提前感谢您对此事的关注...

必须用 C 语言编写,这是我的代码

int main() {
    char *x = "aaa1 ab0  1kk *ddd  *lel 

2cccc2 c1";
    char bufor[100];
    asm volatile (
        ".intel_syntax noprefix;"
        "mov eax, %0;"
        "push eax;"
        "mov eax, %1;"
        "push eax;"
        "call zadanie1;"
        "jmp wyjscie;"
        "zadanie1:"
        //
        //  FUNCTION START
        //
        "pushad;"                           
        "mov esi, [esp+40];"                
        "mov edx, [esp+36];"               
        "push edx;"
        "xor ecx, ecx;"
        // MAIN LOOP - WORDS SEARCHING
        "zad_loop:"
        "mov edx, [esp];"
        "lodsb;"                            
        "test al, al;"
        "jz zad_loop_end;"                 
        "cmp al, 0x20;"
        "jz zad_loop_end;"                 
        "mov [edx+ecx], al;"               
        "inc ecx;"                          
        "jmp zad_loop;"   
        // MAIN LOOP END
        "zad_loop_end:"
        "mov [edx+ecx], ch;"                
        "push eax;"
        "push ecx;"

        "test ecx, ecx;"
        "jz not_print;"
        // IS THE FIRST CHAR '*'
        "lea eax, [edx];"
        "mov al, [eax];"
        "cmp al, '*';"
        "jz backwards;"

        "test al, al;"
        "jz not_print;"
        // PRINTING THE WORD WITHOUT '*'
        "mov edx, [esp];"                   
        "mov ecx, [esp+8];"                 
        "mov ebx, 1;"
        "push eax;"                        
        "mov eax, 4;"
        "int 0x80;"
        "push 0x20;"                       
        "call print_char;"
        "pop eax;"                         

        // PRINTING THE WORD WITH '*' - BACKWARDS
        "backwards:"


        // SKIP PRINTING
        "not_print:"
        "pop ecx;"
        "pop eax;"
        "xor ecx, ecx;"
        "test al, al;"                      
        "jnz zad_loop;"                    

        // FUNCTION END
        "pop edx;"
        "push 0x0A;"                         


        "call print_char;"
        "popad;"                            
        "ret 8;"                          

        // CHAR OUTPUT
        "print_char:"
        "pushad;"
        "mov edx, 1;"
        "lea ecx, [esp+36];"
        "mov ebx, 1;"
        "mov eax, 4;"
        "int 0x80;"
        "popad;"
        "ret 4;"


        "wyjscie:"
        ".att_syntax prefix;"
        :
        : "r" (x), "r" (bufor)
        : "eax"
    );
    return 0;
}

【问题讨论】:

  • 您发布了大量汇编程序,然后说您必须用 C 编写解决方案。您到底想从我们这里得到什么?
  • 我不明白这个问题。你知道如何打印一个单词的字母,一次一个字母,继续前进。你知道如何找到一个词的结尾。但是您不知道如何找到一个单词的结尾并一次一个字母地打印字母来回退?

标签: c assembly


【解决方案1】:

指定一个寄存器作为计数器(选择任何你不用于其他东西的寄存器)并将其值设置为 0。

当您点击 * 字符时,将字符压入堆栈,直到找到空白为止,每次压入都会增加计数器。

找到空白时,将字符从堆栈中弹出,每次递减计数器并打印字符,直到计数器为 0。

【讨论】:

    【解决方案2】:

    我不了解您的编译器,但我认为您的编译器会将您编写的代码作为文本插入到变量中,而不是编译指令,因为以 " 开头的文本将被解释为文本。删除这些字符.

    【讨论】:

      猜你喜欢
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多