回 帖 发 新 帖 刷新版面

主题:masm成功,但link却失败

;●●●这是一个网上下载的音乐程序
DATA SEGMENT PARA 'DATA'
  INFO1 DB 0DH,0AH,'WELCOME YOU TO COME HERE!$'
  INFO2 DB 0DH,0AH,'this is a music program!$'
  INFO3 DB 0DH,0AH,'please select!$'
  INFO4 DB 0DH,0AH,'INPUT ERROR!$'
  INFO5 DB 0DH,0AH,'PLEASE INPUT AGAIN!$'
  MUSLIST DB 0DH,0AH,'A MUSIC1'
  DB 0DH,0AH,'B MUSIC2'
  DB 0DH,0AH,'C MUSIC3'
  DB 0DH,0AH,'Q EXIT'  
    DB 0DH,0AH,'$'
  MUS_FREG1 DW 330,294,262,294,3 DUP (330)
  DW 3 DUP (294),330,392,392
  DW 330,294,262,294,4 DUP (330)
  DW 294,294,330,294,262,-1
  MUS_TIME1 DW 6 DUP (25*8),50*8
  DW 2 DUP (25*8,25*8,50*8)
  DW 12 DUP (25*8),100*8
  MUS_FREG2 DW 330,392,330,294,330,392,330,294,330
  DW 330,392,330,294,262,294,330,392,294
  DW 262,262,220,196,196,220,262,294,332,262,-1
  MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100
  DW 2 DUP(50,50,25,25),100
  DW 3 DUP(50,25,25),100
  MUS_FREG3 DW 262,262,294,262,349
  DW 330,262,262,294,262
  DW 392,349,262,262,523
  DW 440,349,262,262,466
  DW 466,440,262,392,349,-1
  MUS_TIME3 DW 50,50,100,100,100
  DW 100,100,50,50,100,100
  DW 100,100,100,50,50,100
  DW 100,100,100,100,100,50
  DW 50,100,100,100,100,100
DATA ENDS
 STACK SEGMENT PARA STACK 'STACK'
  DB 200 DUP ('STACK')
 STACK ENDS
 ASSUME CS:code,ds:data;●●●不明白,多了SS:STACK就错!;●以上没错
code  segment
main PROC FAR
  MOV AX,DATA
  MOV DS,AX
  MOV AH, 0
  MOV AL,4
  INT 10H
  MOV AH,0BH
  MOV BH,0
  MOV BL,4
  INT 10H
  MOV AH,0BH
  MOV BH,01H
  MOV BL,00
  INT 10H
;*****定义一个宏*****
  SHOW MACRO b
  LEA DX,b
  MOV AH,9
  INT 21H
  ENDM
  ;**********************
  SHOW INFO1
  SHOW INFO2
  SHOW INFO3
  SHOW MUSLIST
 
  INPUT: MOV AH,01H
  INT 21H
  CMP AL,'Q'
  JZ RETU
  CMP AL,'A'
  JNZ B0
  CALL MUSIC1
  JMP EXIT1  
B0: CMP AL,'B'
  JNZ C0
  CALL MUSIC2
;JMP EXIT1;●此句导致汇编失败●虽两个导致汇编失败处注释掉masm成功,但link却失败,第一次见此情况!!!!
  C0: CMP AL,'C'  
    JNZ EXIT
  CALL MUSIC3
  EXIT1: SHOW INFO5
  JMP INPUT
EXIT: CALL CLEAR;●以下没错
  SHOW INFO4
  SHOW INFO5
  SHOW INFO1
  SHOW INFO2
  SHOW INFO3
  SHOW MUSLIST
  JMP INPUT
 RETU: MOV AH,4CH
  INT 21H
  MAIN ENDP
