obj文件无法生成EXE文件是怎么回事呀?

时间:2022-02-24 10:07:10
     我用8086汇编写的一个发声报警程序,编译能通过,能够生成OBJ文件,但是在我们学校机房的编译环境下就‘无法生成EXE文件’,请问这是怎么回事呀?要怎么修改呢?下面是我的源程序。这个问题是由我的程序引起的还是编译环境引起的呢?谢谢大家,帮我我一定会给你高分的


    
STACK1 SEGMENT STACK
     DW 200 DUP(?)
STACK1 ENDS
DATA SEGMENT
MESG1    DB 'zhangjukuo ',0ah,0dh
         DB 'Exit with Esc',0ah,0dh,'$'
freq dw 2 dup(262,294,330,262)            ;"两只老虎"乐曲中,音符的频率(音阶)
     dw 2 dup(330,349,392)              ;其中,0频率表示结尾
     dw 2 dup(392,440,392,349,330,262)
     dw 2 dup(294,196,262),0

time dw 10 dup(8),16,8,8,16               ; "两只老虎"乐曲中,音符的延时(节拍)
     dw 2 dup(4,4,4,4,8,8)                ;其中4,8,16表示延时的次数
     dw 2 dup(8,8,16)


INT0A_OFF DW ?
INT0A_SEG DW ?   
NUM dw 0      
DATA ENDS
CODE SEGMENT
     ASSUME CS:CODE,DS:DATA
START:
     MOV AX,DATA
     MOV DS,AX
     
     MOV AH,09H
    MOV DX,OFFSET MESG1
  INT 21h    ;显示提示信息     

     MOV DX,303H         ;初始化8255
     MOV AL,10011000B
     OUT DX,AL
     MOV DX,301H          ;LED灯熄灭
     MOV AL,00H
     OUT DX,AL

     MOV AX,3572H         ;获取原中断向量,35为DOS功能号,72为中断向量号
     INT 21H              ;ES:BX为存放向量处
     MOV INT0A_OFF,BX     ;保存原中断向量
     MOV BX,ES
     MOV INT0A_SEG,BX      ;INT0A_OFF=bx,INT0A_SEG=es
     CLI                    ;关中断
     MOV AX,2572H           ;25为设置中断向量,DS:DX=中断向量                                      ; AL为中断类型号
     MOV DX,SEG HANDLER    ;设置新的中断向量
     PUSH DS
     MOV DS,DX
     MOV DX,OFFSET HANDLER
     INT 21H
     POP DS
     STI                       ;开中断
     IN  AL,0A1H              ;打开IRQ10
     AND AL,0FBH
     OUT 0A1H,AL
     IN  AL,21H                ;打开IRQ2
     AND AL,0FBH
     OUT 21H,AL
L1:
     MOV AH,0BH            ;检查是否有’ESC’键按下
     INT 21H
     INC AL
     JNZ LL0             ; 若无键按下,则程序往下执行
     
    MOV AH,08H             ;如有’ESC’键按下,则程序退出
     INT 21H
     CMP AL,1bH
     JZ  EXIT
LL0: MOV CL,50       ;检测是否是稳定状态
     MOV DX,300H
LL1: IN  AL, DX
     CMP AL,16H
     JNE LL0;
     DEC CL;
     JNZ LL1;
    MOV DX,303H          ;按下SW3,则PC0=1申请中断
    MOV AL,00000001B
    OUT DX,AL
    PUSH CX
    MOV CX,100
WT: LOOP WT 
    POP CX
    MOV DX,303H          ;置PC0=0
    MOV AL,00000000H
    OUT DX,AL
    JMP L1 
EXIT:
    MOV AX,2572H         ;恢复中断向量
    MOV DX,INT0A_SEG
    PUSH DS
    MOV DS,DX
    MOV DX,INT0A_OFF
    INT 21H
    POP DS
    IN  AL,0A1H         ;屏蔽IRQ10
    OR  AL,04H
    OUT 0A1H,AL
    IN  AL,21H         ;屏蔽IRQ2
    OR  AL,04H
    OUT 21H,AL
    MOV AX,4C00H       ;程序退出
    INT 21H  
 
  HANDLER proc far                      ;程序开始
       push di                   ;寄存器压栈
       push si
       push bp
       push bx
       CLI                       ;关中断
       mov al,0ch                ;关闭8253的T2计数器(8255的PC6=0)
       mov dx,303h
       out dx,al
       mov al,00h                ;关闭喇叭(8255的PC0=0)
       mov dx,303h
       out dx,al
       mov al,0b6h   ;10110110            ;8253初始化
       mov dx,307h
       out dx,al
       mov dx,307H
       mov al,0111110B
       out dx,al
       mov dx,303H
       mov al,00001001B
       out dx,al

       mov si,offset freq           ;设置频率指针→si
       mov bp,offset time          ;设置延时指针→bp
