CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  其他开发语言 >  汇编语言

一个汇编小程序,望大虾指点

楼主toann()2004-11-02 23:28:56 在 其他开发语言 / 汇编语言 提问

题目:定义数据段DATA_SEG,他把整数5赋给第一个字节,并把整数-1,0,2,5,4放在10字数组  
              DATA_LIST头5个字单元中。写出完整的代码段,其功能为:把DATA_LIST中头5个数中的最  
              大值和最小值分别存入MAX和MIN单元中。  
   
  我的思路是:把DATA_LIST的第一个数,也就是-1分别送给MAX和MIN,然后从第二个数据开始循环比较  
                          如果MAX   <   DATA_LIST[SI]就把DATA_LIST[SI]   ->   MAX;如果MIN   >   DATA_LIST[SI]就把  
                          DATA_LIST[SI]   ->   MIN,这样循环结束后,MAX中就为最大值,MIN中就为最    
                          小值。不知是否可行?  
  问题:1、如何在屏幕输出MAX和MIN  
              2、现在的程序没有屏幕输出,怎样查看MAX和MIN的值?  
   
  我的程序如下,我现在不知道结果是否正确,希望大虾能帮忙看看:  
   
  ;*****************DataSegment****************  
  DATA_SEG   SEGMENT  
  First       DB       5  
  DATA_LIST       DW       -1,   0,   2,   5,   4,   5   DUP(?)   ;   use   5   DUP(?)   because   10   word   array  
  MAX       DW       ?  
  MIN       DW       ?  
  DATA_SEG   ENDS  
   
  ;*****************CodeSegment****************  
  CODE   SEGMENT  
  MAIN   PROC   FAR  
                      ASSUME   CS:CODE,   DS:DATA_SEG  
  START:  
                      MOV       AX,   DATA_SEG         ;   initialization   DS   segment  
                      MOV       DS,   AX  
                      MOV       SI,   0                       ;   initialization   array   pointer  
                      MOV       CX,   5                       ;   initialization   count  
                      MOV       AX,   DATA_LIST[SI]     ;   First   number   of   array   ->   MAX  
                      MOV       MAX,   AX  
                      MOV       AX,   DATA_LIST[SI]     ;   First   number   of   array   ->   MIN  
                      MOV       MIN,   AX  
  COMPARE:     INC       SI         ;   or   ADD   SI,   2  
                      INC       SI  
                      MOV       AX,   DATA_LIST[SI]  
                      CMP       MAX,   AX  
                      JL         LESS       ;   if   MAX   <   DATA_LIST[SI]   then   DATA_LIST[SI]   ->   MAX  
              L:     CMP       MIN,   AX  
                      JG         BIG         ;   if   MIN   >   DATA_LIST[SI]   then   DATA_LIST[SI]   ->   MIN  
              B:     LOOP     COMPARE  
                      JMP       OVER  
        LESS:     MOV       MAX,   AX  
                      JMP       L  
          BIG:     MOV       MIN,   AX  
                      JMP       B  
        OVER:     MOV       AX,   4C00H     ;   Return   DOS  
                      INT       21H  
  CODE     ENDS  
  END       START  
  问题点数:50、回复次数:7Top

1 楼mydo(侯佩|hopy|ks)回复于 2004-11-03 11:44:56 得分 50

Yes!楼主的方法是可以的,而且代码逻辑也正确  
  但有一些小问题,比如没有写   MAIN   ENDP   等等  
   
  ;*****************DataSegment****************  
  DATA_SEG   SEGMENT  
  First       DB       5  
  DATA_LIST       DW       -1,   0,   2,   5,   4,   5   DUP(?)    
  MAX       DW       ?  
  MIN       DW       ?  
  DATA_SEG   ENDS  
   
  ;*****************CodeSegment****************  
  CODE   SEGMENT  
   
        ASSUME   CS:CODE,   DS:DATA_SEG  
  START:  
  MAIN   PROC   FAR                      
      MOV       AX,   DATA_SEG          
                      MOV       DS,   AX  
                      MOV       SI,   0                      
                      MOV       CX,   5                      
                      MOV       AX,   DATA_LIST[SI]      
                      MOV       MAX,   AX  
                      MOV       AX,   DATA_LIST[SI]      
                      MOV       MIN,   AX  
  COMPARE:     INC       SI         ;   or   ADD   SI,   2  
                      INC       SI  
                      MOV       AX,   DATA_LIST[SI]  
                      CMP       MAX,   AX  
                      JL         LESS        
              L:     CMP       MIN,   AX  
                      JG         BIG          
              B:     LOOP     COMPARE  
                      JMP       OVER  
        LESS:     MOV       MAX,   AX  
                      JMP       L  
          BIG:     MOV       MIN,   AX  
                      JMP       B  
        OVER:     MOV       AX,   4C00H    
                      INT       21H  
  MAIN   ENDP  
  CODE     ENDS  
  END       START  
   
  1、如何在屏幕输出MAX和MIN  
  可以调用   dos   21h   的   2h   服务来屏幕显示  
  但要事先作转换。  
   
  2、现在的程序没有屏幕输出,怎样查看MAX和MIN的值?  
  可以用   Debug   来看。  
  具体为:  
  先用源代码生成   .exe   文件,比如是   rr.exe  
  D:\MASM611\MyAsm>debug   rr.exe  
  -l  
  -d100  
  13BC:0100     05   FF   FF   00   00   02   00   05-00   04   00   00   00   00   00   00       ................  
  13BC:0110     00   00   00   00   00   00   00   00-00   00   00   00   00   00   00   00       ................  
  13BC:0120     B8   CC   13   8E   D8   BE   00   00-B9   05   00   8B   84   01   00   A3       ................  
  13BC:0130     15   00   8B   84   01   00   A3   17-00   46   46   8B   84   01   00   39       .........FF....9  
  13BC:0140     06   15   00   7C   0A   39   06   17-00   7F   09   E2   EC   EB   0A   A3       ...|.9..........  
  13BC:0150     15   00   EB   F1   A3   17   00   EB-F2   B8   00   4C   CD   21   F7   EB       ...........L.!..  
  13BC:0160     58   80   3E   96   63   00   74   05-E8   F3   FD   EB   08   A1   34   37       X.>.c.t.......47  
  13BC:0170     48   50   E8   8D   29   C6   06   D3-2B   FF   EB   3D   E8   93   F3   EB       HP..)...+..=....  
  -g                                                         <--------执行  
   
  Program   terminated   normally  
  -d100  
  13BC:0100     05   FF   FF   00   00   02   00   05-00   04   00   00   00   00   00   00       ................  
  13BC:0110     00   00   00   00   00   05   00   FF-FF   00   00   00   00   00   00   00       ................  
  13BC:0120     B8   CC   13   8E   D8   BE   00   00-B9   05   00   8B   84   01   00   A3       ................  
  13BC:0130     15   00   8B   84   01   00   A3   17-00   46   46   8B   84   01   00   39       .........FF....9  
  13BC:0140     06   15   00   7C   0A   39   06   17-00   7F   09   E2   EC   EB   0A   A3       ...|.9..........  
  13BC:0150     15   00   EB   F1   A3   17   00   EB-F2   B8   00   4C   CD   21   F7   EB       ...........L.!..  
  13BC:0160     58   80   3E   96   63   00   74   05-E8   F3   FD   EB   08   A1   34   37       X.>.c.t.......47  
  13BC:0170     48   50   E8   8D   29   C6   06   D3-2B   FF   EB   3D   E8   93   F3   EB       HP..)...+..=....  
   
   
  比较一下先后   d100   输出的二进制块,在   13bc:0110   一行发现不同了吧,呵呵。Top

