简单的8086汇编程序,可我不会。请热心的一定帮忙。

nononono 2000-12-05 07:29:00
受人无法回绝的委托,要我给几个8086汇编程序,题目不难,可我早就忘的干干净净。

没办法,来这里求各位汇编高手了。求热心的汇编高手当回老师。

请一定帮忙,哪怕一人给一段程序也好!拜托拜托拜托拜托拜托。。。。。。


题目如下:

一、对键盘输入的小写字母用大写字母显示出来。

二、比较2个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示'MATCH',若不相同则显示'NOT MATCH'。

三、在STRING到STRING+99单元存放一个字符串,要求测试该串中是否存在数字,如有则设置CL的的第5位为1,否则设置该位为0。

四、在A、B和C单元中分别存放3个数。若3个数都不是0,则求出3数之和在D单元;若有1个数是0,则其它2单元也清0;

(下面2个程序麻烦给出较详细的注释)
五、在屏幕上建立一个10行20列的小窗口,然后在窗口的最后一行行首输入字符串"You are welcome!"并向上滚动,重复此过程直到整个窗口显示满。

六、完成DOS系统Time命令功能,先将当前时间(时值:分值)显示出来,再提示输入更改的时间(时值:分值),并完成新时间的设置。

...全文
812 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
dowsun 2001-01-11
  • 打赏
  • 举报
回复
(1) AND AL, DFH
呵呵,小写变大写的懒方法。
zhangzhonghua 2001-01-08
  • 打赏
  • 举报
回复
关注。
zjh 2000-12-11
  • 打赏
  • 举报
回复
对不起!nononono.
这两天在家比较忙,没上网,所以才没回答。
我查了一下,我的书上说00中断已经由4C中断代替了。
另外,我想提几点建议:
1。在程序的开始并没有在最后一行打一个字符串,
而后面却直接将下一行向上一行拷贝,应该拷贝不到东西吧。
2。将OUTALINE注释掉,是否还有字符串显示?
3。主程序和SCROLLWIN中的循环似乎重复了。
nononono 2000-12-11
  • 打赏
  • 举报
回复
“很久很久”从何而来?别去理它。呵呵
nononono 2000-12-11
  • 打赏
  • 举报
回复
谢谢zjh的再次回复。

00H功能已经由4CH功能代替了?我的书太老了。我是用Win98格式化的DOS启动盘测试程序的,如果我用MSDOS3.3也许就正常了吧?呵呵
我使用4CH功能的确是能正常结束程序了。

我做的第5、6两题除去结束问题基本正常,第6题用错了功能导致没有回显。

再次感谢2位的回复!(虽然根本就没有帮上忙!)呵呵

很久很久
nononono 2000-12-10
  • 打赏
  • 举报
回复
iProgram, 你自己说你是初学者。呵呵

zjh,说说我上面的程序还有什么问题。
下面的2行为什么没回显?

MOV AH,07H
INT 21H

iProgram 2000-12-10
  • 打赏
  • 举报
回复
INT 21H的7号调用就是不回显。
要回显的话用1号调用
MOV AH,1
INT 21H
输入的字符在AL中
iProgram 2000-12-10
  • 打赏
  • 举报
回复
什么?还有比我有的书更烂的?
nononono 2000-12-10
  • 打赏
  • 举报
回复
难道是我的书错了?呵呵
iProgram 2000-12-09
  • 打赏
  • 举报
回复
呵呵,开个玩笑。
这年头谁还用这东东?不写了几个程序感觉还挺好。
iProgram 2000-12-09
  • 打赏
  • 举报
回复
恨!看不起初学者zjh吗?
nononono 2000-12-09
  • 打赏
  • 举报
回复
还有回复么?难道这300就给这2位了? 其中一个还是初学的!呵呵
nononono 2000-12-09
  • 打赏
  • 举报
回复
zjh的下面這2行大概是關鍵。

MOV AH, 4CH
INT 21H

怎麽我看到的例子里沒這個?大概是書太老了。

iProgram 2000-12-08
  • 打赏
  • 举报
回复
哈哈。
nononono 2000-12-08
  • 打赏
  • 举报
回复
你们简直要活活把我气死!

托我的人给我的截止日期是今天下午3点. 我刚把我写的程序交给他. 这会儿你们倒有了劲头. 早半天也好啊.

也罢, 就算是学习吧. 我们讨论吧. 呵呵

我给的第6题是运行正确的,但有2个小问题.
下面是我调试后的第5题,过程中没问题,结束也是有个小问题, 能解决吗? 呵呵
nononono 2000-12-08
  • 打赏
  • 举报
