汇编语言-008(条件跳转应用 、loopnz 条件循环指令使用 、loopz 条件循环指令使用 、 if语句编写汇编时 、while语句编写汇编时 、循环内的if语句嵌套)

1: 条件跳转应用,三个数中最小数

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
V1 WORD 1
V2 WORD 2
V3 WORD 3

.code
main PROC
   mov ax,V1  ;假设V1是最小值
   cmp ax,V2  ;如果AX小于等于V2
   jbe L1
   mov ax,v2 
L1:
   cmp ax,V3
   jbe L2
   mov ax,V3
L2:
   INVOKE ExitProcess,0
main ENDP
END main

2: 条件跳转应用,循环直到按下按键

.386
.model flat,stdcall

include Irvine32.inc

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
char BYTE ?

.code
main PROC
    L1:
	  mov eax,10
	  call Delay  ;10毫秒的延迟
	  call ReadKey ;检查按键
	  jz L1        ;如果没有按键就循环
	  mov char,AL  ;保存字符
   INVOKE ExitProcess,0
main ENDP
END main

3: 条件跳转应用,顺序搜索数组

.386
.model flat,stdcall

include Irvine32.inc

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
intArray SWORD 0,0,0,0,1,20,35,-12,66,4,0
noneMsg BYTE "A non-zero value was not found",0

.code
main PROC
   mov ebx,OFFSET intArray
   mov ecx,LENGTHOF intArray
L1:
  cmp WORD PTR[ebx],0
  jnz found
  add ebx,2
  loop L1
  jmp notFound
found:
  movsx eax,WORD PTR[ebx]
  call WriteInt
  jmp quit
notFound:
   mov edx,OFFSET noneMsg
   call WriteString
quit:
   call Crlf
  INVOKE ExitProcess,0
main ENDP
END main

4: 条件跳转应用,简单字符串加密

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

include Irvine32.inc

KEY = 239
BUFMAX = 128

.data
sPrompt BYTE "Enter the plain text:",0
sEncrypt BYTE "Cipher text: ",0
sDecrypt BYTE "Decrypted:  ",0
buffer BYTE BUFMAX+1 DUP(0)
bufSize DWORD ?

.code
main PROC
   call InputTheString
   call TranslateBuffer
   mov edx,OFFSET sEncrypt
   call DisplayMessage
   call TranslateBuffer
   mov edx,OFFSET sDecrypt
   call DisplayMessage
   INVOKE ExitProcess,0
main ENDP

;提示用户输入一个纯文本字符串
;保存字符串和它的长度
;接收:无
;返回:无
InputTheString PROC
   pushad
   mov edx,OFFSET sPrompt
   call WriteString
   mov ecx,BUFMAX
   mov edx,OFFSET buffer
   call ReadString
   mov bufSize,eax
   call Crlf
   popad
   ret
InputTheString ENDP


;显示加密或解密消息
;接收:EDX指向消息
;返回:无
DisplayMessage PROC
   pushad
   call WriteString
   mov edx,OFFSET buffer
   call WriteString
   call Crlf
   call Crlf
   popad
   ret
DisplayMessage ENDP

;字符串的每个字符与密钥字节进行异或实现转换
;接收:无
;返回:无
TranslateBuffer PROC
   pushad
   mov ecx,bufSize
   mov esi,0
L1:
   xor buffer[esi],KEY
   inc esi
   loop L1
   popad
   ret
TranslateBuffer ENDP
END main

5: loopnz 条件循环指令使用,查找数组第一个非负数

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
array SWORD -3,-6,-1,-10,10,30,40,4
sentinel SWORD 0

.code
main PROC
  mov esi,OFFSET array
  mov ecx,LENGTHOF array
L1:
  test WORD PTR[esi],8000h  ;测试符号位
  pushfd                    ;标志位入栈
  add esi,TYPE array        ;移动到下一个位置
  popfd
  loopnz L1                 ;当ZF=0时继续循环  
  jnz quit                  ;没有发现非负数
  sub esi,TYPE array        ;ESI指向数值
quit:
  INVOKE ExitProcess,0

main ENDP
END main

6: loopz 条件循环指令使用,查找数组第一个负数

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
array SWORD 3,6,1,10,-10,-30,-40,-4
sentinel SWORD 0

