. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  【练习】一个查找最大数程序  [待解决] 回复[ 6次 ]   点击[ 472次 ]  
regex
[帖 主]   [ 发表时间:2010-01-21 19:48 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
为了巩固一下前九章的知识, 给自己出了一道题,找出一系列数字中最大的数。  
编写这个程序的目的, 重要是加深对转移指令的认识。 
由于现在学的还是浅薄,程序里用到的都是书里前九章的知识。 而实验九没有对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来做出判断。
这个练习的目的, 重要的是对转移指令的理解。还请大家指教。
versaariel
[第1楼]   [ 回复时间:2010-01-22 13:59 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
代码还没看,给个小技巧
3 data    segment  
4         db      00h,12h,34h,10h,90h,99h
           
len equ $ - data;newline  

5 data    ends  

15         mov cx,6  ;instead of mov cx,len
不明白意思可以google下^-^
regex
[第2楼]   [ 回复时间:2010-01-22 15:00 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
呵呵, 还没学那么多。
csusuntao
[第3楼]   [ 回复时间:2010-01-29 21:05 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:2
注册日期:2010-01-04 23:00
len equ $ - data;newline  :这个是求当前地址和段地址开始的位移,说白了就是定义的数据的数目。

不过这个知识在我们这本教材中有讲吗?我也是在另一本书中看到的这知识点。
versaariel
[第4楼]   [ 回复时间:2010-01-30 13:03 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
其实也不是很重要的,也就是扩展性好点,其他没什么
regex
[第5楼]   [ 回复时间:2010-01-30 15:28 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
哦, 相当于数据长度的一个变量
imjihye
[第6楼]   [ 回复时间:2010-02-17 22:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-01 10:35
29         mov cl,al          ;将余数放入cl 



////////////应该是将商放入CL
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved