回 帖 发 新 帖 刷新版面

主题:汇编程序的连接,不会总出错

这是一个敲击键盘发声程序
是由soundf 调用waitf
再由piano 程序调用soundf 程序实现键盘发声
PUBLIC waitf
C_SEG SEGMENT  PARA'CODE'
      ASSUME   CS:C_SEG
waitf  proc    far
       push ax
waitf1:
       in al,61h
       and al,10h
       cmp al,ah
       je waitf1
       mov ah,al
       loop waitf1
    pop ax
       ret
waitf  endp
c_seg  ends
end
----------------第一个程序结束
PUBLIC SOUNDF
EXTRN  WAITF:FAR
C_SEG SEGMENT  PARA'CODE'
      ASSUME   CS:C_SEG
soundf proc far
       push ax
       push bx
       push cx
       push dx
       push di
       mov al,0b6h
       out 43h,al
       mov dx,12h
       mov ax,348Ch
       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,663
       call waitf
       dec bx
       jnz wait1
       mov al,ah
       out 61h,al
       pop di
       pop dx
-----------------第二个程序
;piano   
EXTRN   SOUNDf:FAR
EXTRN   WAITF:FAR
STACK   SEGMENT STACK  PARA  'STACK'
        DB       64    DUP('STACK...')
STACK   ENDS
DSEG    SEGMENT  PARA  'DATA'
TABLE   DW  262
        DW  294
        DW  330
        DW  349
        DW  392
        DW  440
        DW  494
        DW  523
DSEG    ENDS
CSEG    SEGMENT PARA 'CODE'
        ASSUME  SS:STACK,DS:DSEG,CS:CSEG
MAIN    PROC   FAR
        MOV    AX,DSEG
        MOV    DS,AX
        MOV    AX,STACK
        MOV    SS,AX
NEW_NOTE:
       MOV   AH,0
       INT   16H
       CMP   AL,0DH
       JE    EXIT
       MOV   BX,OFFSET  TABLE
       CMP   AL,'1'
       JB    NEW_NOTE
       CMP   AL,'8'
       JA    NEW_NOTE
       AND   AX,0FH
       SHL   AX,1
       SUB   AX,2
       MOV   SI,AX
       MOV   DI,[BX][DI]
       MOV   BX,10
       CALL  SOUNDF
       JMP   NEW_NOTE
EXIT:
       MOV   AX,4C00H
       INT   21H
MAIN   ENDP
CSEG   ENDS
END    MAIN
-------------主程序
连接的时候总是有问题,键盘也不可以发声音
谁帮忙看下啊,学妹感激不尽



回复列表 (共10个回复)

沙发


;main.asm
EXTRN   soundf: FAR
EXTRN   waitf: FAR

STACK   SEGMENT STACK  PARA  'STACK'
        DB      64    DUP ('STACK...')
STACK   ENDS

DSEG    SEGMENT PARA  'DATA'
TABLE   DW    262
        DW    294
        DW    330
        DW  349
        DW    392
        DW  440
        DW  494
        DW  523
DSEG    ENDS

CSEG    SEGMENT PARA 'CODE'
        ASSUME  SS:STACK, DS:DSEG, CS:CSEG
MAIN    PROC   FAR
        MOV    AX, DSEG
        MOV    DS, AX
        MOV    AX, STACK
        MOV    SS, AX
NEW_NOTE:
        XOR        AH, AH
        INT        16H
        CMP        AL, 0DH
        JE        EXIT
        CMP        AL, '1'
        JB        NEW_NOTE
        CMP        AL, '8'
        JA        NEW_NOTE
        AND        AX, 0FH
        SHL        AX, 1
        SUB        AX, 2
        MOV        SI, AX
        MOV        DI, [SI + TABLE]
        MOV        BX, 10
        CALL    soundf
        JMP        NEW_NOTE
EXIT:
        MOV   AX, 4C00H
        INT   21H
MAIN   ENDP
CSEG   ENDS
        END    MAIN

板凳


;soundf.asm
PUBLIC    soundf
EXTRN    waitf: FAR
C_SEG    SEGMENT  PARA 'CODE'
        ASSUME   CS: C_SEG
soundf    proc    far
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
        mov        al, 0b6h
        out        43h, al
        mov        dx, 12h
        mov        ax, 348Ch
        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, 663
        call    waitf
        dec        bx
        jnz        wait1
        mov        al, ah
        out        61h, al
        pop        di
        pop        dx
        pop        cx
        pop        bx
        pop        ax
        retf
soundf    endp
C_SEG   ends
        end

3 楼


;waitf.asm
PUBLIC    waitf
C_SEG    SEGMENT  PARA 'CODE'
        ASSUME   CS: C_SEG
waitf    proc    far
        push    ax
waitf1:
        in        al,    61h
        and        al,    10h
        cmp        al, ah
        je        waitf1
        mov        ah, al
        loop    waitf1
        pop        ax
        retf
waitf    endp
C_SEG    ends
        end

4 楼

给你提个建议吧,
以后写程序不要一会大写一会小写[em20],很难度的。

5 楼

编译仍然不可以通过

6 楼

?
我编译成功

masm yourfile.asm
link main.obj+soundf.obj+waitf.obj

7 楼

看来终生无望了!!
学这个以来没运行过一个程序,书上的抄上也没用!!

楼主能不能具体,具体,再具体啊!!能够体会一次,怎么也值啊!!

8 楼

我编译了几次,还是通过不了
error:
there was 1  error  detected
unresoulved externals

9 楼

不可能!!
asm 和  link 什么版本??

10 楼

应该不是这样的问题吧
我的masm没有问题的
link也应该没有问题
我也不知道为什么?
QQ:295465467

我来回复

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