回复
;------------------------------------------------------------------
CODE SEGMENT
ORG 100H
ASSUME CS:CODE, DS:CODE, ES:CODE
;------------------------------------------------------------------
BEGIN: JMP START

WELCOMESTR DB 'You are welcome!','$'

WIN_WIDTH DB 14H ;20列
WIN_HEIGHT DB 0AH ;10行

WIN_TOP DB 05H
WIN_LEFT DB 1EH

COUNT DB 00H ; 已输出行计数器,初值为 0。
;------------------------------------------------------------------
;主程序开始
START: MOV AX,CS
MOV DS,AX ; 设置DS与CS相同。(数据段与代码段相同)

CALL INITWIN
MAIN_LOOP: CALL SCROLLWIN ; 滚动一行
CALL OUTALINE ; 输出一行串

MOV AL,COUNT
INC AL
MOV COUNT,AL
CMP AL,WIN_HEIGHT
JNG MAIN_LOOP ; 如果没有循环到10行,继续

MOV AH,00H
INT 21H
;主程序至此结束
;------------------------------------------------------------------
;子程序。初始化窗口数据。
INITWIN PROC NEAR
MOV COUNT, 00H

RET
INITWIN ENDP
;------------------------------------------------------------------
;子程序。拷贝窗口中的第 DH 行到上一行,然后清除第 DH 行。
MOVELINE PROC NEAR
ADD DH,WIN_TOP ;DH的初值是窗口内坐标行号,现换算成屏幕的坐标行号
MOV DL,WIN_LEFT ;DL设为窗口左边在屏幕的列坐标,相当于窗口内坐标列号=0

MOV_LOOP: MOV BH,00H
MOV AH,02H
INT 10H ;定位光标在需要拷贝的源字符处

MOV BH,00H
MOV AH,08H
INT 10H ;读取光标位置的字符及字符的显示属性

DEC DH
MOV BH,00H
MOV AH,02H
INT 10H ;定位光标在需要拷贝的目标字符处

MOV BL,AH
MOV CX,01H
MOV BH,00H
MOV AH,09H
INT 10H ;将刚刚读到的字符写到上一行(DH,DL)

INC DH
MOV BH,00H
MOV AH,02H
INT 10H ;定位光标在已经拷贝出的源字符处

MOV AL,20H ; 20H 是空格字符
MOV BL,00H ; 00H 是这个空格字符输出的属性
MOV CX,01H ; 该字符输出1次
MOV BH,00H ; 页号
MOV AH,09H
INT 10H ;向已经拷贝出的源字符处填写空白字符

INC DL ;列坐标向右移动一位。

MOV AL,WIN_WIDTH
ADD AL,WIN_LEFT
CMP DL,AL ;判断列坐标(DL)是否已经移到窗口的右边
JLE MOV_LOOP ;如果没有移到窗口的右边,处理新的列(DL)
;否则返回。
RET
MOVELINE ENDP
;------------------------------------------------------------------
;子程序。窗口向上滚动一行。
SCROLLWIN PROC NEAR
MOV SCR_COUNT,01H ;窗口内的滚动从第1行开始向上
SCR_LOOP: MOV DH,SCR_COUNT
CALL MOVELINE ;拷贝窗口中的第 DH 行到上一行,然后清除第 DH 行。
MOV DH,SCR_COUNT
INC DH
MOV SCR_COUNT,DH
CMP DH,WIN_HEIGHT
JNG SCR_LOOP
RET
SCR_COUNT DB 00H
SCROLLWIN ENDP
;------------------------------------------------------------------
;子程序。并向窗口输出一行串WELCOMESTR。
OUTALINE PROC NEAR
MOV AH,02H
MOV DH,WIN_TOP ;
ADD DH,WIN_HEIGHT ;
MOV DL,WIN_LEFT ; 光标位置:列
MOV BH,00H ; 显示页号:0
INT 10H ; BIOS 中断调用,AH=02H 是置光标位置
MOV AH,09H
MOV DX, OFFSET WELCOMESTR
INT 21H
RET
OUTALINE ENDP
;------------------------------------------------------------------
CODE ENDS ;段结束
END BEGIN
;------------------------------------------------------------------
iProgram 2000-12-08
  • 打赏
  • 举报
回复
呵呵,上边的是第五题吧:)
我正一筹莫展呢,我明天看看你的程序,不懂指出请一定指教。
zjh 2000-12-08
  • 打赏
  • 举报
回复
上面的是第四题,测过的。
zjh 2000-12-08
  • 打赏
  • 举报
回复
;------------------------------------------------------------------
CODE SEGMENT
ORG 100H
ASSUME CS:CODE, DS:CODE, ES:CODE
;------------------------------------------------------------------
BEGIN: JMP START

