主题:[讨论]求高手指教,从键盘输入字符串并输出该字符串(汇编程序—I/O功能调用)
忘忧→志在必得 [专家分:120] 发布于 2007-03-22 09:28:00
DATAS SEGMENT
STR DB"please input a string:$"
BUF DB 20
DB ?
DB 20 DUP (?)
CRLF DB 0AH,0DH,"$";此处输入数据段代码
DATAS ENDS
STACKS SEGMENT STACK
DB 200 DUP(?) ;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START: MOV AX,DATAS
MOV DS,AX
LEA DX,STR
MOV AH,9
INT 21H
MOV AH,10
LEA DX,BUF
INT 21H
LEA DX,CRLF
MOV AH,9
INT 21H
MOV CL,BUF+1
LEA SI,BUF+2
NEXT: MOV DL,[SI]
MOV AH,2
INT 21H
INC SI
DEC CL
JNZ NEXT;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START
以上是从键盘输入字符串并输出该字符串的简单汇编程序,我们老师的要求是将程序中的2号调用改成9号调用,本人还在思考中,有能解决此问题的请回复,谢谢!
如果我了解了该题答案,一定和大家共享。
续一:
我们汇编老师的教学是先让我们看程序,写程序,再讲基本指令,基本结构……
学习汇编重要的是掌握CPU结构、程序结构以及熟练的掌握7种指令的运用。
以下是本人整理的对上面程序的部分解释:
BUF:键盘缓冲区BUF。
DB:定义变量的类型为字节类型。
DB 20:表示缓冲区能容纳20个字符。
DB 200 DUP(?)中的问号:不对分配的存储单元初始化。
DS:存放当前数据段的段地址。
CS:存放当前代码段的段地址。
SS:存放当前堆栈段的段地址。
MOV:传送指令。
AX:存放接收到的数据或发送数据。
DX:使用间接寻址时存放端口地址。
LEA:取偏移地址。
CL:在移位指令和循环移动指令中,存放移位次数或者循环移位次数。
SI:在存储器寻址时,作为变址寄存器。在串操作中,作为源串指针。
DEC:decrement。
INC:increment。
INT:interruput。
最后更新于:2007-03-22 13:49:00
回复列表 (共9个回复)
沙发
小牛斑斑 [专家分:1210] 发布于 2007-03-22 14:05:00
中断方面我也不太清楚,得多多学习
板凳
ccpp [专家分:9360] 发布于 2007-03-22 17:27:00
2号 是逐个显示字符
9号 一次完成字符串的显示,但结尾得加上 '$'
.model small
.data
@STR DB 'please input a string:$'
BUF DB 20
DB ?
DB 20 DUP (?)
CRLF DB 0AH,0DH,"$";此处输入数据段代码
.stack
DB 200 DUP(?) ;此处输入堆栈段代码
.code
START: MOV AX,@data
MOV DS,AX
LEA DX,@STR
MOV AH,9
INT 21H
MOV AH,10
LEA DX,BUF
INT 21H
LEA DX,CRLF
MOV AH,9
INT 21H
;开始改的部分
mov bl,BUF+1 ;输出这里开始
mov bh,0 ;
lea si,BUF+2 ;首地址
mov byte ptr[si+bx],'$';结尾得加上 '$'
mov DX,si ;
MOV AH,9 ;
INT 21H ;结束
MOV AH,4CH
INT 21H
END START
3 楼
忘忧→志在必得 [专家分:120] 发布于 2007-03-22 18:53:00
我是湖北工业大学商贸学院的。这学期刚开始学汇编,第二次上机(开学第3个星期)老师就出了这么个题。
看了楼上的回复,整理了一下,已经得出满意的答案。部分细节问题我会试着自己弄懂。
[b]在此,谢谢您了![/b]
希望这个问题能为网上的朋友带来帮助。[em2]
4 楼
忘忧→志在必得 [专家分:120] 发布于 2007-03-22 22:40:00
我发现 mov bh,0 byte ptr 都可以去掉。
5 楼
忘忧→志在必得 [专家分:120] 发布于 2007-03-24 17:30:00
MOV CL,BUF+1 改为MOV BL,BUF+1 这两个有什么区别,分别实现的是什么操作呢?
mov byte ptr[si+bx],'$'
mov DX,si
是什么操作?
6 楼
lt1234 [专家分:470] 发布于 2007-03-28 00:05:00
mov bh,0 byte ptr
不应该去的 因为如果bh原来就有内容的话
就会影响
mov byte ptr[si+bx],'$'
这条指令
--------------------
Q:MOV CL,BUF+1 改为MOV BL,BUF+1 这两个有什么区别,分别实现的是什么操作呢?
可以改啊 但下面 也要改成 mov byte ptr[si+cx],'$'
这条指令的目的是把实质输入的字符数放到bl中
----------------------------------------------
Q:mov byte ptr[si+bx],'$'
mov DX,si
是什么操作?
第一条指令是在实际输入的字符串后面加一个字符'$' 因为09H调用需要
mov dx,si
就是指自己输入的字符串的首地址传的偏移地址送到dx中
你去看下 09h号DOS功能调用的调用参数
就会理解这些指令的意义
7 楼
ccpp [专家分:9360] 发布于 2007-03-28 21:10:00
--------------------
Q:MOV CL,BUF+1 改为MOV BL,BUF+1 这两个有什么区别,分别实现的是什么操作呢?
可以改啊 但下面 也要改成 mov byte ptr[si+cx],'$'
这条指令的目的是把实质输入的字符数放到bl中
---------------------------------------------
在实模式,cx不能用来寻址
“基址加变址寻址方式,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。”
8 楼
lt1234 [专家分:470] 发布于 2007-03-29 15:06:00
谢谢指正!
差点误人!!!!
9 楼
忘忧→志在必得 [专家分:120] 发布于 2007-04-28 13:51:00
现在回头看,终于可以理解了。
mov bl,BUF+1 ;BUF+1里装的是输入字符的个数
mov bh,0 ;为避免BH不为零影响BX的值,先清零
lea si,BUF+2 ;将BUF+2地址给SI
mov byte ptr[si+bx],'$';从BUF+2开始输出输入的字符,遇'$'结束
mov DX,si ;相当于将SI地址给DX,准备输出
MOV AH,9 ;DOS9号调用
INT 21H ;结束
我来回复