帮检查下汇编程序的错误
我看的书是王爽的<汇编语言>书中第十个实验出了这样一道题编写一个子程序show_str,让用户提供字符串输出的行列颜色用子程序输出数据段中字符串的内容(以用户指定的颜色和...
我看的书是王爽的<汇编语言>书中第十个实验 出了这样一道题 编写一个子程序 show_str , 让用户提供字符串输出的行 列 颜色 用子程序输出数据段中字符串的内容(以用户指定的颜色和 行列 位置)
下面是我写的代码 但是结果和我想象的不一样。。。结果如图 ,,求修正!!
assume cs:code,ds:data
data segment
db 'Welcome to masm!',0
data ends
code segment
start:
mov dh,4
mov dl,1
mov cl,2
mov ax,data
mov ds,ax
mov si,0
mov bx,0
call show_str
mov ax,4c00h
int 21h
show_str:
;[将所有要用到的寄存器push]
mov ax,0b800h
mov es,ax
dec dh
mov al,0a0h
mul dh ;ax=160*(dh-1)
mov bl,dl
dec dl
add dl,bl ;a=b+(b-1),dl=a
mov ah,0
add ax,dx ;ax=行单元+列单元(465)
mov si,ax
s1:
mov ch,0
mov cl,ds:[bx]
jcxz ok
mov es:[si],cl
mov es:[si+1],2
inc bx
add si,2
jmp short s1
;[将所有要用到的寄存器在返回主程序前pop]
ok:ret
code ends
end start
管理 来删掉这个帖吧 重复了!!!! 展开
下面是我写的代码 但是结果和我想象的不一样。。。结果如图 ,,求修正!!
assume cs:code,ds:data
data segment
db 'Welcome to masm!',0
data ends
code segment
start:
mov dh,4
mov dl,1
mov cl,2
mov ax,data
mov ds,ax
mov si,0
mov bx,0
call show_str
mov ax,4c00h
int 21h
show_str:
;[将所有要用到的寄存器push]
mov ax,0b800h
mov es,ax
dec dh
mov al,0a0h
mul dh ;ax=160*(dh-1)
mov bl,dl
dec dl
add dl,bl ;a=b+(b-1),dl=a
mov ah,0
add ax,dx ;ax=行单元+列单元(465)
mov si,ax
s1:
mov ch,0
mov cl,ds:[bx]
jcxz ok
mov es:[si],cl
mov es:[si+1],2
inc bx
add si,2
jmp short s1
;[将所有要用到的寄存器在返回主程序前pop]
ok:ret
code ends
end start
管理 来删掉这个帖吧 重复了!!!! 展开
展开全部
存在以下几个问题:
1. 在按键的延时去抖动后,没有重新读取按键键值,即:
L8: ACALL DELAY
CJNE A,#0FFH,SAVE
这两条指令中间应插入:MOV A, P1,否则你用来比较的A还是第一次读到的A
2. 你在检测到按键按下后,没有等待键释放再去检测下一个按键。从你的程序中看,检测到按键按下后,蜂鸣器会响,除非你能很好的控制你按键按下的时间,不能超过蜂鸣器鸣叫的时间。所以这里建议你增加等待键释放,即:
INC R0
DJNZ R2,SET
这两条指令中插入:
RELEASE: MOV A, P1
CJNE A, #0FFH, RELEASE ; 检测到键仍按下则继续检测直至松开
ACALL DELAY ; 继续延时去抖动
MOV A, P1
CJNE A, #0FFH, RELEASE ; 去抖动后再确认一次按键已释放
你后面的代码看上去很混乱,我大致的理解是:你开始读了8次键值,存入31H开始的单元,然后后面的循环中有执行了3次 再读8次键值的事情,并且只要这8次中有一次按对了(分别与开始的第1、2、3个键值相同),就将00H这位置为有效,然后蜂鸣器响一响,没有什么实质性的工作。
另外,你的原理图中P3.2是控制线,程序中没有看到P3.2,却有P3.5。
希望你具体说明你的需求,以及你自己的编程思路,才能让别人帮到你,只会贴贴程序是没有意义的。
1. 在按键的延时去抖动后,没有重新读取按键键值,即:
L8: ACALL DELAY
CJNE A,#0FFH,SAVE
这两条指令中间应插入:MOV A, P1,否则你用来比较的A还是第一次读到的A
2. 你在检测到按键按下后,没有等待键释放再去检测下一个按键。从你的程序中看,检测到按键按下后,蜂鸣器会响,除非你能很好的控制你按键按下的时间,不能超过蜂鸣器鸣叫的时间。所以这里建议你增加等待键释放,即:
INC R0
DJNZ R2,SET
这两条指令中插入:
RELEASE: MOV A, P1
CJNE A, #0FFH, RELEASE ; 检测到键仍按下则继续检测直至松开
ACALL DELAY ; 继续延时去抖动
MOV A, P1
CJNE A, #0FFH, RELEASE ; 去抖动后再确认一次按键已释放
你后面的代码看上去很混乱,我大致的理解是:你开始读了8次键值,存入31H开始的单元,然后后面的循环中有执行了3次 再读8次键值的事情,并且只要这8次中有一次按对了(分别与开始的第1、2、3个键值相同),就将00H这位置为有效,然后蜂鸣器响一响,没有什么实质性的工作。
另外,你的原理图中P3.2是控制线,程序中没有看到P3.2,却有P3.5。
希望你具体说明你的需求,以及你自己的编程思路,才能让别人帮到你,只会贴贴程序是没有意义的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询