MUSIC1 PROC NEAR
  PUSH DS
  SUB AX,AX
  PUSH AX
  LEA SI,MUS_FREG1
  LEA BP,DS:MUS_TIME1
  FREG1: MOV DI,[SI]
  CMP DI,-1
  JE END_MUS1
  MOV DX,DS:[BP]
  MOV BX,1400
  CALL GENSOUND
  ADD SI,2
  ADD BP,2
  JMP FREG1
  END_MUS1: RET
  MUSIC1 ENDP

 GENSOUND PROC NEAR
  PUSH AX
  PUSH BX
  PUSH CX
  PUSH DX
  PUSH DI
  MOV AL,0B6H
  OUT 43H,AL
  MOV DX,12H
  MOV AX,533H*896
  DIV DI
  OUT 42H,AL
  MOV AL,AH
  OUT 42H,AL
  IN AL,61H
  MOV AH,AL
  OR AL,3
  OUT 61H,AL
  WAIT1: MOV CX,8FF0H
  DELAY1: LOOP DELAY1
  DEC BX
  JNZ WAIT1
  MOV AL,AH
  OUT 61H,AL
  POP DI
  POP DX
  POP CX
  POP BX
  POP AX
  RET
  GENSOUND ENDP
  MUSIC2 PROC NEAR
  PUSH DS
  SUB AX,AX
  PUSH AX
  LEA SI,MUS_FREG2
  LEA BP,DS:MUS_TIME2
  FREG2: MOV DI,[SI]
  CMP DI,-1
  JE END_MUS2
  MOV DX,DS:[BP]
  MOV BX,1400
  CALL GENSOUND
  ADD SI,2
  ADD BP,2
  JMP FREG1
  END_MUS2: RET
  MUSIC2 ENDP

MUSIC3 PROC NEAR
  PUSH DS
  SUB AX,AX
  PUSH AX
  LEA SI,MUS_FREG3
  LEA BP,DS:MUS_TIME3
  FREG3: MOV DI,[SI]
  CMP DI,-1
  JE END_MUS3
  MOV DX,DS:[BP]
  MOV BX,1400
  CALL GENSOUND
  ADD SI,2
  ADD BP,2
  JMP FREG1
  END_MUS3: RET
 MUSIC3 ENDP
CLEAR PROC NEAR
  PUSH AX
  PUSH BX
  PUSH CX
  PUSH DX
  MOV AH,6
  MOV AL,0
  MOV CH,0
  MOV CL,0
  MOV DH,24
  MOV DL,79
  MOV BH,7
  INT 10h
  POP DX
  POP CX
  POP BX
  POP AX
RET
CLEAR ENDP
 
 CODE ENDS
    END main

回复列表 (共1个回复)

沙发

1、 STACK SEGMENT PARA STACK 'STACK'
    DB 200 DUP ('STACK')
   STACK ENDS
    程序中并没装填堆栈段,所以此段可以不要,至于错误,可能两个原因,其一是堆栈定义应该是 DW 200 DUP(?);其二,有些编译器会警告使用了保留字STACK来定义了堆栈段。
    建议:去掉堆栈段,ASSUME中也不用 SS:STACK了,而链接时会警告,不用理会。

2、 ASSUME CS:code,ds:data 这句最好放在 CODE SEGMENT 之后:
    CODE SEGMENT
      ASSUME CS:code,ds:data,SS:_STACK
    main PROC FAR
      ......

3、 MOV AX,533H*896 溢出,编译器会警告,但是不影响编译,只是可能会影响程序功能。

4、 好习惯是把宏定义放在程序开头,就是数据段前面。象程序里那样倒也不错。

5、 “JMP EXIT1;●此句导致...”没什么问题

6、 EXIT: CALL CLEAR;●以下没错
  SHOW INFO4
  SHOW INFO5
  SHOW INFO1
  SHOW INFO2
  SHOW INFO3
  SHOW MUSLIST
    不觉得很荒诞吗?一下把提示、错误信息全部都显示出来了。但是这不影响编译链接。

    程序似乎是根据按键(A、B、C)来选择演奏对应的曲目,我没MASM,用TASM,除了几个警告以外,编译链接正常。

    至于能否正常实现程序功能,我看玄乎—— MOV AX,533H*896 之溢出,就可能造成程序运行时得不到正确结果。

附:编译链接信息(局部)
 F:\TEST>tasm tmp;
 Turbo Assembler  Version 4.1  Copyright (c) 198...

 Assembling file:   tmp.ASM
 *Warning* tmp.ASM(125) Arithmetic overflow   ;警告:运算溢出
 Error messages:    None
 Warning messages:  1
 Passes:            1
 Remaining memory:  412k

 F:\TEST>tlink tmp;
 Turbo Link  Version 7.1.30.1. Copyright (c) 198...

 F:\TEST>dir tmp.*
  Volume in drive F is User2:Video&Game
  Volume Serial Number is E814-9CED

  Directory of F:\Test

 2009-06-30  ?? 01:15             3,941 tmp.asm
 2009-06-30  ?? 01:16             1,725 TMP.EXE
 2009-06-30  ?? 01:16               228 TMP.MAP
 2009-06-30  ?? 01:16             1,224 TMP.OBJ

我来回复

您尚未登录,请登录后再回复。点此登录或注册