回 帖 发 新 帖 刷新版面

主题:[讨论]求高手指教,从键盘输入字符串并输出该字符串(汇编程序—I/O功能调用)

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。

回复列表 (共9个回复)

沙发

中断方面我也不太清楚,得多多学习

板凳

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 楼


   我是湖北工业大学商贸学院的。这学期刚开始学汇编,第二次上机(开学第3个星期)老师就出了这么个题。
   看了楼上的回复,整理了一下,已经得出满意的答案。部分细节问题我会试着自己弄懂。

   [b]在此,谢谢您了![/b]

   希望这个问题能为网上的朋友带来帮助。[em2]

4 楼


我发现 mov bh,0    byte ptr 都可以去掉。

5 楼

MOV CL,BUF+1 改为MOV BL,BUF+1  这两个有什么区别,分别实现的是什么操作呢?

mov byte ptr[si+bx],'$'
mov DX,si
是什么操作?

6 楼

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 楼

--------------------
Q:MOV CL,BUF+1 改为MOV BL,BUF+1  这两个有什么区别,分别实现的是什么操作呢?

可以改啊 但下面 也要改成 mov byte ptr[si+cx],'$'
这条指令的目的是把实质输入的字符数放到bl中
---------------------------------------------

在实模式,cx不能用来寻址
“基址加变址寻址方式,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。”
 

8 楼

谢谢指正! 
  差点误人!!!!

9 楼

现在回头看,终于可以理解了。
       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                ;结束

我来回复

您尚未登录,请登录后再回复。点此登录或注册