【转载】从键盘输入字符串并输出该字符串(汇编程序)

原文地址http://blog.sina.com.cn/s/blog_4b7bd3380100a76z.html

  

 1 DATAS SEGMENT
 2 STR   DB"please input a string:$"
 3 BUF   DB 20
 4       DB ?
 5       DB 20 DUP (?)
 6 CRLF  DB 0AH,0DH,"$";此处输入数据段代码
 7 DATAS ENDS
 8 STACKS SEGMENT STACK
 9        DB      200 DUP(?) ;此处输入堆栈段代码
10 STACKS ENDS
11
12 CODES  SEGMENT
13        ASSUME CS:CODES,DS:DATAS,SS:STACKS
14 START: MOV AX,DATAS
15        MOV DS,AX
16        LEA DX,STR
17        MOV AH,9
18        INT 21H
19        MOV AH,10
20        LEA DX,BUF
21        INT 21H
22        LEA DX,CRLF
23        MOV AH,9
24        INT 21H
25        MOV CL,BUF+1
26        LEA SI,BUF+2
27 NEXT:  MOV DL,[SI]
28        MOV AH,2
29        INT 21H
30        INC SI
31        DEC CL
32        JNZ NEXT;此处输入代码段代码
33        MOV AH,4CH
34        INT 21H
35 CODES  ENDS
36     END START

以上是从键盘输入字符串并输出该字符串的简单汇编程序

以下是整理的对上面程序的部分解释:

BUF:键盘缓冲区BUF。

DB:定义变量的类型为字节类型。

DB 20:表示缓冲区能容纳20个字符。

DB 200 DUP(?)中的问号:不对分配的存储单元初始化。

DS:存放当前数据段的段地址。

CS:存放当前代码段的段地址。

SS:存放当前堆栈段的段地址。

MOV:传送指令。

AX:存放接收到的数据或发送数据。

DX:使用间接寻址时存放端口地址。

LEA:取偏移地址。

CL:在移位指令和循环移动指令中,存放移位次数或者循环移位次数。

SI:在存储器寻址时,作为变址寄存器。在串操作中,作为源串指针。

DEC:decrement。

INC:increment。

INT:interruput。

 1 DATAS SEGMENT
 2 STR   DB"please input a string:$"
 3 BUF   DB 20        ;这里的20为指定存放字符的个数(理论上的)
 4       DB ?        ;这的?可变,实际存放字符的个数(系统自动计算)
 5       DB 20 DUP (?)    ;这里的20是你在数据段开辟的空间
 6 CRLF  DB 0AH,0DH,"$";回车换行;此处输入数据段代码
 7 DATAS ENDS
 8 STACKS SEGMENT STACK
 9        DB      200 DUP(?) ;此处输入堆栈段代码
10 STACKS ENDS
11
12 CODES  SEGMENT
13        ASSUME CS:CODES,DS:DATAS,SS:STACKS
14 START: MOV AX,DATAS
15        MOV DS,AX
16        LEA DX,STR    ;9号中断前提,给参数DX赋值,指定输出字符串所在的有效地址
17        MOV AH,9
18        INT 21H
19        MOV AH,10    ;10号中断,接收输入字符串,此时DX为存放字符串的有效地址
20        LEA DX,BUF
21        INT 21H
22        LEA DX,CRLF
23        MOV AH,9
24        INT 21H
25        MOV CL,BUF+1    ;获取字符串中字符的个数
26        LEA SI,BUF+2    ;间接寻址
27 NEXT:  MOV DL,[SI]
28        MOV AH,2        ;2号中断输出单个字符
29        INT 21H
30        INC SI        ;输出一个地址往后加1
31        DEC CL        ;顺便减少输出的次数
32        JNZ NEXT        ;此处输入代码段代码
33        MOV AH,4CH
34        INT 21H
35 CODES  ENDS
36     END START
37
38  

2号调用是逐个显示字符,9号调用是一次完成字符串的显示,但结尾得加上 ‘$‘。最上面程序中用的2号调用,使用循环输出字符串。要将2号调用改为9号调用,必须改程序中的循环结构为顺序结构。很明显,程序中的

