论坛风格切换切换到宽版
  • 4476阅读
  • 18回复

请问这几句话是汇编语言吗? [复制链接]

上一主题 下一主题
离线BG4ABM
 
发帖
1139
只看楼主 倒序阅读 0楼 发表于: 2006-03-30
下面是一个键盘扫描电路,除了第一段,都能看懂。请问大家:加下划线的几句话是什么意思?是汇编语言吗?

code_seg      segment      code
data_seg      segment      data
stack_seg      segment      idata

     rseg      data_seg
key_s:      ds      1
key_v:      ds      1

     rseg      stack_seg
stack:      ds      20


an1      bit      p3.2            ;
an2      bit      p3.3            ;


     cseg      at      0000h
     jmp      main

;===============================================================================      
     rseg      code_seg
main:
     mov      sp,#(stack-1)            ; 设置栈指针
     mov      p0,#0feh            ; 初始点亮led p00
     mov      key_v,#03h            ; 初始键值

key_chksw:                        ; 循环检测按键是否按下                              
     acall      scan_key            ; 输入按键状态
     mov      key_s,a
     xrl      a,key_v                  ; 检查按键值是否改变
     jz      key_chksw            ; 若无键被按,则跳回key_chksw
     
     mov      r7,#10                  ; 延时10ms
     acall      delayms                  ; 延时去抖
     acall      scan_key            ; 再次检查按键值
     mov      key_s,a
     xrl      a,key_v
     jz      key_chksw
     
     mov      key_v,key_s            ; 保存按键状态
     acall      proc_key            ;
     sjmp      key_chksw
;===============================================================================
scan_key:                        
; 扫描按键
; 传入参数:无
; 返回值:a --- 按键状态

     clr      a
     mov      c,an1
     mov      acc.0,c
     mov      c,an2
     mov      acc.1,c
     ret

;===============================================================================      
proc_key:
; 按键处理子程序
; 传入参数: key_v --- 按键值
; 返回值: 无

     mov      a,key_v
     jnb      acc.0,proc_an1
     jnb      acc.1,proc_an2
     ret
     
proc_an1:                        ; 按键an1处理程序
     mov      a,p0                  ; 右移
     rr      a
     mov      p0,a
     ret
     
proc_an2:                        ; 按键an2处理程序
     mov      a,p0                  ; 左移
     rl      a
     mov      p0,a      
     ret

;===============================================================================      

delayms:
; 延时子程序
; 传入参数:r7 --- 延时值(ms)
; 返回值:无

     mov      a,r7
     jz      end_dlyms      
dly_lp1:
     mov      r6,#185
dly_lp2:
     nop
     nop
     nop
     djnz      r6,dly_lp2
     djnz      r7,dly_lp1

end_dlyms:
     ret
     
; end of delayms
     
     end
离线Sullivan
发帖
4817
只看该作者 1楼 发表于: 2006-03-30
汇编里没见过....
离线BG7IGJ
发帖
1998
只看该作者 2楼 发表于: 2006-03-30
是汇编~~~~~~~~~~
离线BG4ABM
发帖
1139
只看该作者 3楼 发表于: 2006-03-30
'
是汇编~~~~~~~~~~
'
为什么单片机的书里找不到这些指令呢?
离线bg6ida
发帖
1463
只看该作者 4楼 发表于: 2006-03-31
宏汇编语言
离线loverslcn
发帖
621
只看该作者 5楼 发表于: 2006-03-31
'
为什么单片机的书里找不到这些指令呢?
'
因为你看的书是c51或者pic的,而这几个指令都是8086/8088的
离线BG8AED
发帖
7574
只看该作者 6楼 发表于: 2006-03-31
标准的宏汇编语言。
离线BG4ABM
发帖
1139
只看该作者 7楼 发表于: 2006-03-31
哪种书里能找到这些宏汇编语言?
离线BG4-2-12747
发帖
1611
只看该作者 8楼 发表于: 2006-03-31
'
哪种书里能找到这些宏汇编语言?
'

