注册 登录
编程论坛 汇编论坛

求最大数问题。新人求教。

有容就大 发布于 2012-01-31 19:59, 806 次点击
RT 下面是书上的代码:

NAME SEARCH_MAX
STACK SEGMENT PARA STACK 'STACK'
  DB 1024 DUP(?)
STACK ENDS
DATA SEGMENT
BUFFER DB 1, 2, 4, 5, 3, 8
COUNT EQU $-BUFFER
MAX DB ?
DATA ENDS
CODE SEGMENT
START PROC FAR
  ASSUME CS:CODE, DS:DATA, SS:STACK
BEGIN: PUSH DS
  XOR AX, AX
  PUSH AX
  MOV DS, AX
  LEA BX, [BUFFER]
  MOV AL, [BX]
  INC BX
  MOV CX, COUNT
  DEC CX ;这里为什么要把CX减1?   
AGAIN: CMP AL, [BX]   
  JGE NEXT
  MOV AL, [BX]
NEXT: INC BX
  LOOP AGAIN
  MOV MAX, AL
  MOV AH, 09H ;显示不出最大数吗?
  INT 21H
  MOV AH, 4CH
  INT 21H
START ENDP
CODE ENDS
  END BEGIN
运行结果却是这个:
只有本站会员才能查看附件,请 登录
为什么?

10 回复
#2
zklhp2012-01-31 21:09
程序代码:


CODE SEGMENT
    START PROC FAR
        ASSUME CS:CODE, DS:DATA, SS:STACK
        BEGIN:
            mov ax,seg DATA
            mov ds,ax
            LEA BX, [BUFFER]
            MOV AL, [BX]    ;al = 1
            INC BX
            MOV CX, COUNT    ;cx = 6
            DEC CX ;这里为什么要把CX减1? 答 这里减1是5 循环次数
            AGAIN:
                CMP AL, [BX]  
                JGE NEXT    ;大于等于跳走
                MOV AL, [BX]    ;al小于[bx]里的数 存较大的数
            NEXT:
                INC BX
            LOOP AGAIN
            MOV MAX, AL
            mov dl,al
            add dl,'0'
            MOV AH, 02H ;显示不出最大数吗?
            ;功能09H
            ; 功能描述: 输出一个字符串到标准输出设备上。如果输出操作被重定向,那么,将无法判断磁盘已满
            ;入口参数: AH=09H
            ;DS:DX=待输出字符的地址
            ;说明:待显示的字符串以’$’作为其结束标志
            ;出口参数: 无
            ;功能02H
            ; 功能描述: 向标准输出设备(如:屏幕)输出一个字符。该输出还可被重定向,如果这样做,则将无法判断磁盘是否满
            ;入口参数: AH=02H
            ;DL=待输出字符的ASCII码
            ;出口参数: 无
            INT 21H
            MOV AH, 4CH
            INT 21H
    START ENDP
CODE ENDS
END BEGIN



建议 注意代码风格 这点对汇编尤其重要
#3
有容就大2012-01-31 21:57
谢谢 你 得到正确结果了,

我应该用大写还是小写?
#4
有容就大2012-01-31 22:07
        
为什么要加上MOV   DL,AL
            ADD   DL, '0' ?
把mov ax,seg DATA的seg 去掉也行吧。
#5
zklhp2012-01-31 22:22
为什么要加上MOV   DL,AL
            ADD   DL, '0' ?

DL=待输出字符的ASCII码

0 和 '0' 不一样的 所以要加'0'

把mov ax,seg DATA的seg 去掉也行吧。

我喜欢这么写 去掉应该也对

我应该用大写还是小写?

呃 这个不好回答 你喜欢用大写就用大写 喜欢用小写就小写
#6
有容就大2012-01-31 22:45
为什么要加上MOV   DL,AL
            ADD   DL, '0' ?

DL=待输出字符的ASCII码

0 和 '0' 不一样的 所以要加'0'

我把MOV DL, AL去掉后结果是6,为什么?
#7
有容就大2012-01-31 23:03
还有 如果把BUFFER DB 1, 2, 4, 5, 3, 8中的数改成大于等于10的数,程序就不在输出数而是输出一个字符
#8
zklhp2012-01-31 23:04
没赋值 是几都可能。。
#9
zklhp2012-01-31 23:11
以下是引用有容就大在2012-1-31 23:03:19的发言:

还有 如果把BUFFER DB 1, 2, 4, 5, 3, 8中的数改成大于等于10的数,程序就不在输出数而是输出一个字符

这是自然 因为没有好的输出函数 要输出复杂一点的得自己写了

因为你这里没有多位 我就简单处理了。。


[ 本帖最后由 zklhp 于 2012-1-31 23:14 编辑 ]
#10
有容就大2012-01-31 23:14
哦 原来这样 谢谢Z版这么热心啊。
#11
、雨2012-02-03 12:36
程序代码:
DATAS SEGMENT

 ARRAY DB 11,22,5,18,23,7,13,9,2,6
    MAX  DB ?
    MIN  DB ?
DATAS ENDS

STACKS SEGMENT
  
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV SI,00H
    MOV CX,OFFSET MAX
    MOV BX,OFFSET ARRAY
    SUB CX,BX
    MOV AL,[SI]
    MOV MAX,AL
    MOV MIN,AL
LOP:
    MOV AL,[SI]
    CMP MAX,AL
    JAE NEXT    ;
     MOV MAX,AL
    CMP MIN,AL
    JNB NEXT2
    MOV MIN,AL
  
    NEXT:
    NEXT2:
    INC SI
    LOOP LOP
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START
1