你的程序有两个错误
1。调用mov
ah,0ah
int21h
后dx指向的是缓冲区的开始,不是结尾,因此你加$的位置应该是:缓冲区开始地址+2+输入字节数
2。显示时,dx应该指向字符串的开始,而不是缓冲区的开始,两者差两个字节。
调试好的程序如下:
DATAS
SEGMENT
buffer
db
80
db
0
db
80
dup
(0);此处输入数据段代码
DATAS
ENDS
STACKS
SEGMENT
;此处输入堆栈段代码
STACKS
ENDS
CODES
SEGMENT
ASSUME
CS:CODES,DS:DATAS,SS:STACKS
START:
mov
ah,0ah
mov
dx,seg
buffer
mov
ds,dx
lea
dx,buffer
int
21h
inc
dx
mov
si,dx
mov
cl,byte
ptr
[si]
;输入的字节数
mov
ch,0
add
si,2
add
si,cx
;字符串结尾
mov
byte
ptr
[si],'$'
push
ds
pop
es
mov
di,offset
buffer
mov
ax,0a0dh
;回车换行
stosw
;把缓冲区的开始两个字节填充成回车换行,是为了让结果和输入分别在两行上显示
mov
ah,09h
lea
dx,buffer
int
21h
MOV
AH,4CH
INT
21H
CODES
ENDS
END
START
有问题,当按下多个按键时,消抖都没用了。有计数法,但是需要消耗的内存。可以识别具体的键位,键的按下d起状态,消抖。每个按键状态独立识别,无需等待延时。typedefenum{Key_No,Key_Down,Key_Up,}KeyStateEnum;vkey[4]={0};//4组按键ucharkeyDownNum[16]={0};//按下计数ucharkeyDownUp[16]={0};//d起计数//判断键状态ucharstateKey(ucharkeySta,uchardownNum,ucharupNum,uchardel){ucharsta=Key_No;if(keySta){upNum[0]=0;if(downNum[0]==del){sta=Key_Down;}if(downNum[0]>4);}}voidmain(){while(1){Readkey();//ScanKey();}}
循环点亮LED灯,也就是流水灯效果的控制,可以用定时器来控制,这样做相对代码量较少而时间比较精确,外部中断0接以按键,可以控制动态效果的启停。程序如下:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXT0 ;外部中断0,控制流水灯启停
ORG 000BH
LJMP T0ISR ;定时0控制流水灯循环点亮
ORG 0030H
MAIN:
MOV TMOD,#01H ;设置定时器0工作模式
MOV TH0,#HIGH(65536-60000) ;60毫秒定时
MOV TL0,#LOW(65536-60000)
SETB ET0
SETB EA
MOV A,#0FEH ;LED等初始化
MOV P0,A
SJMP $
EXT0:
CPL TR0
RETI
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-60000)
MOV TL0,#LOW(65536-60000)
SETB ET0
RL A
MOV P0,A ;循环点亮LED灯
RETI
END
第一步 基本的编辑功能
这里是介绍基本的编辑功能,就像在介绍Windows自带的记事本。
文件菜单:
新建:新建一个文件,快捷键为 Ctrl+N ;
保存:保存当前文件,快捷键为 Ctrl+S ;
打开:打开一个文件,快捷键为 Ctrl+O ;
退出:退出轻松汇编 ;
另存为: 把正在编辑的文件存为另外一个文件 ;
最近使用过的文件:在这里纪录了您最近使用过的文件,可以快速打开。
如果您不希望别人看到您编辑过什么程序,可以点击“清空全部纪录”。
编辑菜单:
全选:选定正在编辑的全部内容,快捷键为 Ctrl+A;
复制:复制选定的内容到剪贴板,快捷键为 Ctrl+C;
剪切:复制选定的内容到剪贴板,并删除所选定的内容,快捷键为 Ctrl+X;
粘贴:把剪贴板中的内容复制到编辑窗口,快捷键为 Ctrl+P;
删除:删除选定内容,快捷键为 Del;
撤消:撤消上一步 *** 作,快捷键为 Ctrl+Z,但是注意只能撤消一次。
查找菜单:
查找:在所编辑的文件中查找字符串,快捷键为 Ctrl+F;
替换:在所编辑的文件中把一个字符串替换为另一个,快捷键为 Ctrl+R;
查找下一个:从当前光标起,查找下一个,快捷键为 F3;
第二步 编写一个汇编程序
打开轻松汇编就自动为您新建了一个模板,直接在上面添加数据定义和代码就可以了。一般来说,都是先写堆栈段。输入“stacks segment stack”,用空格隔开关键字。然后按下回车键换行——您会看到,轻松汇编自动把刚才输入的那一行程序的格式整理好了。
第二行是堆栈的大小了,应该输入“db 128 dup(0)”,输入“bd 128 dup(0)”试试,会怎样?在换行时没有整理格式。如果您输入的汇编程序有拼写错误,轻松汇编会检测出来,并且拒绝整理错误行的格式,这时候您就可以避免这类简单而又隐蔽的错误。当然,如果您确定您输入的是正确的,而轻松汇编没有整理格式,或整理的格式不好看,请告诉我这个错误,不胜感激,****见左侧小字。在您编程的过程中,左侧的导航栏会随时更新您的语法信息,可以通过导航栏来快速定位您的语法元素。
接着,把您所想要写的程序写完,进行下一步:编译、运行一个程序。
如果是以前写的程序,在轻松汇编中打开后,点击:运行“整理格式”,轻松汇编会对整个程序格式进行整理。
第三步 编译、运行一个汇编程序
把写好的汇编程序编译、运行一下,熟悉 *** 作。
点击:运行-生成目标文件,轻松汇编就会自动生成目标文件,另外,根据您的设定(如何设定,请参见第四步),还会生成其他的文件。默认是生成交叉文件和映像文件,点击右上角的按钮就可以看到这两个文件(这两个文件的作用,请参见疑难解答)。
如果有语法错误,编译会失败,错误信息会显示在下面的窗口中,点击错误信息,错误行就会突出显示出来。
点击:运行-运行,轻松汇编就会会自动完成编译、链接、运行当前程序。在程序运行时是全屏方式,结束后变成窗口方式,不会退出。
点击:运行-调试,轻松汇编就会自动完成编译、链接、调试的工作,使用的是TD作为调试工具。
就这些了,因为在轻松汇编下编译、运行一个程序确实简单。
在汇编时还有其他的可能,那么,请进行第四步:让汇编变的更轻松。
第四步 让汇编变得更轻松
对轻松汇编进行个人设置,让它更符合您的习惯。
在轻松汇编中根据初学者的特点,提供了很有特色的功能,如果您不喜欢的话,可以关掉它,对于运行的参数,同样也是通过设置来改变的。下面我们一一介绍:
在设置中:
格式设定:在这里的下拉框中有三个选项,全部大写、全部小写和不处理,选定后的结果是在进行格式处理时对格式化结果的处理。
自动整理格式:选定后在换行的时候会对原来行进行格式整理,如果没有选定就不整理格式。
采用调试模式:选定后在编译时包括参数/zi,在链接时包括参数/v,这样生成的可执行文件比较大,包含了用TD调试时所需要的信息,可以实现源代码调试;如不选定,不能实现源代码调试,在调试的时候不太方便。推荐选定该选项。
编译生成Com文件:选定该选项后在链接时包括参数/t,如果你写的是一个com文件的汇编代码,那么就可以选定以生成一个com后缀的文件。在选定该选项后调试时不能实现源代码调试,所以最好在编写、调试的时候不选定,最后调试通过后再选定该选项生成com文件。如果不选定,即使是com文件的汇编代码也是可以编译通过,只不过生成的是一个Exe文件。推荐不选定。
自定义参数:就是自己提供TASM和TLink的参数了,如果你对TASM了解比较多,可以实现其他的参数功能,但是对于一般的学习者,并不需要自定义参数,以免造成程序运行时出问题。
程序格式:在这里控制格式整理的方式,您可以自己设置后看看效果。不过推荐用默认方式。
显示导航栏:选中后显示导航栏,否则不显示。
显示错误栏:选中后显示错误栏,否则不显示。(推荐选中,如果不选中,有错误它是不会自动显示的。)
说明:
1、本程序只识别三个按键:光标左移键、光标右移键和Esc键;
2、按光标左移键或光标右移键,执行相应的功能;按Esc键,结束程序。
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
Cursor_Row DB 21
Cursor_Col DB 36
SetCursor EndP
; -----------------------------------------
KBEsc equ 11BH
KBLeft equ 4BH
KBRight equ 4DH
String db '<---->$'
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
xor bh,bh
mov ah,8 ;读光标位置的字符和属性
int 10h
mov bh,ah ;保存字符属性值
Disp_Str: call SetCursor ;设置光标位置
Output String ;显示一个字符串
Read_Key: xor ah,ah
int 16h ;接收按键
cmp ax,KBEsc ;Esc
jz Exit_Proc ;结束程序,返回 *** 作系统
cmp ah,KBLeft ;左箭头?
jnz $+10 ;不是,转去看是否右键
mov word ptr Inc_or_Dec,0efeh ;是,当前列号减1
jmp Cursor_move
cmp ah,KBRight ;右箭头?
jnz Read_Key ;不是,接收下一个按键
mov word ptr Inc_or_Dec,06feh ;是,当前列号加1
Cursor_move:mov bl,ah ;保存按键方向
push bx
xor bh,bh
mov ah,3 ;取当前光标位置,窗口右下角坐标
int 10h
pop bx
inc dl ;列号加1
mov ch,Cursor_Row ;窗口左上角行号
mov cl,Cursor_Col ;窗口左上角列号
IF bl == KBLeft && cl == 0 ;按左键,但已经到最左侧,不移动
jmp Read_Key
ENDIF
IF bl == KBRight && dl == 79 ;按右键,但已经到最右侧,不移动
jmp Read_Key
ENDIF
mov ah,7 ;窗口显示内容下滚
mov al,1 ;下滚一行
int 10h
Inc_or_Dec: inc Cursor_Col ;当前列号减1或加1
jmp Disp_Str
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
以上就是关于帮忙写一个汇编程序,要求从键盘输入的一个字符串(以回车结束),并将字符串末尾加上结束标志’$’,然后全部的内容,包括:帮忙写一个汇编程序,要求从键盘输入的一个字符串(以回车结束),并将字符串末尾加上结束标志’$’,然后、如何用汇编语言实现4*3矩阵键盘程序设计,当任意一个按键按下后使用四、单片机汇编语言程序,我想写一个循环点亮的LED,然后用外部中断0接到一个按键上,怎么写我需要详细的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)