x86汇编_条件跳转示例_笔记_36

两个数中的较大数

下面的代码比较了 EAX 和 EBX 中的两个无符号整数,并且把其中较大的数送入 EDX:

mov edx, eax                ;假设EAX存放较大的数
cmp eax, ebx                ;若 EAX ≥ EBX
jae L1                      ;跳转到 L1
mov edx, ebx                ;否则,将 EBX 的值送入 EDX
L1:                

以上代码个人认为写成这样更直观,但却变得臃肿,并不可取。

mov eax, 1
mov ebx, 2
cmp eax, ebx
jbe L1      ;如果eax<=ebx
ja L2       ;如果eax>ebx
L1: mov edx, eax
jmp finish
L2: mov edx, edx
jmp finish
finish:

三个数中的最小数

下面的代码比较了分别存放于三个变量 VI、V2 和 V3 的无符号 16 位数值,并且把其中最小的数送入AX。理解的重点,jbe L1是if的第一个分支,下面紧接的其它指令其实是另一个if分支。这与高级语言的if……then……else……结构一样的道理,但是高级语言的写法容易理解。

.data
V1 WORD 1
V2 WORD 2
V3 WORD 3

.code
        mov    ax, V1     ;假设 V1 是最小值
        cmp    ax, V2     ;如果 AX ≤ V2
        jbe    L1         ;跳转到 L1
        mov    ax, V2     ;否则,将 V2 送入 AX
L1:     cmp    ax, V3     ;如果 AX ≤ V3
        jbe L2            ;跳转到L2
        mov    ax, V3     ;否则,将V3送入AX
L2 :

顺序搜索数组

常见的编程任务是在数组中搜索满足某些条件的数值。例如,下述程序就是在一个 16 位数组中寻找第一个非零数值。如果找到,则显示该数值;否则,就显示一条信息,以说明没有发现非零数值:

INCLUDE Irvine32.inc

.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           ;将数值与0比较
    jnz found                      ;寻找数值
    add ebx,2                      ;指向下一个元素
    loop L1                        ;继续循环
    jmp    notFound                ;没有发现非零数值
found:
    movsx eax,WORD PTR[ebx]        ;送人EAX并进行符号扩展
    call WriteInt
    jmp quit
notFound:
    mov edx,OFFSET noneMsg         ;显示“没有发现”消息
    call WriteString
quit:
    call Crlf
    exit
main ENDP
END main

扫描数组的每一个数,直到发现非负数或者负数

include Irvine32.inc
 
.data
array sword -9, -6, -1, -10, 9, 30, 40, 4
sentinel sword 0
 
.code
main proc
	nop
	mov edx, 0
	mov edi, offset array
	mov ecx, lengthof array
	;一个两字节的有符号数与8000H做test操作,结果可以改变ZF符号位。
	;根据ZF的值可以判断此数的正负。ZF=0说明它是正数,ZF=1说明是负数。
    ;有了ZF值后,用jz或jnz跳转指令,跳出循环,做其它操作。
	start:	test sword ptr [edi], 1000000000000000b	
				pushfd
				jz found
				add edi, type array
				popfd
	        loop start
	jmp finish
	found:	mov dx, [edi]
	finish:
	invoke ExitProcess, 0
main endp
 
end main

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值