16位汇编语言中的循环结构主要通过条件跳转指令(如LOOP
、JMP
, JE
, JNE
, JG
, JL
, 等)来实现,常见的循环类型包括for
循环和while
循环;
Loop指令
LOOP
指令的操作非常简单:它将CX寄存器的值减1,如果结果不为零,则跳转到指定的标签。这使得它特别适用于已知循环次数的情况,比如for
循环。
LOOP target
target
是一个标签,指向循环的开始位置。
示例:打印9~1值
assume cs:code
code segment
start:mov cl,9
;循环体
loop_test:mov al,cladd al,30h ;将值转化为ASCII字符mov dl,al ;输出的内容转入dl寄存器中mov ah,02h ;调用21号中断的02功能号进行内容输出int 21hloop loop_test
mov ah,07hint 21hmov ax,4c00hint 21h
code ends
end start
mov cl,9
将寄存器 CL
设置为 9,表示将从9开始循环。
循环体:
mov al,cl
:将 CL
的值复制到 AL
寄存器。
add al,30h
:将 AL
的值加上 30h
。在ASCII码表中,数字字符'0'的值是0x30,所以加上0x30可以将0-9的数字转换为'0'-'9'的ASCII字符。
mov dl,al
:将 AL
的值复制到 DL
寄存器。DOS中断21h的功能号02h要求输出的字符存储在 DL
中。
mov ah,02h
:设置 AH
为 02h,准备调用DOS中断21h的功能号02h,进行字符输出。
int 21h
:调用DOS中断21h,输出字符。
loop loop_test
:将 CL
减1,如果 CL
不为零,则跳转到 loop_test
继续循环。
执行结果:
JCC指令构造循环
条件跳转:在16位汇编语言中,可以使用条件跳转指令(JCC指令)来构造循环结构。JCC指令(Jump if Condition is met)包括一系列条件跳转指令,如 JE(等于跳转)
, JNE(不等于跳转)
, JG(大于跳转)
, JL
, JGE(大于等于跳转)
, JLE(小于等于跳转)
等,用于根据条件进行跳转。
示例:打印1-9
assume cs:code
code segment
start:mov bx,1
loop_test: ;循环标签mov al,bladd al,30hmov dl,almov ah,02hint 21hinc bxcmp bx,10jl loop_test ;跳转到循环标签
mov ah,07hint 21hmov ax,4c00hint 21h
code ends
end start
代码含义:
mov bx,1
:初始化寄存器BX
为1。BX
寄存器将作为循环计数器,并用于生成要打印的数字。
mov al,bl
:将BL
(BX
的低字节)的值复制到AL
寄存器。
add al,30h
:将AL
寄存器的值加上30h(48的十六进制值),这是为了将数字转换为对应的ASCII码。例如,数字1的ASCII码是49(31h),等于1 + 48。
mov dl,al
:将转换后的ASCII码从AL
寄存器复制到DL
寄存器。
mov ah,02h
:将AH
寄存器设置为02h,这是DOS的打印字符功能。
int 21h
:通过int 21h
中断调用DOS服务来打印DL
寄存器中的字符。
inc bx
指令将BX
寄存器的值加1。
cmp bx,10
指令将BX
的值与10进行比较。
jl loop_test
如果BX
小于10,jl loop_test
指令会跳转回loop_test
标签,继续循环。