Posts Tagged ‘汇编’

July 6, 2009

没有放在程序结束处,而是放在的代码段的起始位置,更甚,由于程序是从start开始执行的,似乎永远不会执行到这两行,程序也永远不会结束。但是这个程序却能正常结束,而且是由我们的这两行代码来结束执行的。
其中的猫腻就在于短转移指令jmp short s1。jmp指令是用来更改寄存器CS:IP来实现程序的转移的,汇编语言中一般是以标号来指明跳转的目的地址的。对于长转移指令,例如jmp dword ptr ds:[0],CPU确实是以目标地址的段基址和段内偏移来修改CS:IP的。但是对于短转移来说,却是利用当前IP与目标地址之间的的偏移量来确定的。上例中,执行jmp short s1时,IP指向下一条指令nop,与目标地址s1之间偏移量为10:

   CS:IP     机器码             汇编指令(编译器将标号替换了)
0B80:0018 B80000        MOV     AX,0000    ;s1
0B80:001B CD21          INT     21
0B80:001D B80000        MOV     AX,0000
0B80:0020 EBF6          JMP     0018           ; jmp short s1
0B80:0022 90              NOP
Tags: ,,. 74 views
May 6, 2009
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
;#################################################################
;              这是一个键盘扫描程序 
;将得到的健值(01H-10H)在右边两位数码管显示 (data= XX) 
;程序采用中断结构,硬件连接上将INT_KEY信号与P3.2(INT0) 连接;
;普通的I2C通讯程序可以直接利用,为读数据子程序需要加延时
;这是ZLG7290芯片在读数据时有延时,在RDBYT中添加一个20US延时
;#################################################################
SDA		BIT	P1.0
SCL		BIT	P1.1  
WSLA		EQU	070H
RSLA		EQU	071H
DISDA		EQU	20H		;源数据块首地址
DISCON		EQU	08H		;写入数据个数		
DATA_1		EQU	30H		;变量区首地址
;********************************************************
	ORG	8000H 
	LJMP	8100H  
;********************************************************
Tags: ,. 75 views
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
	dat 	bit p3.2	;定义端口号
	clk	bit p3.3	
	cs	bit p3.4
 
	org	8000h		;程序定位及跳转指令的设置
	ljmp	8100h
	org	8100h
 
start:
	mov	sp, #60h	;定义堆栈底位置
stable:
	mov	r3, #00h	;循环体执行次数:256
	mov	r6, #00h	;寄存器清零
	mov	r7, #00h	;寄存器清零
loop:
				;取平均值主要是为了减小
				;高速模数转换干扰产生的误差
	lcall	tlc549_adc	;调用模数转换子程序
	add	a, r6		;向R7-R6累加a的值256次
	mov	r6, a
	mov 	a, #00h
	addc	a, r7
	mov	r7, a	
	lcall	delay
	djnz	r3, loop
	mov	a, r7		;将R7中的平均值送到a
	cpl	a		;a取反
	mov	p1, a		;输出a的值
	sjmp	stable
 
tlc549_adc:			;模数转换的驱动子程序
	push	07h
	clr	a		;清零
	clr	clk		;清零
	mov	r7, #08h	;由于是串行输入,每字节需要8次读入
	clr	cs		;片选信号置低位,选中模数转换器
loop1:
	setb	clk		;开始读取数据
	mov	c, dat
	rlc	a		;诸位读取,送到a
	clr	clk
	djnz	r7, loop1
	setb	cs
	setb	clk
	pop	07h
ret
 
delay:				;微小的延时,用来同步和协调单片机
				;与模数转换器的工作步调
	push	00h
	mov	r0, #00h
	djnz	r0, $
	pop	00h
ret
 
 
end
Tags: ,. 53 views
April 29, 2009

功能描述

功能很简单,程序更简单:

简单的蜂鸣器实验程序:本程序通过在P1.1输出一个音频范围的方波,驱动实验板上的蜂鸣器发出蜂鸣声,其中包含有一个定时模块,作用是使输出的方波频率在人耳朵听觉能力之内的20KHZ以下,如果没有这个延时程序的话,输出的频率将大大超出人耳朵的听觉能力,我们将不能听到声音。更改定时常数,可以改变输出频率,也就可以调整蜂鸣器的音调。

Tags: ,. 396 views

功能描述

由p1口外接按键开关,p3.3接蜂鸣器组成。

1
2
3
4
5
6
7
8
9
 	org 	8000h		;定位
	ljmp 	start
	org 	8100h
start:
	mov 	sp, #60h
	mov	tmod, #10h	;置T1为方式1
;	mov	tl1, #010h
;	mov	th1, #010h	;设初值,定时为50ms
	setb	tr1		;启动定时器T1
Tags: ,. 235 views

功能描述