NEXT:

INC SI

DEC CL

JNZ NEXT

都要去掉。

所以问题简化为改

MOV DL,[SI]
MOV AH,2

部分为9号调用,以及在9号调用后加上‘$‘。

续last:

以下是在编程爱好者论坛上请教别人加上自己的整理得出的答案,并非最简。

 1 DATAS SEGMENT
 2 STR   DB ‘please input a string:$‘
 3 BUF   DB 20
 4       DB ?
 5       DB 20 DUP (?)
 6 CRLF  DB 0AH,0DH,"$"
 7 ;此处输入数据段代码
 8 DATAS ENDS
 9
10 STACKS SEGMENT STACK
11        DB      200 DUP(?) ;此处输入堆栈段代码
12 STACKS ENDS
13
14 CODES  SEGMENT
15        ASSUME CS:CODES,DS:DATAS,SS:STACKS
16 START: MOV AX,DATAS
17        MOV DS,AX
18
19        LEA DX,STR
20        MOV AH,9
21        INT 21H
22
23        MOV AH,10
24        LEA DX,BUF
25        INT 21H
26
27        LEA DX,CRLF
28        MOV AH,9
29        INT 21H
30
31        ;开始改的部分
32        mov bl,BUF+1           ;输出这里开始
33        mov bh,0               ;
34        lea si,BUF+2           ;首地址
35        mov byte ptr[si+bx],‘$‘;结尾得加上 ‘$‘
36        mov DX,si             ;
37        MOV AH,9               ;
38        INT 21H                ;结束
39
40        MOV AH,4CH
41        INT 21H
42 CODES  ENDS
43 END START

程序中mov byte ptr[si+bx],‘$‘可以改为mov [si+bx],‘$‘  ,mov bh,0也可以去掉,这样就得出最简答案了。

终结:

 1 DATAS SEGMENT
 2 STR   DB ‘Please input a string:$‘
 3 BUF   DB 20
 4       DB ?
 5       DB 20 DUP(24H)
 6 CRLF  DB 0AH,0DH,‘$‘
 7   DATAS ENDS
 8
 9 STACKS SEGMENT
10        DB 200 DUP(?)
11 STACKS ENDS
12
13 CODES SEGMENT
14     ASSUME CS:CODES,DS:DATAS,SS:STACKS
15 START:
16     MOV AX,DATAS
17     MOV DS,AX
18
19     LEA DX,STR
20     MOV AH,9
21     INT 21H
22
23     MOV AH,10
24     LEA DX,BUF
25     INT 21H
26
27     LEA DX,CRLF
28     MOV AH,9
29     INT 21H
30
31     LEA DX,BUF+2
32     MOV AH,9
33     INT 21H
34
35
36     MOV AH,4CH
37     INT 21H
38 CODES ENDS
39     END START

真正理解DOS10号以及9号功能,又得到一个答案:

 1 DATAS SEGMENT
 2 STR   DB ‘Please input a string:$‘
 3 BUF   DB 20
 4       DB ?
 5       DB 20 DUP(?)
 6 CRLF  DB 0AH,0DH,‘$‘
 7   DATAS ENDS
 8
 9 STACKS SEGMENT
10        DB 200 DUP(?)
11 STACKS ENDS
12
13 CODES SEGMENT
14     ASSUME CS:CODES,DS:DATAS,SS:STACKS
15 START:
16     MOV AX,DATAS
17     MOV DS,AX
18
19     LEA DX,STR
20     MOV AH,9
21     INT 21H
22
23     MOV AH,10
24     LEA DX,BUF
25     INT 21H
26
27     LEA DX,CRLF
28     MOV AH,9
29     INT 21H
30
31     MOV AL,BUF+1
32     ADD AL,2
33     MOV AH,0
34     MOV SI,AX
35     MOV BUF[SI],24H
36     LEA DX,BUF+2
37     MOV AH,9
38     INT 21H
39
40
41     MOV AH,4CH
42     INT 21H
43 CODES ENDS
44     END START
时间: 2024-10-03 22:49:07

