为了巩固一下前九章的知识, 给自己出了一道题,找出一系列数字中最大的数。
编写这个程序的目的, 重要是加深对转移指令的认识。
由于现在学的还是浅薄,程序里用到的都是书里前九章的知识。 而实验九没有对jmp,jcxz的演练。
源程序:
====================================================
1 assume cs:code
2
3 data segment
4 db 00h,12h,34h,10h,90h,99h
5 data ends
6
7 code segment
8 start:
9 mov ax,data
10 mov ds,ax
11 ;初始化寄存器
12 mov bp,0
13 mov si,0
14 mov di,0
15 mov cx,6
16 mov al,ds:[bp] ;先假定al是最大值
17 mov ah,0
18
19 s: push cx ;保存计数
20 mov si,ax ;暂存被除数
21 mov ah,0
22 mov bl,ds:[bp+1]
23 mov bh,0
24 mov cx,bx ;检查除数是否为零
25 jcxz s2 ;如果bx为零, 则执行s2处指令
26 mov di,bx ;如果bx不为零, 暂存除数
27 div bl ;除法操作
28 mov ch,0
29 mov cl,al ;将余数放入cl
30 jcxz s1 ;如果cx为零, 执行s1处指令。
31 mov ax,si ;如果cx不为零, 即被除数最大, 放入ax,便于下次循环用
32 jmp short s2 ;执行s2处指令,进行增量操作
33
34 s1: mov ax,di ;被除数为零, 故最大数为除数,放入ax,便于下次使用
35
36 s2: inc bp ;字节增1
37 pop cx ;恢复计数
38 loop s ;检查CX是否为零
39
40 mov ah,4ch ;程序返回
41 int 21h
42
43 code ends
44 end start
45
=====================================================
实验的结果, 最大值放在了AL里。
核心思路:用除法来实现两个数的比较, 我们知道, 如果a大于等于b,那么商绝对不会是零。 据此, 就可以用jcxz来实现, 把余数放在cx里, 让jcxz来做出判断。
这个练习的目的, 重要的是对转移指令的理解。还请大家指教。 |