正常情况下(p3.2为高电平), p3.3的电平以一定的频率连续翻转,当p3.2为低电平时,触发int0外部中断,进入中断服务程序,另p3.3保持低电平,并将p1端口加1。p3.2外接一个按键开关时,中断服务程序有防抖动的功能,这时通过一定的延时(通常为10ms–20ms)来实现的。

程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 	org 	8000h		;定位
	ljmp 	start
	org 	8003h		;中断向量
	ljmp	int_0
	org 	8100h
start:
	mov 	sp, #60h
	setb	ex0		;开int0中断
	setb 	ea		;开总中断
	mov	tcon, #00h	;低电平触发
	mov	r3, #00h
	mov	a, r3
	cpl	a
loop3:				;死循环
	mov	p1, a
	cpl	p3.3		;翻转
	lcall	DELAY		;延时
	sjmp	loop3
 
int_0:				;中断服务子程序
	push	psw
	lcall	DELAY		;防抖动
	setb	p3.3
	inc	r3
	mov	a, r3
	cpl	a
	mov	p1, a
	jnb	p3.2, $		;查询,防止多次中断
	lcall	DELAY		;还是防抖动
	pop	psw
	reti
 
DELAY:  PUSH 06H
	PUSH 07H
	MOV R7, #70H
LABEL1:
	MOV R6, #70H
LABEL2:
	DJNZ R6, $
	DJNZ R7, LABEL1
	POP 07H
	POP 06H
	RET
	END
Tags: ,. 232 views

89C51单片机,每计时一秒将P1端口翻转一次,晶振频率12MHz,中断方式实现。这里另外一个查询方式的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 	org 	8000h		;定位
	ljmp 	start
	org 	801bh		;中断向量
	ljmp	int_t1
	org 	8100h
start:
	mov 	sp, #60h
	mov	tmod, #10h	;置T1为方式1
	mov	tl1, 0fch
	mov	th1, #4bh	;设初值,定时为50ms
	mov	r1, #20		;中断次数,以使定时为1ms
	setb	tr1		;启动定时器T1
	clr	a		;累加器清零
	setb	et1		;T1中断允许
	setb	ea		;开总外部中断标志
	sjmp	$		;等待中断
 
 
int_t1:				;中断服务子程序
	push	psw		;保存程序状态字
	mov 	tl1, #0fch	;重装计数器
	mov	th1, #4bh
	djnz	r1, exit	;1s时间未到,返回主程序,等待下一次中断
	mov	r1, #20		;1s时间到,重装r1
	cpl	a		;a取反
	mov	p1, a		;输出a
exit:	pop	psw		;程序状态字出栈
	reti
 
DELAY:  PUSH 06H
	PUSH 07H
	MOV R7, #70H
LABEL1:
	MOV R6, #70H
LABEL2:
	DJNZ R6, $
	DJNZ R7, LABEL1
	POP 07H
	POP 06H
	RET
	END
Tags: ,. 68 views

89C51单片机,每计时一秒将P1端口翻转一次,晶振频率12MHz,这里另外一个中断方式的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 	org 	8000h		;定位
	ljmp 	start
	org 	8100h
start:
	mov 	sp, #60h
	mov	r1, #20	
	clr	a
	mov	tmod, #10h	;置T1为方式1
loop:	mov	tl1, 0fch
	mov	th1, #4bh	;设初值,定时为50ms
	setb	tr1		;启动定时器T1
	jnb	tf1, $		;查询TF1是否溢出
 
	clr	tf1		;清除溢出标志
	djnz	r1, loop	;1s时间未到,重装计数器
	mov	r1, #20		;1s时间到,重装r1
	cpl	a		;a取反
	mov	p1, a		;输出a
	ljmp	loop
 
	END
Tags: ,. 11 views
April 23, 2009
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        ORG 8000H                    ; position the localtion of the beginning of the commands
        LJMP START                  ; jump to the user's commands 
        ORG 8100H                    ; position the localtion of the program
START:	MOV R0, #08H       ; times of right or left shifts
	MOV A, #0FEH               ; set LED which is lighten
	JNB P3.2, LOOP_L           ; watch the switch which controls the shift direction
LOOP_R:	RR A                    ; branch 1: right shift
	MOV P1, A
	LCALL DELAY                 ; delay so that we can notice the flickering
	DJNZ R0, LOOP_R
	SJMP START
LOOP_L:	RL A                     ; branch 1: right shift
	MOV P1, A
	LCALL DELAY
	DJNZ R0, LOOP_L
	SJMP START	 
 
DELAY:  PUSH 06H                   ; subProgram impliments delaying
	PUSH 07H
	MOV R7, #0FFH
LABEL1:
	MOV R6, #0FFH
LABEL2:
	DJNZ R6, $
	DJNZ R7, LABEL1
	POP 07H
	POP 06H
	RET
	END
Tags: . 18 views
Page 2 of 212