从键盘输入一个字符串在下一行逆序输出用汇编语言如何实现

如何使同汇编语言编写从键盘输入一段字符串然后逆序输出~

先前回答过该问题,现发给你。


;运行示范如下
;C:\R
;HXGSFHSDG736RU3GRH32867VF847TBF47EHF78CGY4RCY4M8CEW7YDNRG

;GRNDY7WEC8M4YCR4YGC87FHE74FBT748FV76823HRG3UR637GDSHFSGXH
;C:\
;用MASM5.0编译通过


DATA SEGMENT

DB 512 DUP('$') ;定义可输入的字符个数
BUF DB '$'
CRLF DB 0DH,0AH,24H ;回车换行符
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX

MOV BX,OFFSET BUF ;指针指向待显示字符串尾部
AGAIN:
MOV AH,01 ;输入字符
INT 21H
CMP AL,0DH ;是回车吗
JE DISP ;是,转显示
DEC BX ;指针减1
MOV [BX],AL ;存入输入的字符
JMP AGAIN ;继续输入

DISP:
MOV AH,09 ;显示
MOV DX,OFFSET CRLF ;回车换行
INT 21H
MOV DX,BX ;定位待显示字符串首地址
MOV AH,09
INT 21H ;显示

MOV AH,4CH ;DOS返回
INT 21H
CODE ENDS
END START

DATAS SEGMENT XX DB 0AH,0DH,"please input string:$" BVF DB 30 DB ? DB 30 DUP(?) DATAS ENDS SSEG SEGMENT STACK STK DB 100 DUP(?)SSEG ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAS,SS:SSEGSTART: MOV AX,DATAS MOV DS,AX LEA DX,XX MOV AH,9 INT 21H LEA DX,BVF MOV AH,0AH INT 21H MOV CL,BVF+1 AND CX,0FH MOV BX,CX ADD BX,1 ;确定BX的值,找到最后一个元素的偏移位置 BIAOJI:MOV AH,2 MOV DL,BVF[BX] ;这里括号内必须是BX,SI,DI寄存器其中之一 INT 21H DEC BX ;指针往前移 LOOP BIAOJI MOV AH,1 INT 21H ;暂停一下,查看输出的字符。若无,则一闪而过 MOV AH,4CH INT 21HCODE ENDS END START

;可以这样考虑:
;1.利用dos 21h中断的A号功能,读取一个字符串,这样可以取得字符串的长度N。
;2.mov cx,N,利用Loop指令,倒序输出字符串。
;代码如下:
; multi-segment executable file template.

data segment
  buf0 db 255   ;字符串最大长度
       db 0     ;输入的字符串的实际长度
  buf1 db 255 dup(0)
  lf   db 0dh, 0ah, '$'
data ends

code segment
    assume cs:code, ds:data
start:
    mov ax, data
    mov ds, ax

    lea dx, buf0  ;read a string
    mov ah, 0ah   ;
    int 21h       ;

    lea dx,lf     ;输出回车换行
    mov ah,9      ;
    int 21h    

    xor cx,cx
    mov cl,buf0+1 ;cx存入字符串长度,循环计数
    mov bx,cx

    mov ah,0eh    ;10h中断,0eh子功能,输出al中的字符
L1: dec bx
    mov al,buf1[bx]
    int 10h
    loop L1

    mov ax, 4c00h
    int 21h    

code ends
end start


从键盘输入一个字符串在下一行逆序输出用汇编语言可用如下方法实现:
;汇编语言输入一串字符串,可以调用DOS功能中断INT 21H的06H功能。
;程序功能:输入一串字符,以回车符结束,输入字符串最大长度200字符;
; 输入结束在下一行倒序输出此字符串。
data segment;定义数据段
str db 201 dup (0dh)
data ends

code segment
assume cs:code,ds:data
main proc far
start:
mov ax,data
mov ds,ax
lea si,str
mov cx,200
inpstr: mov ah,06h
int 21h
jnz inpstr;无字符可读
mov [si],a1;存储输入字符
inc si;指向下一字节
xor al,0dh;判断输入是否结束
jz endinp;输入结束
loop inpstr;未结束继续输入

endinp: mov dl,0ah;回车换行
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h

output: dec si;逆序输出字符串
mov dl,[si];取一个字符
mov ah,02h;输出到屏幕
int 21h
mov ax,si
cmp ax,offset str;比较字符串起始地址
jnz output;未到起始地址,继续输出

mov ah,4ch;输出完毕,结束程序
int 21h
ret
main endp
code ends
end start

编个小程序,即可实现。

楼主选择了错误的答案。你所选择的,不是用汇编语言编写的。

正确程序如下:

;================================================

DSEG SEGMENT
SHOW DB 'Please input a string: $'
NAM DB 200
DB ?
DB 200 DUP(0)
DSEG ENDS

CSEG SEGMENT
ASSUME CS:CSEG, DS:DSEG
START:
MOV AX, DSEG
MOV DS, AX

MOV DX, OFFSET SHOW
MOV AH, 09H
INT 21H

