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
------解决方案--------------------------------------------------------
什么书啊,错误百出。CX-1倒没错,因为只需要比较5次,但起码有这样几个错误:
(1)PUSH DS没有对应的POP DS
(2)PUSH AX没有必要;XOR AX, AX要换成MOV AX, DATA
(3)MOV MAX, AL前面加一句ADD AL, 30H,DATA段定义中的MAX DB ?后面加一行DB '$' (注意单引号)--------- 或者 --------- 将MOV AH, 09H改为MOV AH, 02H
大致如此,没翻书,自己再看看吧
------解决方案--------------------------------------------------------
ADD DL, 30H ?
应该是 ADD AL, 30H
------解决方案--------------------------------------------------------
还不行的话用debug跟踪看一下
------解决方案--------------------------------------------------------
要学会使用debug。
- Assembly code
;This Program Compiled Sucess by Masm 6.15assume cs:code,ds:datadata segmentnum db 1,2,1,3,4,5,6,8,7 ;要比较数据(以字节为例)max db 0 ;初始化最大数data endscode segmentstart: mov ax,data mov ds,ax ;指定数据段 mov bx,offset num ;指针指向第一数据 mov cx,lengthof num ;次数s: mov al,[bx] ;将数据存放al中 cmp al,max ;与max比较 jae a ;作为无符号数比较,如果al≥max,则跳至标号a处 jmp b ;否则跳至标号b处,继续循环a: mov max,al ;max=alb: inc bx ;指向下一数据 loop s add max,30h ;将最大数转换成ASCII码 mov dl,max ;装入DL中,调用2号功能打印出来 mov ah,2 int 21h ;调用dos中断 mov ah,4ch ;返回dos int 21hcode endsend start
------解决方案--------------------------------------------------------