去书店找找 ibm兼容电脑的教材 一般大学非计算机类的 微型计算机原理就是讲的 286他老爷爷的这种汇编语言
再具体一点 自学考试电子技术专业专科微型计算机教材就是这种书
离线BG7JUN
发帖
889
只看该作者 9楼 发表于: 2006-04-01
划线的那些都不是指令,segment是保留字,code、data和idata是不是保留字我就不记得了,前面的段的名字,随便起的。它们用于生成exe文件时link文件对段进行定位和合并时用的。倒不一定是宏汇编才有,宏汇编的特征是具有宏定义、宏替换。
记住这些东西不太容易,这些定义还少了很多对齐之类的指令,我记得以前写的时候都比这个长得多。一般写程序都是一个code段,一个data段,所以用一个原来的程序套一下就行了。
就算是在嵌入系统中、不是生成exe文件,asm程序(如asm86、asm286等)也需要这些定义,不同的是link程序生成的文件格式不同。
有时候要生成一些结构比较复杂和执行程序,如ovl、或多个数据段的、或分模块编写的大程序,这些定义就要注意了。
讲汇编的书上都有这些助记符的说明的,但如果不熟悉pc机的体系和一些约定的话,会越看越糊涂。
其中有些指令可能永远用不上,要解决问题时再看也来得及。
离线ecawen
发帖
252
只看该作者 10楼 发表于: 2006-04-04
用户被禁言,该主题自动屏蔽!
离线Sullivan
发帖
4817
只看该作者 11楼 发表于: 2006-04-10
啊哈哈,怪不得我不认识呢,原来是86系列的....
离线chenerbox
发帖
1168
只看该作者 12楼 发表于: 2006-04-13
我怎么越看越不明白啊,是单片机程序啊

在keil的帮助中全有啊

code_seg segment code   //声明一个段
rseg code_seg           //选择一个段,以下放到相应段中


cseg at 0000h   //是把 cseg 定位的 地址0000h
离线BG4UVR
发帖
11288
只看该作者 13楼 发表于: 2006-04-13
ibm宏汇编
离线BG7JUN
发帖
889
只看该作者 14楼 发表于: 2006-04-14
'
我怎么越看越不明白啊,是单片机程序啊
在keil的帮助中全有啊
code_seg segment code   //声明一个段
rseg code_seg           //选择一个段,以下放到相应段中
cseg at 0000h   //是把 cseg 定位的 地址0000h
'
我也糊涂了——顶楼的那些可执行的指令确实是51的,但51根本没有段寄存器ds、cs、es、ss等,为什么要分段呢?能分得开吗?
既然不存在段定位问题,那写了有什么用呢?
离线BG4ABM
发帖
1139
只看该作者 15楼 发表于: 2006-04-14
'
我也糊涂了——顶楼的那些可执行的指令确实是51的,但51根本没有段寄存器ds、cs、es、ss等,为什么要分段呢?能分得开吗?
既然不存在段定位问题,那写了有什么用呢?
'
这些程序是我买的一个51学习系统附带的实验例程,我也不明白作者为什么要这样写,但程序确实可以在单片机上运行。哪位如果有能力的话,可否帮我改成我们平时使用的那种形式,我先谢谢了。
离线yake10
发帖
1034
只看该作者 16楼 发表于: 2006-04-14
shi 是啊,是啊是啊
离线chenerbox
发帖
1168
只看该作者 17楼 发表于: 2006-04-17
51也是分几段的,code是指放程序的地方,data是指前128 ram ,idata 是指51的高128ram

上边的程序

rseg data_seg
key_s: ds 1
key_v: ds 1
是在ram中定义两个变量

rseg stack_seg
stack: ds 20

是把堆栈放到idata中,包留20个字节位置

mov sp,#(stack-1) ; 设置栈指针
这一句做准备


cseg at 0000h
相当预我们常用的
org 0000h   (我估计,我平时只用c,汇编只是看个大概)
离线BG8WJ
发帖
166
只看该作者 18楼 发表于: 2006-04-21
这是标准的汇编语言阿。不过换种写法而已。看看平凡单片机教程里有对 idata xdata等的说明。
至于这种汇编的写法是比较接近x86系列的语法风格。其实51的基本结构和x86很接近。推荐参考
清华大学出版的影印版《ibm pc assembly language and programming》。原版书贵是贵点,还可以,不象国内的东拼西凑书看来看去就是看不懂。