2 楼toann()回复于 2004-11-03 17:20:47 得分 0

呵呵,多谢大虾!!!太感谢了!!  
   
  另外我想请问一下:您说“调用   dos   21h   的   2h   服务来屏幕显示但要事先作转换。”能不能就这个程序详细说一下如何打印和转换?  
   
  另外,怕怕的问一下:您为什么输入-d100而不是其他?这条命令是什么意思:)在   13bc:0110   一行的FF-FF是不是就是MIN中的-1?MAX中的内容呢?怎样才能知道MAX和MIN在哪?Top

3 楼mydo(侯佩|hopy|ks)回复于 2004-11-03 18:30:12 得分 0

另外我想请问一下:您说“调用   dos   21h   的   2h   服务来屏幕显示但要事先作转换。”能不能就这个程序详细说一下如何打印和转换?  
   
  这个你可以搜一下以前的贴子,我写过一个。  
   
  另外,怕怕的问一下:您为什么输入-d100而不是其他?这条命令是什么意思:)  
  因为默认   l   指令将程序调入到偏移量100的位置上,d   是用来显示指定偏移量的内容的,所以d100  
  从调入程序头开始显示二进制代码。  
   
  在   13bc:0110   一行的FF-FF是不是就是MIN中的-1?MAX中的内容呢?怎样才能知道MAX和MIN在哪?  
  这个很简单,看一下前面在   DATA_SEG   中定义的变量,可以知道   MAX   和   MIN   变量在程序头开始  
  的   21   和   23   偏移处(1   +   2   *   20   -1=20)。ffff   就是   -1   max   是   5:  
   
  13BC:0100     05   FF   FF   00   00   02   00   05-00   04   00   00   00   00   00   00       ................  
  13BC:0110     00   00   00   00   00   05   00   FF-FF   00   00   00   00   00   00   00       ................  
  Top

4 楼toann()回复于 2004-11-03 19:36:01 得分 0

非常感谢!  
   
  呵呵,我要搜索什么内容的帖子啊?Top

5 楼toann()回复于 2004-11-03 20:39:24 得分 0

MOV       DX,   MAX             ;   print   MAX  
  ADD       DL,   30H  
  MOV       AH,   02  
  INT       21H  
  我用以上指令打印出了最大值5;  
  我想请问,我怎样才能打印出回车,以及最小值-1?还没有学到中断调用,以上是参考别的程序,望大虾指点:)Top

6 楼mydo(侯佩|hopy|ks)回复于 2004-11-04 07:31:08 得分 0

这样简单的加   30h   在一位数中是可以的,但多位就不行了。  
  要打印出   -1   你要事先判断是否是负数,如果是的话先打  
  -   号,然后再打   数字。Top

7 楼toann()回复于 2004-11-04 12:29:20 得分 0

呵呵,我知道了。  
  谢谢大虾。我马上结帖Top

相关问题

  • 一个递归的小程序,望大侠指点迷津
  • 出学JAVA小程序,却出错,望高手指点
  • 这个C小程序如何写成汇编?谢谢!
  • 一个小汇编程序,望指点,谢谢。急!
  • 我的小程序发布了,欢迎大家指点
  • @ @ 为什么一个小程序有8M多?!! 请指点!!
  • 网络小程序编译出错,请高手指点
  • 一个小程序,为什么会死循环?高手指点
  • 小程序代码出现的问题,请大家指点。
  • 学习汇编从0到+∞,请指点?

关键词

  • 屏幕
  • 转换
  • 打印
  • 代码
  • ds
  • ax
  • si
  • 大虾
  • bc
  • min

得分解答快速导航

  • 帖主:toann
  • mydo

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo