从键盘输入字符串并输出该字符串(汇编程序—I/O

计算机组成第一次互评作业:MIPS汇编程序设计 第一题:用系统功能调用实现简单输入输出利用系统功能调用从键盘输入,转换后在屏幕上显示,具体要求如下: 如果输入的是字母(A~Z,区分大小写)或数字(0~9),则将其转换成对应的英文单词后在屏幕上显示,对应关系见下表 若输入的不是字母或数字,则在屏幕上输出字符“*” 每输入一个字符,即时转换并在屏幕上显示 支持反复输入,直到按“?”键结束程序 字母 单词 字母 单词 数字 单词 阅读详情

从键盘输入字符串并输出该字符串(汇编程序—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。

 

续二:

DATAS SEGMENT
STR   DB"please input a string:$"  
BUF   DB 20        ;这里的20为指定存放字符的个数(理论上的)
      DB ?        ;这的?可变,实际存放字符的个数(系统自动计算)
      DB 20 DUP (?)    ;这里的20是你在数据段开辟的空间           
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    ;9号中断前提,给参数DX赋值,指定输出字符串所在的有效地址
       MOV AH,9
       INT 21H
       MOV AH,10    ;10号中断,接收输入字符串,此时DX为存放字符串的有效地址
       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        ;2号中断输出单个字符
       INT 21H
       INC SI        ;输出一个地址往后加1
       DEC CL        ;顺便减少输出的次数
       JNZ NEXT        ;此处输入代码段代码
       MOV AH,4CH
       INT 21H
CODES  ENDS
    END START

 

续三:

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

NEXT:

INC SI

DEC CL

JNZ NEXT

都要去掉。

所以问题简化为改

MOV DL,[SI]
MOV AH,2

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

 

续last:

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

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 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
CODES  ENDS
END START

   

   我和同学交流之后发现,程序中mov byte ptr[si+bx],'$'可以改为mov [si+bx],'$'  ,mov bh,0也可以去掉,这样就得出最简答案了。

 

终结:

DATAS SEGMENT
STR   DB 'Please input a string:$'
BUF   DB 20
      DB ?
      DB 20 DUP(24H)
CRLF  DB 0AH,0DH,'$'
  DATAS ENDS

STACKS SEGMENT
       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
   
    LEA DX,BUF+2
    MOV AH,9
    INT 21H
   
   
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

 

现在已经真正理解DOS10号以及9号功能调用了,今天再次看这个题目又得到一个答案:

DATAS SEGMENT
STR   DB 'Please input a string:$'
BUF   DB 20
      DB ?
      DB 20 DUP(?)
CRLF  DB 0AH,0DH,'$'
  DATAS ENDS

STACKS SEGMENT
       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 AL,BUF+1
    ADD AL,2
    MOV AH,0
    MOV SI,AX
    MOV BUF[SI],24H
    LEA DX,BUF+2
    MOV AH,9
    INT 21H
   
   
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START


汇编程序实战:学生成绩管理系统的构建 本文还有配套的精品资源,点击获取 简介:本项目使用汇编语言创建了一个学生成绩管理系统,涵盖成绩录入、排序和平均数计算等核心功能。通过该程序,开发者需直接控制计算机硬件,并深入理解CPU架构、指令集以及内存管理等基础概念。此外,还需要熟悉I/O操作、数组和循环结构的使用,以及排序算法、数学运算、条件判断等编程技术。整个项目不仅提升了编程能力,还有助于深入理解计算机底层运作。 ... 阅读详情

相关推荐

buf 、buf+1、buf+2

buf和buf+1和buf+2中求三个数的最大值。并存放到num中

微机原理实验代码

微机原理实验代码

王家寧的博客 3838

SONiC (6) - SONiC 源码框架分析

https://github.com/sonic-net/sonic-utilitieshttps://github.com/sonic-net/sonic-snmpagenthttps://github.com/sonic-net/sonic-linux-kernelhttps://github.com/sonic-net/sonic-platform-commonhttps://github.com/sonic-net/sonic-platform-daemons以下是在 SONiC 中运行的容器列表:

qq_49477505的博客 1329

字符替换-汇编语言

输入一个字符串,将其中A换成CC,并将结果显示在屏幕上。 DATAS SEGMENT BUF DB 20,?,20 DUP('$') LEN EQU $-BUF WEIZHI DB 2 ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUM...

Fiverya的博客 4435

WorkBuddy结合DeepSeek与Skill:文献检索自动化与Token成本控制实战

Agent工具与大模型API的结合正重塑知识工作者的日常流程。在实际工程中,调用大模型处理批量任务常面临Token消耗过快、成本不可控的痛点,而国产大模型DeepSeek以极低的API定价和兼容OpenAI接口的特性,为规模化文本处理提供了“Token自由”的可能。同时,可复用的Skill机制能够将特定领域的工作流固化为标准化步骤,让Agent自动执行检索式生成、文献筛选与摘要归纳等复杂操作。本文从这一技术背景出发,以科研文献检索为应用场景,演示如何利用WorkBuddy、DeepSeek API与自建文献

weixin_29061509的博客 490

Android双目摄像头(RGB+IR)实时预览与人脸活体检测实战指南

本文详细介绍了Android双目摄像头(RGB+IR)实时预览与人脸活体检测的实战指南。通过双摄同步预览、人脸检测与活体判断等技术实现,提升安全认证的准确性和鲁棒性。文章还提供了开发环境搭建、常见问题解决方案及性能优化建议,帮助开发者快速掌握双目摄像头在Android平台的应用。

vulkan6gpu的博客 690

汇编 lea

就是目标地址传送指令: 将一个近地址指针写入到指定的寄存器。格式: LEA reg16,mem16 其中reg16必须是一个16位通用寄存器,mem16必须是一个存储器,执行这个指令后,就将mem16所指的16位偏移地址传送reg16中。 比如: LEA AX,BUF 就是将存储器中BUF所指的地址传送给AX. 区别MOV传送指令: MOV传送的是地址所指的内容,而LEA只是地址。

FHunter分享美丽 1547

WiFi基本概念(六)(L-STF,L-LTF)

L-STF它由10个OFDM symbol(1,0,1,0,1,0,1,0,1,0)构成,每个symbol是0.8us,GI是0.2us,总计10us。Symbol的长度是正常长度的1/4,因此称为Short training field,主要用于快速进行信号检测,信号同步,自动增益控制,接收天线选择(Diversity Selection)。 由于symbol长度是正常的1/4,子载波的宽度是正常的4倍,能进行初略的信道估计,其使用了-24, -20, -16, -12, -8, -4, 4, 8, 1

reekyli的专栏 6862

利用a、s、w、d来控制移动 按下空格会发射子弹 最简单的语法用心编写也会有好的程序

利用a、s、w、d来控制移动 按下空格会发射子弹 最简单的语法用心编写也会有好的程序 #include #include #include void print(int a[][33]) { system("cls");//清屏 int i,j; for(i=0;i { for(j=0;j { if(a[i][j]==0) printf(" "); if(a[i][

AtlanticYu的博客 2880

GEE:关于遥感生态指数(RSEI)的若干疑问

本文记录了若干关于在 Google Earth Engine (GEE)平台上,计算基于主成分分析(PCA)的遥感生态指数(RSEI)的问题。并记录了解决这些问题的一些答案。问题包括,主成分分析的特征值的正负,主成分的占比,去云后空值像素的处理方法,异常值处理方法,如何看载荷等。

养乐多的博客 3417

基于 Qt C++ 的 2D 动画制作工具

你可以修改它的中心坐标 (X, Y)、宽度 (W)、高度 (H),或点击 "选择颜色" 按钮改变其填充色。* **图形视图 (`QGraphicsView` 和 `QGraphicsScene`)**: 用于显示和编辑当前帧的内容。

寒寒豆豆软件公司的博客 114

《微机原理与接口技术》上一些8086汇编程序

题目来源:《微机原理与接口》第五版,周荷琴,中国科学技术大学出版社 第四章课后第10、11、12、13、17题编程环境:DOSBOX 0.74 / masm611博客编辑:Markdown (首次尝试) (~ ̄▽ ̄)~

Tele_Anti_Nomy的博客 1万+

在 VS Code 里配置 SAP Joule for Developers 的 ABAP AI side-by-side 能力

摘要: 随着ABAP开发工具链的演进,VS Code逐渐融入ABAP开发流程,SAP Joule for Developers的ABAP AI能力通过side-by-side模式(基于BTP中央服务)为多系统开发提供统一AI支持。该模式避免了各ABAP后端独立升级AI能力的碎片化问题,由管理员配置BTP订阅URL后,开发者可在ADT或VS Code中全局调用。实际落地需注意角色分工(管理员配置服务,开发者填写URL)、AI units资源规划及配置细节(如区分全局与项目级设置)。建议将Joule URL纳入

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 120

将键盘输入的字符串送到用户自定义的数据缓存区中并输出

从键盘输入到缓冲区需要调用dos21h的0Ah号功能,该功能的使用方法如下: 定义一个缓冲区,设定输入字符为个数为n个,则缓冲区大小为n+2。缓冲区的第一个字节存放缓冲区的长度,所以这个要求输入的字符不能大于255个,最后一个应该留给回车字符。第一个字符存放实际输入字符的长度,第三个字节开始存放输入的字符串。 将输入字符串显示到屏幕上,需要调用09h号功能,该功能以DS:DX为显示字符串的内存

喜爱兰兰 3508

IPOP 使用详解 (附IPOP工具包)

IP 地址动态绑定功能;路由信息查询和配置功能;MAC 地址信息查询和修改功能;MAC 、主机信息扫描功能;本机网络报文统计功能;本机端口列表、远程端口扫描功能;端口映射功能;网卡流量统计功能;本机 IP 报文捕获和发送功能;终端控制功能(支持 telnet 、 dos、 ssh、 sftp 、ftp、com 等协议);TCL 脚本支持;多种服务功能( tcp/udp/ping/telnet/ftp/tftp/web/team/syslog/smtp );

悦分享 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

第19章 汇编语言--- 输入/输出机制

汇编语言是一种低级编程语言,它与特定计算机架构的机器语言有直接的对应关系。在汇编语言中,输入/输出(I/O)操作通常不是直接通过高级语言那样的简单函数调用来完成的,而是通过操作系统提供的系统调用或BIOS中断服务来实现。下面我将给出一个简单的例子,演示如何使用DOS下的INT 21h中断来进行基本的输入和输出操作。请注意,这适用于旧式的IBM PC兼容机以及可能某些模拟器环境。现代的操作系统如Windows、Linux等有着不同的API和机制用于处理I/O,而且它们一般不会直接使用汇编语言进行I/O操作。

hummhumm的专栏 2195

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

从键盘到屏幕:汇编语言中的字符转换与I/O交互实战

本文深入探讨汇编语言中的字符转换与I/O交互实战,重点解析键盘输入到屏幕输出的完整处理流程。通过顺序结构程序设计,详细演示了小写字母转大写的算法实现,包括ASCII码操作、中断处理机制及错误检测,为低层开发和嵌入式系统提供实用指导。

2a4s6d8f0g的博客 170

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

简单的汇编程序应用

系统功能调用——由DOS提供的一组实现特殊功能的子程序供程序员在编写自己的程序时调用,以减轻编程的工作量。 分两种,DOS系统功能调用和BIOS终端调用。 汇编语言中DOS系统功能调用有很多,涉及屏幕显示、文件管理、I/O管理等等,每个子程序都有一个功能号,所有的功能调用的格式都是一致的。调用的步骤大致如下: (1)系统功能号送到寄存器AH中; (2)入口参数送到指定的寄存器中; (

Mr_lu_code的专栏 1838

汇编程序设计常见题目

题 101 显示字符串:调用 DOS 功能显示字符串’Hello,Assembly!题 102 显示字符串:调用输入输出子程序显示字符串’Hello,Assembly!题 103 两个有符号十进制数相减:从键盘输入两个有符号十进制数相减,显示结果。题 104 两个有符号十进制数相乘:从键盘输入两个有符号十进制数相乘,显示结果。题 105 表达式计算:从键盘输入 16 位有符号数 x, y, z, v,计算(v-(x*y+z–540))/x, 并显示结果。

elderingezez的博客 740

汇编常用的INT 21H系统调用

系统功能调用——由DOS提供的一组实现特殊功能的子程序供程序员在编写自己的程序时调用,以减轻编程的工作量。 分两种,DOS系统功能调用和BIOS终端调用。 汇编语言中DOS系统功能调用有很多,涉及屏幕显示、文件管理、I/O管理等等,每个子程序都有一个功能号,所有的功能调用的格式都是一致的。调用的步骤大致如下: (1)系统功能号送到寄存器AH中; (2)入口参数送到指定的寄存器中; (

To the world. 5万+

MIPS汇编程序设计——Cousera

第一题:用系统功能调用实现简单输入输出 利用系统功能调用从键盘输入,转换后在屏幕上显示,具体要求如下: 如果输入的是字母(A~Z,区分大小写)或数字(0~9),则将其转换成对应的英文单词后在屏幕上显示,对应关系见下表 若输入的不是字母或数字,则在屏幕上输出字符“*” 每输入一个字符,即时转换并在屏幕上显示 支持反复输入,直到按“?”键结束程序 第一题代码: .data suc: .as...

Sudouble的专栏 854

INT 21H 指令说明及使用方法(汇编语言学习)

INT 21H一般搭配着AH使用。 MOV AH, 01H INT 21H 一般是这样的使用方式。 通过这样两条指令,输入的字符就会被存储在AL中。 例如: 在很多时候我们想要去做汇编程序的输入与输出(从键盘上直接的输入)并且屏幕上能显示的那种,我们就可以 输出 MOV AH, 09H INT 21H 输入 MOV AH, 0AH INT 21H 表:DOS系统功能调IN...

既然弱小,就只顾变强就是了 4万+

c语言 字符输入z 则输出b,编程序,输入两个字符串a,b,将两者连接后输出c

编程序,输入两个字符串a,b,将两者连接后输出c以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!编程序,输入两个字符串a,b,将两者连接后输出c思路:两个字符串的拼接可以使用strcat函数。strcat函数原型: char *strcat(char *s1,char *s2);需要引入头文件:#include 功能:把...

weixin_36463088的博客 1457

十进制转化为二进制与十六进制显示(汇编程序)

stacks segment stack dw 200h dup(0);不太明白要200h这么大 stacks ends data segment in_buf db 6;定义输入字符串最大长度 in_len db ?;输入字符串实际长度 dec_buf db 6 dup(30h),'=' bin_buf db 16 dup(30h),'B=' hex_buf db 4 dup(30h),'H'

normol的博客 9221

从“Hello World”到端口读写:用MASM 6.15手把手带你玩转8086汇编

本文通过MASM 6.15汇编器,从基础的'Hello World'程序开始,逐步深入8086汇编语言的学习,涵盖环境搭建、交互式输入输出、端口操作与硬件控制等实战内容。适合希望深入理解计算机底层原理的开发者,特别是C/C++程序员,通过做中学的方式掌握汇编语言的核心概念和应用技巧。

weixin_30628801的博客 459

汇编程序

输出1,2,3,4 ;输出1 2 3 4 data segment; x db 1 data ends code segment assume ds:data,cs:code start: mov ax,data; mov ds,ax; add x,'0'; mov cx,4; print: mov dl,x; mov ah,02h;

nealgavin的专栏 723
上一篇: 睡不着,总结一下!!!
下一篇: INT 21H
i丹明扬
博客等级 码龄15年 331粉丝 115原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值