- [游客] 感谢 11/15 22:10
- [游客] 把:DD 5937000,改成:DD 4294967295,你的错误,立刻就暴露出来。呵呵 05/19 18:30
- [游客] 计算人均时,是DD型除以DW型。把DD型的最大值代进去,你的程序,就溢出了。 05/19 18:28
- [游客] 注意不溢出的除法。 05/19 18:25
- [游客] 老师好啊~ 06/28 11:01
- [longphui] 谢谢 09/03 20:10
- [longphui] 谢谢 09/03 16:23
- [longphui] 谢谢 09/02 15:26
- [longphui] 谢谢 09/02 09:13
- [sissim] 恩恩,谢谢指正 01/11 18:24
- [even3] 亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下, 05/16 20:48
- [mcjfo] 楼主可以帮我解决这个问题吗?谢谢! 为什么它会跳过JMP DD 指令不执行啊 小弟搞了好久抖没 06/08 06:50
[ 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