PP:    mov di,[si]                 ;取1个音符的频率→di
       cmp di,0                   ;检测是否是乐曲结尾
       je   end_sing              ;若是,则结束演凑
       
       MOV DX,301H ;闪光
       MOV AL,10
       OUT DX,AL
       MOV AL,00001001b
       MOV DX,303H
       OUT DX,AL
       PUSH CX
    MOV CX,500
LOOP1: LOOP LOOP1
    POP CX  
    MOV AL,00001000b
       MOV DX,303H
       OUT DX,AL
       
      
       mov dx,12h                ;计算音符的频率所对应的8253计数初值
       mov ax,34dch              ;1.19318MHz
       div di
       mov dx,306h               ;向8253装入计数初值
       out dx,al                  ;先装低字节
       mov al,ah
       out dx,al                  ;再装高字节
       mov dx,303h               ;打开喇叭(8255的PC0=1)
       mov al,01h
       out dx,al
       mov al,0dh                 ;打开8253的T2(PC6=1),开始发声
       out dx,al
       mov dx,303H
       mov al,00001000B
       out dx,al
       mov bx,ds:[bp]              ;取1个音符的延时次数→bx
       mov dx,305H
       mov al,bl
       out dx,al
       mov al,dh
       out dx,al
delay: mov dx,303h
       in al,dx
       test al,00010000B
       jne delay
       add si,2                    ;取下1 个音符的频率
       add bp,2                   ;取下1 个音符的延时次数
       inc num
       test num,00000001B
       jz second
       mov dx,301H
       mov al,10
       out dx,al
      jmp afterflash
second:mov dx,301H
       mov al,12
       out dx,al
afterflash:   mov dx,303h                ;关闭8253的T2(PC6=0)
       mov al,0ch
       out dx,al
       mov al,00h                 ;关闭喇叭(PC0=0)
       out dx,al
       MOV AL,00001000b           ;PC4复位pc4=0
       MOV DX,303H
       OUT DX,AL
       jmp PP
end_sing:
       mov dx, 303h               ;关闭8253的T2
       mov al, 0ch
       out dx, al 
       mov al, 00h                  ;关闭喇叭
       out dx, al 
       MOV AL,62H       ;发中断结束命令
       MOV DX,0A0H
       OUT DX,AL        ;向从片8259发EOI命令
       OUT 020H,AL      ;向主片8259发EOI命令
       STI                ;开中断
       pop bx                      ;寄存器出栈
       pop bp
       pop si
       pop di
       IRET
       HANDLER ENDP
CODE ENDS
     END START



13 个解决方案

#1


有什么提示没有啊生成EXE时候。
对于OBJ文件不能生成EXE
我记不清了。好像是要把OBJ文件放到编译器目录下,再编译就有了。

#2


没有提示,就说了个‘没有生成EXE文件’,下面的提示是unable to open file 'tf\.map.我用的是微机原理实验平台集成开发环境。那我先来试下看

#3


不行,还是那样子

#4


用MASM6.15可生.EXE可执行文件.

#5


我们现在在做实验,用的是实验室的机子

#6


是什么样的集成开发软件?

#7


应该是编译环境的问题

#8


用的什么编译器?

#9


把源文件拷到编译器所在的目录底下,用命令行CD到此目录,直接用命令编。
不要用啥集成开发环境。

#10


假设你的源程序叫1.asm
如果你用tasm,那么在命令行:
tasm 1.asm (或者tasm32 1.asm也可以)
tlink 1.obj

如果用masm类似,使用masm和link程序,或者直接用ml 1.asm也可以。

#11


你用的是什么汇编程序和连接程序呢?

最好用MASM 5之类的汇编程序和连接程序

#12


    谢谢大家,我用命令提示符就可以了,可能真跟编译环境有关吧

#13




我用MASM6.15的,可不能生成.exe是怎么回事啊  是不是没装好啊

#1


有什么提示没有啊生成EXE时候。
对于OBJ文件不能生成EXE
我记不清了。好像是要把OBJ文件放到编译器目录下,再编译就有了。

#2


没有提示,就说了个‘没有生成EXE文件’,下面的提示是unable to open file 'tf\.map.我用的是微机原理实验平台集成开发环境。那我先来试下看

#3


不行,还是那样子

#4


用MASM6.15可生.EXE可执行文件.

#5


我们现在在做实验,用的是实验室的机子

#6


是什么样的集成开发软件?

#7


应该是编译环境的问题

#8


用的什么编译器?

#9


把源文件拷到编译器所在的目录底下,用命令行CD到此目录,直接用命令编。
不要用啥集成开发环境。

#10


假设你的源程序叫1.asm
如果你用tasm,那么在命令行:
tasm 1.asm (或者tasm32 1.asm也可以)
tlink 1.obj

如果用masm类似,使用masm和link程序,或者直接用ml 1.asm也可以。

#11


你用的是什么汇编程序和连接程序呢?

最好用MASM 5之类的汇编程序和连接程序

#12


    谢谢大家,我用命令提示符就可以了,可能真跟编译环境有关吧

#13




我用MASM6.15的,可不能生成.exe是怎么回事啊  是不是没装好啊