5.1常用控制类汇编指令
1.JMP标志
无条件转义指令,跳到标志处去
标志:label1: 名字任意后面价格冒号,之后就可以写跳转后的代码
2.条件转移
(1)JC:若CF=1则转,JNC相反
(2)JZ/JE:ZF=1则转移,/表示JZ与JE等效,同样加个N表示相反的
(3)JS:SF则转,JNS相反
(4)JO:OF则转,JNO相反
(5)JP/JPE:PF=1则转,JNP/JPO相反
3、无符号数比较转移指令,和CMP搭配使用
(1)JA/JNBE:若CF=ZF=0,(被减数大于减数),则转移
(2)JAE/JNB:若CF=0(被减数大于或等于减数),则转移
(3)JB/JNAE:若CF=1(被减数小于减数),则转移
(4)JBE/JNA:若CF=1或ZF=1(被减数小于或等于减数),则转移
4、有符号数比较转移指令
(1)JG/JNE:SF=OF且ZF=0,则转移
(2)JGE/JNL:若SF=OF
(3)JL/JNGE:SF!=OF
(4)JLE/JNG:SF!=OF或ZF=1
5、loop指令
用于控制计数循环,作为循环的最后一条指令,计数器指定CX,采用减1技术,CX=0时循环结束。Loop转移是段内短距离转移。
指令 | 名称 | 常用格式 |
JMP | 无条件跳转 | Jmp |
JC | 条件跳转 | CF=1则跳转 |
JZ | 条件跳转 | ZF=1则跳转 |
JO | 条件跳转 | OF=1则跳转 |
JP | 条件跳转 | PF=1则跳转 |
LOOP | 循环 | Cx为标志,每次减一 |
5.2编程实现统计寄存器AX中“1”和“0”的个数;
assume cs:code
code segment
start:
mov al,10100101B
xor bx,bx
mov cx,4
circle:
rol al,1;循环左移,最左边的一位 被输入到了CF
jc BitSet;jc判断(CF)进位标志位是否为1,为1则跳转
inc bh
loop circle
jmp CountOver
BitSet:
inc bl
loop circle
CountOver:
mov ch,bh
mov cl,bl
mov ax,4C00H
int 21H
code ends
end start
有一个1,CF标志寄存器就会修改
代码实现:
assume cs:code,ds:data
data segment
db '1. file '
db '2. edit '
db '3. search '
db '4. view '
db '5. options '
db '6. help '
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,6
s:
mov ax,3[bx]
and ax,11011111b
mov 3[bx],ax
add bx,16
loop s
mov ax,4c00h
int 21h
code ends
end start
5.3编程实现从键盘输入10个1位整数
代码实现:
assume cs:code,ds:data
data segment
db '1. file '
db '2. edit '
db '3. search '
db '4. view '
db '5. options '
db '6. help '
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,6
s:
mov ax,3[bx]
and ax,11011111b
mov 3[bx],ax
add bx,16
loop s
mov ax,4c00h
int 21h
code ends
end start
5.4编程实现从键盘输入两个10进制的2位整数的和
assume cs:code,ds:data
data segment
db 'welcome to masm!'
db '................'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov di,16
mov cx,8
s:
mov ax,[si]
mov [di],ax
inc si
inc si
inc di
inc di
loop s
mov ax,4c00h
int 21
code ends
end start