.code
main PROC
  mov esi,OFFSET array
  mov ecx,LENGTHOF array
L1:
  test WORD PTR[esi],8000h  ;测试符号位
  pushfd                    ;标志位入栈
  add esi,TYPE array        ;移动到下一个位置
  popfd
  loopz L1                  ;当ZF=1时继续循环  
  jz quit                  ;没有发现非负数
  sub esi,TYPE array        ;ESI指向数值
quit:
  INVOKE ExitProcess,0

main ENDP
END main

7: if语句编写汇编时的情况

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

;if(al > bl) & (bl > cl)
;  X = 1


.data
X DWORD ?

.code
main PROC




  INVOKE ExitProcess,0
main ENDP

proc_1 PROC
	  cmp al,bl
	  ja L1
	  jmp next
	L1:
	   cmp bl,cl
	   ja L2
	   jmp next
	L2:
	   mov X,1
	next:
proc_1 ENDP


;如果将ja 换成 jbe,代码减少2条
proc_2 PROC
	
	  cmp al,bl
	  jbe next
	  cmp bl,cl
	  jbe next
	  mov X,1
	next:

proc_2 ENDP

END main

8: if语句编写汇编时的情况

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
X DWORD ?

;if(al > bl) || (bl > cl)
;X =1

.code
main PROC
  cmp al,bl
  ja L1
  cmp bl,cl
  jbe next
L1: 
  mov X,1
next:
  INVOKE ExitProcess,0
main ENDP
END main

9: while语句编写汇编时的情况

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
val1 DWORD 10
val2 DWORD 20

;while (val1 < val2)
;{
;   val1 ++;
;   val2 --;
;}

.code
main PROC
  mov eax,val1
beginwhile:
  cmp eax,val2
  jnl endwhile
  inc eax
  dec val2
  jmp beginwhile
endwhile:
  mov val1,eax
  INVOKE ExitProcess,0
main ENDP
END main

10: 循环内的if语句嵌套

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
sum DWORD 0
sample DWORD 50   ;计算数组所有大于sample的数之和
array DWORD 10,60,20,33,72,89,45,72,18
arraySize = ($ - array)/TYPE array

.code
main PROC
   mov eax,0
   mov edx,sample
   mov esi,0
   mov ecx,arraySize
L1:
   cmp esi,ecx
   jl L2
   jmp L5
L2:
   cmp array[esi*4],edx
   jg L3
   jmp L4
L3:
   add eax,array[esi*4]
L4:
   inc esi
   jmp L1
L5:
   mov sum,eax
  
  INVOKE ExitProcess,0
main ENDP
END main
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在8086汇编语言中,如果不使用LOOP指令,可以使用以下两种方式来控制循环: 1. 使用比较指令跳转指令:可以使用比较指令(如CMP)比较计数器的值和预设的值,然后使用跳转指令(如JE、JNE、JG、JL等)根据比较结果跳转到不同的位置。在跳转到对应的位置后,可以执行循环体的指令,然后再回到比较指令的位置,循环判断计数器的值是否满足条件。 以下是一个使用比较指令跳转指令来控制循环的示例代码: ``` MOV CX, 10 ; 设置计数器的初始值为10 LOOP_START: ; 循环开始的标签 ; 执行循环体的指令 ... ; 计数器减1 DEC CX ; 比较计数器的值和0,如果不为0则跳转回LOOP_START标签 CMP CX, 0 JNE LOOP_START ``` 2. 使用条件转移指令:可以使用条件转移指令(如LOOPNZ、LOOPZ、LOOPE、LOOPNE等)根据计数器的值进行跳转。这些指令会根据计数器的值自动进行比较,并根据比较结果跳转到对应的位置。这种方式更加简洁,但是需要注意计数器的初始值必须在CX寄存器中。 以下是一个使用条件转移指令来控制循环的示例代码: ``` MOV CX, 10 ; 设置计数器的初始值为10 LOOP_LOOP: ; 循环开始的标签 ; 执行循环体的指令 ... ; 计数器减1,并根据计数器的值跳转到LOOP_LOOP标签 LOOP LOOP_LOOP ``` 需要注意的是,以上两种方式都需要在循环体中修改计数器的值,否则会导致死循环。此外,循环计数器的初始值和结束条件需要根据实际情况进行设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值