WELCOMESTR DB 'You are welcome!','$'

LOOPCOUNT DB 0AH

WIN_WIDTH DB 14H ;20列
WIN_HEIGHT DB 0AH ;10行

WIN_TOP DB 05H
WIN_LEFT DB 1EH
;------------------------------------------------------------------
;主程序开始
START: MOV AX,CS
MOV DS,AX ; 设置DS与CS相同。(数据段与代码段相同)

CALL INITWIN


LOOP1: CALL SCROLLWIN
CALL OUTALINE

MOV AH, 4CH ; Dos terminate program function
INT 21H

MOV AH,00H
INT 21H
;主程序至此结束
;------------------------------------------------------------------
;子程序。初始化窗口数据。
;在窗口最后一行打一字符串
INITWIN PROC NEAR
mov ah, 02h
mov dh, WIN_TOP
add dh, LOOPCOUNT
mov dl, WIN_LEFT
mov bh, 00h
int 10h
mov ah, 09h
mov dx, OFFSET WELCOMESTR
int 21h
RET
INITWIN ENDP
;------------------------------------------------------------------
;子程序。拷贝窗口中的第 DH 行到上一行,然后清除第 DH 行。
MOVELINE PROC NEAR
MOV DH,LOOPCOUNT
ADD DH,WIN_TOP ;DH的初值是窗口内坐标行号,现换算成屏幕的坐标行号
MOV DL,WIN_LEFT ;DL设为窗口左边在屏幕的列坐标,相当于窗口内坐标列号=0

MOV_LOOP: MOV BH,00H
MOV AH,02H
INT 10H ;定位光标在需要拷贝的源字符处

MOV BH,00H
MOV AH,08H
INT 10H ;读取光标位置的字符及字符的显示属性
MOV BL,AH

DEC DH
MOV BH,00H
MOV AH,02H
INT 10H ;定位光标在需要拷贝的目标字符处

MOV CX,01H
MOV BH,00H
MOV AH,09H
INT 10H ;将刚刚读到的字符写到上一行(DH,DL)

INC DH
MOV BH,00H
MOV AH,02H
INT 10H ;定位光标在已经拷贝出的源字符处

MOV AL,20H
MOV BL,00H
MOV CX,01H
MOV BH,00H
MOV AH,09H
INT 10H ;向已经拷贝出的源字符处填写空白字符

INC DL ;列坐标向右移动一位。

MOV AL,WIN_WIDTH
ADD AL,WIN_LEFT
CMP DL,AL ;判断列坐标(DL)是否已经移到窗口的右边
JLE MOV_LOOP ;如果没有移到窗口的右边,处理新的列(DL)
;否则返回。
RET
MOVELINE ENDP
;------------------------------------------------------------------
;子程序。窗口向上滚动一行。
SCROLLWIN PROC NEAR
SCR_LOOP: CALL MOVELINE ;拷贝窗口中的第 DH 行到上一行,然后清除第 DH 行。
DEC LOOPCOUNT
MOV DH, LOOPCOUNT
CMP DH, 0
JA SCR_LOOP
RET
SCROLLWIN ENDP
;------------------------------------------------------------------
;子程序。并向窗口输出一行串WELCOMESTR。
OUTALINE PROC NEAR
MOV AH,02H
MOV DH,WIN_TOP ; 光标位置:行
MOV DL,WIN_LEFT ; 光标位置:列
MOV BH,00H ; 显示页号:0
INT 10H ; BIOS 中断调用,AH=02H 是置光标位置
MOV AH,09H
MOV DX, OFFSET WELCOMESTR
INT 21H
RET
OUTALINE ENDP
;------------------------------------------------------------------
CODE ENDS ;段结束
END BEGIN
iProgram 2000-12-08
  • 打赏
  • 举报
回复
第四题
;用DEBUG看AX即可
DATA SEGMENT
UNITA DW 0001H ;可将此处改为0的说
UNITB DW 0002H
UNITC DW 0003H
UNITD DW ?
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
START:
PUSH DX
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,UNITA
CMP AX,0
JE ZERO
MOV AX,UNITB
CMP AX,0
JE ZERO
MOV AX,UNITC
CMP AX,0
JE ZERO
ADD AX, UNITB ;C+B
ADD AX, UNITA ;C+B+A
MOV UNITD,AX
JMP OK
ZERO:
MOV UNITA,0
MOV UNITB,0
MOV UNITC,0
MOV UNITD,0
OK:
MOV AX,UNITD ;为了便于DEBUG
RET
MAIN ENDP
CODE ENDS
END START

加载更多回复(17)

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