我正在编写一些 x86 汇编语言,但遇到了问题。最终,程序会询问用户一个问题,他们必须回答“a”或“b”。如果他们选择“a”,程序应该跳转到循环二,但如果他们选择“b”,则应该跳转到循环三。我的问题是,无论他们选择什么,程序都会打印循环二和循环三。
one:
mov eax, choice1
call print_string
call read_char
cmp al, 'a'
jl three
jmp two
two:
mov eax, choice2
call print_string
call read_char
cmp al, 'a'
jl four
jmp five
Run Code Online (Sandbox Code Playgroud)
我推荐的用于理解控制流以及如何在汇编中实现结构化语句的方法是使用某些语言(如 C)所具有的 if-goto-label 构造。\xc2\xa0 这种方法在汇编语言中相当通用,并且它是这样的:
\n我们有标签,它们不执行,但可以作为分支的目标。\xc2\xa0 我们还有无条件分支,在 C 中是语句goto label;
。\xc2\xa0 我们还有条件分支,在 C 中由 if 组成和 goto 如下:if ( ... ) goto label;
if-then-else 语句具有高级语言的模式:
\nif ( <condition> ) {\n <then-part>\n}\nelse {\n <else-part>\n}\n
Run Code Online (Sandbox Code Playgroud)\n使用 if-goto-label 的相同模式如下所示:
\n if ( ! <condition> ) goto else1;\n <then-part>\n goto endIf1;\nelse1:\n <else-part>\n endIf1:\n
Run Code Online (Sandbox Code Playgroud)\n条件需要被否定或反转,因为在汇编语言中,我们告诉处理器何时跳过then部分并执行else部分,而对于if-then-else,条件是何时触发then部分。
\n在汇编中,您需要像上面显示的 if-goto-label 形式一样的控制结构。\xc2\xa0 请记住,标签不会执行或更改处理器的行为(实际上它甚至看不到标签) ,它们被汇编器删除)。
\n对于嵌套的 if 语句,我们只需遵循模式翻译即可。\xc2\xa0 每个单独的 if 语句都需要自己的标签,这就是为什么我对它们进行编号:if1/then1/else1/endif1、if2/then2/else2/endif2。 ..
\n在汇编语言中,无条件分支(C's goto label;
)只是jmp
,条件分支是比较,然后是条件分支,例如jle
(如果有符号小于或等于则跳转或je
(如果相等则跳转)。