汇编网首页登录博客注册
sissim的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
友情链接

[  even3   发表于  2013-05-16 20:48  ]

亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下,能不能帮忙看看,真的很着急,后天就要课程设计答辩了。。。。真心感谢。。。
这是一个函数信号发生器的波形,有7个按键,按“1”键,产生锯齿波;按“2”键,产生三角波;按“3”键,产生方波;按“4”键,产生第一个正弦波。第五键是第二个正弦波,6、7键是调整前三个波的幅度。在示波器上显示。。。[泡泡:哭]
可是不管怎么运行这两个正弦波都无法正常出现,波形不稳定,并且有干扰,请问这是为什么。。。谢谢


CODE  SEGMENT
        ASSUME CS:CODE
START:        JMP START0
ADDR_0832   EQU   8000H        
C8255       EQU          0FF2BH        
PA8255            EQU   0FF28H        

AM DB 0FFH
START0:
        MOV        DX,C8255                        
        MOV        AL,90H             
        OUT     DX,AL                                   ;8255初始化
        MOV         DX,PA8255                                        
        IN        AL,DX                                                
        CMP        AL,0FFH                                   ;判断是否有按键按下
        JZ  START0                                       ;若无键,则跳转
        XOR  AL,0FFH
                                     ;对AL按位取反
A1:TEST AL,10H
JZ A2
MOV AM,80H
A2: TEST AL,20H
JZ START1
MOV AM,0FFH

START1:        
        TEST         AL,01H                                ;测试是不是第一个按键按下
        JZ         START2                                       ;如果不是则跳转到START2
        CALL        JUCHI                                    ;否则调用JUCHI子程序
        JMP        START0
START2:        
       TEST         AL,02H                                ;测试是不是第二个键按下
        JZ          START3
        CALL        SANJ
        JMP        START0
START3:        
        TEST         AL,04H                                 ;测试是不是第三个键按下
        JZ         START4
        CALL        FANG                    
        JMP        START0
START4: 
        TEST        AL,08H                             ;测试是不是第四个键按下
        JZ        START5
        CALL        SIN
        JMP        START0
        
START5: 
        TEST        AL,40H                             ;测试是不是第四个键按下
        JZ        START1
        CALL        SIN1
        JMP        START0
;*************锯齿波*****************
JUCHI     PROC  NEAR                     ;定义锯齿波过程
        MOV        DX,ADDR_0832       
        MOV        CX,10                                      ;设置循环次数        
 LP1:          MOV        AL,00H                    ;对AL赋初值
 STEP:  OUT          DX,AL                                                 
        INC           AL               ;执行加1操作
        CMP         AL,AM                      ;比较AL是不是为0FFH
        JNZ         STEP                          ;不是的话跳转到STEP
        LOOP         LP1                                  ;如果是的话跳转到LP1
        RET 
JUCHI ENDP
;**************三角波****************
SANJ   PROC         NEAR                                    ;定义三角波过程
        MOV    DX,ADDR_0832
        MOV        AL,00H                             ;给AL赋初值
        MOV        CX,10                                    ;设置循环次数
BEGAIN1:
        INC         AL                       ;执行加1操作 
        OUT         DX,AL
        CMP          AL,AM                               ;比较值是不是已满
        JNZ    BEGAIN1                              ;未满则跳转BEGAIN1
BEGAIN2:
        DEC         AL                                     ;执行减1操作
        OUT         DX,AL                                                
        CMP         AL,00H                                    ;比较是不是等于00H
        JNZ   BEGAIN2
        LOOP  BEGAIN1
        RET
SANJ ENDP

;**************方波*****************
FANG  PROC         NEAR        
        MOV          DX,ADDR_0832
        MOV         BX,10 
 LP2:        MOV        CX,0FFH
 BEGAIN3:
        MOV        AL,AM                                ;对AL赋值--高电平
        OUT        DX,AL                                        ;将AL值赋给DX所在的地址中
        LOOP        BEGAIN3                                 ;半周期设置        
        MOV         CX,0FFH
 BEGAIN4:
        MOV     AL,00H                                 ;对AL赋值--低电平
        OUT        DX,AL
        LOOP    BEGAIN4
        DEC        BX
        JNZ        LP2
        RET
FANG ENDP
;***************正弦波**************
SIN        PROC        NEAR
        MOV          DX,ADDR_0832
        MOV         BX,111
LP3:           LEA          SI,TAB                               ;将TAB地址赋给SI
        MOV         CX,111
