两个数中的较大数
下面的代码比较了 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