注册 登录
编程论坛 汇编论坛

请教大家一个汇编中定义变量的问题

wanchaoh 发布于 2006-12-20 19:30, 4948 次点击
我想在汇编里面定义一个16位的变量a,用它来储存大于256的数,请问大家这样的变量在汇编里面如何实现的呢?谢谢

还有我想请问一下寄存器R0~R7是几位的?

60000左右的数能否全部存放而不溢出?
再次谢谢

[此贴子已经被作者于2006-12-20 19:39:59编辑过]

24 回复
#2
hu9jj2006-12-20 19:45
在汇编中没有变量的概念,只有用标号来表示指定的内存地址,在指定的内存地址中存放你需要临时保存的数据。
#3
菜鸟上路2006-12-20 19:46
a dw ? ;定义16位的变量

R0~R7没听过
#4
菜鸟上路2006-12-20 19:47
以下是引用hu9jj在2006-12-20 19:45:50的发言:
在汇编中没有变量的概念,只有用标号来表示指定的内存地址,在指定的内存地址中存放你需要临时保存的数据。

这么快

#5
hu9jj2006-12-20 19:49
R0~R7可能是在水平考试的虚拟机中的寄存器吧?
#6
lefttime2006-12-20 20:03
而变量在汇编中是必须存在的
按照你的意愿:
A=256 ;这只是一个简单的例子,不只是这样,还可以让这个定义的变量存放内存地址哦这在
选择分支里是非常实用

R0~R7是单片机中的特殊寄存器,在80x86/80x88汇编里面不出现
#7
wanchaoh2006-12-20 20:34
a dw ? ;定义16位的变量

这个可以定义16位的变量?
那我试试
#8
wanchaoh2006-12-20 20:56

我把我的程序发上来请你们帮我看看到底那里出现问题了吧:

ORG 0000H
LJMP MAIN
ORG 000BH
LJMP SUBX
ORG 001BH
LJMP SUBY

ORG 30H
MAIN:
X DW ? ;想定义一个16位的变量
Y DW ? ;同上
MOV TL0,#0CEH ;初始化
MOV TH0,#0CEH
MOV TL1,#0CEH
MOV TH1,#0CEH
MOV TMOD,#01100110B
MOV TCON,#01010000B
MOV IE,#10001010B
SJMP$ ;循环等待

ORG 100H
SUBX: ;当T0中断时
PUSH ACC
MOV TL0,#0CEH ;赋初值
MOV TH0,#0CEH ;同上
JBC P1.0,JIAX ;当P1.0口为1时,转到JIAX段
DEC X ;若P1.0口不为1时,X变量减1
POP ACC ;释放现场
RETI ;开中断

JIAX: ;当P1.0时
INC X ;X加1
POP ACC ;释放
RETI ;开中断

ORG 200H
SUBY: ;当T0中断时
PUSH ACC
MOV TL1,#0CEH
MOV TH1,#0CEH
JBC P1.1,JIAY ;若P1.1为1时,转到JIAY段
DEC Y ;若不为1时,Y自减1
POP ACC
RETI

JIAY: ;当P1.1为1时
INC Y ;Y自加1
POP ACC
RETI

上面就是全部的程序。
调试的结果是:
X DW ?
Y DW ?
这两段ERROR A9:SYNTAX ERROR
MOV TL0,#0CEH ;初始化
MOV TH0,#0CEH
MOV TL1,#0CEH
MOV TH1,#0CEH
所有这些初始化都出现同一个错误:ERROR A45:UNDEFINED SYMBOL(PASS-2)

最后还加上一个warning A41:MISSING "END" STATEMENT

好多错误呀,请大家给我出出注意,谢谢了!

[此贴子已经被作者于2006-12-20 20:57:25编辑过]

#9
lefttime2006-12-20 21:01

晕啊,这位兄弟你先说明啊,你这用的是单片机写,我还以为是汇编早些发上来不就行啦

#10
lefttime2006-12-20 21:03
很明显,单片机中哪来的DD,DW,DB啊
ERROR A9:SYNTAX ERROR 这样出现语法错误是必须的......把你想实现的功能说明下,加上你的大体的思路
#11
wanchaoh2006-12-20 21:16
好,我说说我的思路吧。

我准备用AT89s51来做一个功能:就是T0、T1分别为外部的两个脉冲源进行计数,当1个脉冲被计数器记录到后,计数器产生

中断,然后进入SUBX/SUBY子程序,在判别P1.0/P1.1位是1还是0后,利用两个16位变量X、Y分别进行自加1或者自减1,以

分别达到记录两个脉冲源发出的脉冲个数的目的。

大概就是这个思路了。
#12
wanchaoh2006-12-20 21:20
我之所以想要两个16位的变量来计算脉冲个数,是因为脉冲数很大,如果只是8位的话是不够的。。。
#13
wanchaoh2006-12-20 22:04
大家请解答一下吧,我把它顶起来不让它沉下去
#14
菜鸟上路2006-12-20 22:07
不懂单片机
#15
wanchaoh2006-12-21 10:00

之前的lefttime大哥请给个建议吧...

#16
lefttime2006-12-21 14:25
先在这里道个歉,我上个贴说错了,在单片机中存在DB、DW这样的伪指令,当然不存在DD
#17
lefttime2006-12-21 14:37
定义一个16位的变量可以这样实现
a dw #300 ;数可以变,当然这里是一个,所以范围在0~65535
R0~R7都是8位工作寄存器
60000左右的数属于16位,最大不能超过65535而单片机中比较常用的16位寄存器也就只有用DPTR比较方便,放入不会溢出
#18
wanchaoh2006-12-21 15:27
a dw #300 ;数可以变,当然这里是一个,所以范围在0~65535
哦?
那如果我要记录负数的呢?如果范围只是0~65535的话!

很谢谢你的帮助
哈哈
#19
lefttime2006-12-21 15:36
前提是针对于你现在的计数,所以我只采用无称号数来定义,我计数还不曾用过负数来计数
当然负数也完全可以定义,那就只能从-32768~32767啦
#20
wanchaoh2006-12-21 15:49
那如果我要一个可以从-65535-+65535的变量的华,那可要如何定义呢?
#21
lefttime2006-12-21 15:52

那你就脱离单自片机到汇编里来吧单片机中最多才16位,达不到-65535

#22
wanchaoh2006-12-21 16:46

兄台这句话我就不明白了,脱离单片机道汇编?按照我的理解,汇编就是写入道单片机里面的程序不是吗?
按照你的方法应该如何来实现呢?

#23
lefttime2006-12-21 18:13

呵呵,我习惯上说汇编指80x86/80x88系统;
针对16位寄存器的确单独存放不了-65535,所以在单片机里我们不能这样
......
VAR DATA -65535
......
MOV A,VAR ;这样是不可以的,累加器A才8位
MOV DPTR,VAR ;同样,会产生错误
......

但在80x86/80x88中,我们可以这样存放
......
A=-65535
MOV EAX,A ;32位的EAX足够存放
......

#24
wanchaoh2006-12-23 19:25
坏了
如果我只有89S51但是要实现储存这样大一个数你说还有办法吗?
#25
wanchaoh2006-12-25 15:49
lefttime老兄你上QQ吗?我想请教你关于上面的一些问题,我还是菜鸟,请帮下忙,请留下你的QQ吧谢谢。我的是40146365,谢谢。
1