【转载】从键盘输入字符串并输出该字符串(汇编程序)的相关文章

编写一个程序从键盘输入字符,并按要求输出

从键盘输入字符,并按要求输出.下面有几点说明: (1)这里的getchar()函数为字符输入函数,putchar()函数为字符输出函数. (2) EOF是end of file的缩写.表示"文字流"(stream)的结尾,!=EOF表示文件还没有结束. (3) continue只能放到循环体中,它只把循环体从continue及以下的部分忽略掉,不影响程序的循环. #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int 

Python练习题8(替换相同的字符串并输出):输入两个字母串,将两个字母串都包含的字母用&#39;_&#39;替换后,输出两个字母串的剩余部分 (不能为空串,区别大小写,只能包含字母)

方法一:检查输入是否为空串,循环字母串,相同的则替换,然后再用replace()方法去除,输出想要的结果 1 def str_replace(messages1,messages2): 2 if messages1.strip() == '' or messages2.strip() == '' : #检验输入不能为空串 3 tips = "输入字母串有空串,不合法" 4 return tips 5 6 if not messages1.encode('UTF-8').strip().

第三章 键盘输入和屏幕输出

1.顺序结构 a.输入数据--处理数据--输出数据 b.程序获得输入数据的方式:键盘.文件 c.程序输出数据的方式:屏幕.文件 d.若是需要输入输出数据,则必须使用编译预处理指令:#include <stdio.h> 2.printf()格式字符 %d     decimal--输出十进制有符号 int 型 %u     unsigned--输出十进制无符号 int 型 %f      float--以小数形式(6位小数)输出 float,double 型 %e     exponent--以

JAVA 键盘输入数组,输出数组内容和最大值、最小值

package shuzu; import java.util.Scanner; public class shuzu { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] a = new int[5];  //定义数组 Scanner scanner = new Scanner(System.in); //键盘输入 System.out.p

输入字符串并将其反向输出

所用知识:1.string类型的变量可看做只读类型的char数组  2.字符串可通过+相连

插入字符串并输出

题目内容: 输入两个字符串 s1 . s2 和 s1 中任意字符 k ,在 s1 中的指定字符 k 第一次出现的位置后面插入字符串 s2 并输出. 输入样例: beijing[回车] 123[回车] i[回车] 输出样例: bei123jing[回车] 时间限制:500ms内存限制:32000kb 1 #include <stdio.h> 2 int main() 3 { 4 int i,j; 5 char str1[10],str2[10]; 6 char k; 7 gets(str1);

&lt;08&gt;while循环介绍及基本格式+while循环使用陷阱+统计键盘输入字符个数+while循环使用注意+do-while循环介绍及语法格式+do-while和while的对比+for循环结构及执行过程+for循环的其他形式

while循环介绍及基本格式(掌握): 循环结构: 当条件满足的时候 ,程序会重复的执行某一个代码段 构成循环结构的条件: 1)循环控制条件 2)循环体 3)让循环控制条件为假的控制 while循环的格式: while(表达式){ 语句块; } 1 #include <stdio.h> 2 3 void test1(){ 4 5 int i=1; 6 7 // 1)循环控制条件 8 while(i<=1000){ 9 10 //2)循环体 11 printf("第%d次说:我爱

.从键盘录入一个字符串并统计指定字符串出现的次数

public class Demo3{ public static void main(String [] args){ int num = 0; int t = 0; Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串:"); //存储键盘录入的字符串 String n = sc.next(); System.out.println("请输入需要查找的字符:"); String s =

输入字符,输出字符时加行号

问题描述: 可以标准输入一些字符,然后输出时,在每一行前面加上行号,每一行可以接受的字符没有限制. 代码实现: /*.c*/ #include <stdio.h> #include <stdlib.h> int main() { int ch = 0; int line = 0; int flag = 1;    //设定标志位,最后确定是否需要换行,打印行号 while((ch = getchar()) != EOF) { if(flag == 1) { flag = 0; li