MOV DX, OFFSET NAM
MOV AH, 0AH
INT 21H

MOV DL, 0AH
MOV AH, 02H
INT 21H
MOV DL, 0DH
MOV AH, 02H
INT 21H

MOV CL, NAM + 1
MOV CH, 0
CMP CX, 0
JE EXIT

MOV SI, OFFSET NAM + 2
ADD SI, CX
MOV AH, 02H
L1:
DEC SI
MOV DL, [SI]
INT 21H
LOOP L1
EXIT:
MOV AH, 4CH
INT 21H
CSEG ENDS
END START

;================================================

本程序执行结果如下:

输入:ABCD
输出:DCBA

;================================================

#include <stdio.h>
struct text
{
char c;
struct text *next;
};
void main()
{
text *head = new text;
text *current = head;
text *next = NULL;
char c;
while(1)
{
if((current->c = getchar()) == '\n')
break;
//printf("%c:%d\n", current->c, current->c);
next = new text;
current->next = next;
current = current->next;
}
current->next = NULL;
current = head;
while(current->c != '\n')
{
printf("%c:%2x\n", current->c, current->c);
current = current->next;
}
}
//无论多么长字符串均可

用微机原理汇编从键盘上连续输入一串0~9的个位数,以回车结束,再按回车...
答:, 82 DUP(?) ;可输入80个字符QQ ENDS;---CC SEGMENTBEG: MOV AX, QQ MOV DS, AX LEA DX, MSG1 MOV AH, 9 INT 21H LEA DX, XX MOV AH, 10 ;输入字符串 INT 21H MOV CL, XX + 1 MOV CH, 0 JCXZ EXIT...

C语言中一个语句太长用什么换行?
答:x);和写作#define my_puts(x) printf("%s",x);是没区别的。 这里的\必须存在,不能省略。2、不过有些情况下可以采用更简单的形式。在字符串中换行。当字符串过长,写在一行中阅读不便时,可以采用一种特殊的换行方式。C语言规定,连续的用""引起的字符串常量,会默认合并为一个常量字符串。

EXCEL中自动换行,标点符号会在下一行第一个字符,而不是在本行的末尾...
答:解决方法:1、在标点与文字的地方,强制换行,使用ALT+回车键。2、将表格一列的距离减小或者增加,标点符号的位置即可发生改变。3、选择格式,段落里有一个常规对齐方式选成两端对齐,选了它就行了。解决方法:1、在标点与文字的地方,强制换行,使用ALT+回车键。2、将表格一列的距离减小或者增加,标点...

编写程序,从键盘输入一个字符串,以换行符结束。
答:您好,这样:include<stdio.h> void main(){ int n=0,c;c=getchar();while(c!='\n')//回车即退出 { if(c>=48&&c<=57)n++;//数字的asc码为48~57 c=getchar();} printf("n=%d\n",n);}

怎么写一个从键盘输入一个字符串给str和字符给c?
答:一、问题描述:从键盘输入一个字符串给str和一个字符给c,删除str中的所有字符c并输出删除后的字符串str。1、输入:第一行是一个字符串; 第二行是一个字符。2、输出:删除指定字符后的字符串。二、设计思路:1、 同插入问题,定义两个字符数组a,b。以及标志删除位置的int型pos。2、用gets函数...

C语言:怎样输入一个字母,输出下一个字母
答:C语言:怎样输入一个字母,输出下一个字母,可以参考下面的代码:include<stdio.h> int main(){ char a,a1;scanf("%c",&a);a1=a+1;printf("%c",a1);}

C语言编程:从键盘中输入一个英文字符串
答:include<stdio.h> include<stdlib.h> int main(){ int strSize = 100;char *str = (char *)malloc(sizeof(char) * strSize);int charNum = 0;char input;//逐个字符输入字符串,可以输入int可以表示的最大值个字符 printf("请输入任意个字符:\n");while(true){ scanf("%c",&input);...

键盘输入一个字符串,然后按照下面要求输出一个新字符串。新串是在原串...
答:include <stdio.h> include <string.h> void insert (char *str){ int i,j;i=strlen(str);for(j=i+i; i>-1; str[j--]=' ')str[j--]=str[i--];} int main ( ){ char str[81];gets(str);insert( str );puts (str);return 0;} ...

C语言题目输入多行字符串(有可能有空格),最后一行为#号作为结束,按照由...
答:1、新建一个 字符串数组的定义与输出项目。2、添加一个 str.c 文件。3、包含stdio.h和stdlib.h头文件。4、输入main函数主体,system()和返回值。5、定义一个字符串变量str。6、使用printf()函数输出字符串变量str。7、运行程序,查看输出结果。

...+1.创建一个文件STRING.txt。+2.由键盘输入一个?
答:otherCount);return 0;}在这个示例代码中,我们根据你的要求依次完成了以下操作:使用文件指针 file 创建了名为 “STRING.txt” 的文件,并以写入模式打开。如果文件无法创建,程序将打印一条错误消息并退出。从键盘输入一个字符串,并使用 fgets() 函数将其写入文件。关闭文件。重新打开文件读取字符串,...

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网