堆栈的组装用法

Assembly Usage of the Stack

代码应该像这样工作: 从输入中读取一个字符并查看它是否为大写字母 重复阅读,直到读入一个非大写字符 打印出以最新读入字母开头的所有大写字符 例如: 一种 乙 C 乙 f

E C 乙 一种 .... 我的问题是 我如何使用堆栈来查明是否每个字母都已打印 什么时候结束。 如果第一个读入的字符是非大写字符,它应该打印出一条错误消息

Start:  
    call    read_char         ;reading a char and comparing if it is a uppercase letter
    mov     ebx,eax
    call    read_char          ;if a non uppercase letter is read in jump to print label

    cmp    ebx,65
    jb     PrintChar

    cmp   ebx,90
    ja    PrintChar
    
    push    ebx             ;pushing the char onto the stack and repeating the process
    
    jmp     Start

    
PrintChar:
loop:
    pop     eax                      ;pop the char from the stack to the eax register and print it
    call    print_char               

    jmp     loop                     ;repeat this process until all char are printed out (this code is not written)
    

MessageFail:

    mov      eax,msg_fail                          ;if the stack was empty (the first input a lovercase letter) print a fail message
    call    print_string
    call    print_nl
    jmp     Ende
Ende:

“我如何使用堆栈来确定是否每个字母都已打印到末尾?”

您总是可以在开始之前将一个特殊字符压入堆栈,并且在您的打印循环中您可以在打印之前检查您是否遇到了这个特殊字符。如果这样做,则跳转到 Ende。我当然不会使用大写 ASCII 范围内的字符,因为那样会导致问题。也许只是将 0x0 压入堆栈开始并在 loop 中的 pop eax 之后检查它。像这样:

Start:
    push    0x0               ; push 0x0 onto the stack to denote the beginning
ReadChars:
    call    read_char         ;reading a char and comparing if it is a uppercase letter
    mov     ebx,eax

    cmp    ebx,65
    jb     PrintChar

    cmp   ebx,90
    ja    PrintChar
    
    push    ebx             ;pushing the char onto the stack and repeating the process
    
    jmp     ReadChars

    
PrintChar:
loop:
    pop     eax                      ;pop the char from the stack to the eax register and print it

    test    eax, eax            ; test if eax=0
    jz      Ende             ; jump to end if eax was zero
    call    print_char               

    jmp     loop                     ;repeat this process until all char are printed out (this code is not written)
    

MessageFail:

    mov     eax,msg_fail                          ;if the stack was empty (the first input a lovercase letter) print a fail message
    call    print_string
    call    print_nl
    jmp     Ende
Ende:

就第一个字符超出范围时打印错误消息而言,我认为无论您是否对第一个字符进行操作,您总是可以使用备用寄存器来存储。假设您使用 ecx 来存储它。然后在 Start 中将 ecx 初始化为 0x0,并在 ReadChars 结束时将 ecx 更新为 0x1。然后,如果 ecx 为零并且您读取的字符不在大写 ASCII 范围内,您知道用户输入了无效字符序列,您可以跳转到 MessageFail