汇编中,执行循环语句,使用的是loop指令,语法
loop 标号
标号是一个特殊语法的符号,例如
start:
这里的start是一个标号,它由一个单词,加冒号组成
在每次执行loop中的内容时,会先执行cx = cx-1,即cx是内置的次数控制
循环指令实例
任务1:利用加法实现2^2,结果放在ax中
assume cs:code
code segment
mov ax, 2
mov ax, ax
mov ax, 4c00h
int 21h
code ends
end
任务2:利用加法实现2^3,结果放在ax中
assume cs:code
code segment
mov ax, 2
mov ax, ax
mov ax, ax
mov ax, 4c00h
int 21h
code ends
end
任务3:利用加法实现2^12,结果放在ax中
由于重复太多,这里使用loop,cs控制循环次数,尽量不要在loop中改变cx的值,cx的值是多少就循环多少次
assume cs:code
code segment
start: mov ax,2
mov cx, 11
s: add ax, ax
loop s
mov ax, 4c00h
int 21h
code ends
end start
如果继续增加循环次数, 数据是否会超出ax存储范围?
汇编的显示功能
这里仅粗略介绍显示功能,并不详细介绍中断
与程序的退出代码相似
lea dx, ds:[0] ; 相当于 mov dx, 0
mov ah, 09h
int 21h
在这里,实际起作用的是后2句,mov ah, 09h,也可以写成mov ax, 0900h等
09号功能会将dx的地址所指向的数据显示出来(显示字符串),前一句lea是将ds的0偏移地址给dx( 其实这里可以直接用 mov dx, 0)
除了起始地址,在显示时,需要一个终止符号,否则可能显示一些无用的乱码,终止符号为:$, 它的16进制为24h
在显示时,以字节为单位,且原封不动翻译ASCII字符集
显示2^3的数据在屏幕
code segment
assume cs:code
start:
mov ax,2
mov cx, 2 ; 结果不要大于9
s:
add ax, ax
loop s
add ax,30h ; 把数字转化为ASCII对应的编码
mov ds:[0], ax
mov ax, 24h
mov ds:[1], ax ; 终止符号
lea dx, ds:[0]
mov ah, 09h
int 21h
mov ax, 4c00h
int 21h
code ends
end start
上述代码仅能显示一个字节,那么超过10呢?是否应该要多个字节显示?如何显示?