NEXT1:  MOV        AL,[SI]                               ;将SI地址里面的内容给AL
        OUT        DX,AL
        INC     SI                                                        
        LOOP        NEXT1                                      ;到CX为0的时候结束跳转
        DEC        BX        
        JNZ        LP3                                             ;增加正弦波的周期数
        RET
SIN        ENDP
SIN1    PROC        NEAR
        MOV          DX,ADDR_0832
        MOV         BX,32
LP4:           LEA          SI,TAB1                               ;将TAB地址赋给SI
        MOV         CX,32
NEXT2:  MOV        AL,[SI]                               ;将SI地址里面的内容给AL
        OUT        DX,AL
        INC     SI                                                        
        LOOP        NEXT2                                      ;到CX为0的时候结束跳转
        DEC        BX        
        JNZ        LP4                                             ;增加正弦波的周期数
        RET
SIN1        ENDP        
TAB     DB 80H,85H,89H,8DH
        DB 99H,9FH,0A2H,0ABH
        DB 0B1H,0BAH,0BFH,0C2H
        DB 0C7H,0CCH,0D1H,0D6H
        DB 0DAH,0DFH,0E3H,0E7H
        DB 0EAH,0EEH,0EFH,0F2H
        DB 0F8H,0F9H,0FAH,0FBH
        DB 0FDH,0FFH,0FFH,0FFh       
        DB 0FDH,0FBH,0FAH,0F9H
        DB 0F5H,0F2H,0F1H,0EEH
        DB 0E9H,0E3H,0E1H,0DEH        
        DB 0C5H,0BFH,0BAH
        DB 0AEH,0ABH,0A2H,9CH
        DB 96H, 93H,8DH, 86H
        DB 7CH,79H,6CH,69H
        DB 66H,63H,5AH,57H
        DB 4CH,48H,40H,3AH
        DB 38H,30H,2EH,29H
        DB 25H,22H,1EH,1AH
        DB 15H,13H,0EH,0DH
        DB 09H,08H,07H,00H
        DB 02H,04H,05H,08H
        DB 0AH, 0EH,11H,13H
        DB 16H, 1AH,1EH,22H
        DB 29H,2BH,30H,35H
        DB 3AH,3DH,43H,48H
        DB 51H,57H,5AH,60H
        DB 69H,6CH,6FH,80H
TAB1    DB 80H,96H,0AEH,0C5H,0D8H,0E9H,0F5H,0FDH 
        DB 0FFH,0FDH,0F5H,0E9H,0D8H,0C5H,0AEH,96H
        DB 80H,66H,4CH,38H,25H,15H,09H,04H
        DB 00H,04H,09H,15H,25H,38H,4EH,66H        
CODE         ENDS
        END        START

[  mcjfo   发表于  2011-06-08 06:50  ]

楼主可以帮我解决这个问题吗?谢谢!
为什么它会跳过JMP DD 指令不执行啊   小弟搞了好久抖没明白请高人帮忙!!!
assume cs:code
data segment
db '1975','1976','1977','1978'
dw 16,2390,8000,16000
dw 3,28,38,130
data ends
stack segment
dw 1,1,1,1,1,1,1,1
stack ends
code segment
start: mov ax,data
       mov ds,ax
       mov ax,0b800h
       mov es,ax
       mov ax,stack
       mov ss,ax
       mov sp,16
       mov si,0
       mov di,4*160+4  //显示年份,从屏幕的第四行第三列开始
       mov cx,4
     b:push cx
       push di
       mov cx,4
     a:mov al,ds:[si]
       mov ah,00000010b
       mov es:[di],ax
       inc si
       add di,2
       loop a
       pop di
       pop cx
       add di,160
       loop b
       mov si,0
       mov bx,0
       mov di,4*160+24    // 被除数显示的位置
       mov cx,4
     e:push bx
       push cx
       mov ax,ds:[si+16]   //从数据段中取出被除数
     d:mov cx,10
       div cx
       mov cx,ax
       add dx,30h
       inc bx
       push ax              //将被除数转化为字符形式,然后显示在年份的后面
       push dx
       mov ax,0b800h
       mov es,ax
       pop dx
       mov al,dl
       mov ah,00000010b
       add bx,bx
       mov es:[di+bx],ax
       pop ax
       jcxz f
       add cx,1
       loop d
     f:add si,2
       add di,160
       pop cx
       pop bx
    loop e
       mov ax,4c00h
       int 21h
code ends
end start

页码数(1):  1 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码