【发布时间】:2016-02-23 05:29:58
【问题描述】:
我尝试寻找答案,但有任何相似之处的示例要么太简单,要么太复杂。我正在将 Paul Carter 的书用于汇编类,所以其中一些宏来自他。即 print_string、print_int 和 print_nl 函数。
鉴于此组装的 sn-p:
segment .data
output db "Welcome!",0
string1 db "greater than",0
string2 db "less than",0
string3 db "equal to",0
var_a dd 0Ah
segment .bss
segment .text
global _asm_main
_asm_main:
enter 0,0 ; setup routine
pusha
;***************CODE STARTS HERE***************************
mov eax, output
call print_string
call print_nl
cmp dword[var_a], 0Ah
jle label1
mov eax, string1
call print_string
call print_nl
jmp label3
label1:
cmp dword[var_a], 9h
jg label2
mov eax, string2
call print_string
call print_nl
jmp label3
label2:
mov eax, string3
call print_string
call print_nl
label3:
cmp dword [var_a], 0
jle label4
sar [var_a], 1
mov eax, dword [var_a]
call print_int
call print_nl
jmp label3
label4:
;***************CODE ENDS HERE*****************************
popa
mov eax, 0 ; return back to C
leave
ret
输出为:
欢迎!
equal to
5
2
1
0
我的问题:
我看到它最终如何通过比较到达 label2,打印“等于”消息和一个新行。不过在那之后,我在 label2 中看不到其他比较。那时, label3 是如何被调用的?程序如何“离开”label2?我了解程序集中的所有内容,除了 label2 的结尾(打印“等于”)和 label3 的开头(循环位移并打印数字)之间的所有内容。我错过了什么吗?
label2 执行后,程序的控制权会回到 label1 中第一次调用 label2 的地方吗?还是 label3 执行是因为它是按顺序执行的?
【问题讨论】: