堆栈的组装用法
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
代码应该像这样工作: 从输入中读取一个字符并查看它是否为大写字母 重复阅读,直到读入一个非大写字符 打印出以最新读入字母开头的所有大写字符 例如: 一种 乙 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