汇编源程序-字符串输入输出

合集下载

用汇编语言编写的以空格为前导输出字符串程序

用汇编语言编写的以空格为前导输出字符串程序

用汇编语言编写的以空格为前导输出字符串程序实验内容:有些字符串以零作为前导,现要求以空格作为前导设计目的:1.进一步熟悉程序设计的思路和方法2.掌握各类程序的设计技巧设计原理:有些字符串以零作为前导,现在将空格作为前导。

字符串的显示是按地址顺序输出的,将零换作空格,只需要先输出一个空格字符,将字符空格的地址放在字符串首地址+1位置,然后按顺序逐个输出即可。

扩展适用:使用范围广泛,用于改写字符串,在编程中有较多的。

参看流程图:附录A:;程序模板SSEG SEGMENT PARA STACK 'stack'dw 100h dup(0) ;初始化堆栈大小为100SSEG ENDSDSEG SEGMENTBUF DB '0ABCD$';设计原字符串为0ABCDESEG SEGMENT;附加段:在此处添加程序所需的数据ESEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEG, es:ESEG, ss:SSEGMAIN PROC FAR ;主程序入口mov ax, dsegmov ds, axmov ax,esegmov es, axLEA SI,BUFMOV DL,' 'MOV AH,02INT 21HINC SIMOV DX,SIMOV AH,09INT 21H;按任意键退出mov ah,1int 21hmov ax, 4c00h ;程序结束,返回到操作系统系统int 21hMAIN ENDPCSEG ENDSEND MAIN运行结果:附录B:参考文献:《微机原理与接口技术》结束语:变成过程中,感悟很多,虽然实验内容简单,但在编程的应用中会有狠广泛的使用,自己的编程思路得到了巩固,在以后的学习路上我会继续积累学习经验,每次编程都是学习的积累。

字符及字符串输入输出与顺序程序设计实验报告

字符及字符串输入输出与顺序程序设计实验报告

字符及字符串输入输出与顺序程序设计实验实验报告2.2.1 实验目的1、学习和掌握字符及字符串的输入输出方法。

2、掌握顺序程序的设计方法。

3、进一步掌握调试工具的使用方法。

2.2.2 实验预习要求1、复习DOS功能调用中用于字符输入(功能号01H)、字符输出(功能号02H)、字符串输入(功能号为0AH)以及字符串输出(功能号09H)的调用方法(详见教材5.5.6)。

2、复习BCD码运算调整指令。

3、根据“2.2.3 实验内容”中给出的源程序框架编写完整的源程序,以便实验时调试。

4、从“2.2.4 实验习题”中任选一道题目,编写源程序,以便上机调试。

2.2.3实验内容从键盘输入两个一位十进制数,计算这两个数之和,并将结果在屏幕上显示出来。

1、问题分析比如使用功能号为01H的用于实现单个字符输入的DOS功能调用接收从键盘输入的两个十进制数8和6,这时计算机内部得到的是这两个数的ASCII码值38H和36H。

由于数字0 9的ASCII码值与其代表的数值之间相差30H,因此将其减去30H即可得到以非压缩型BCD数形式表示的十进制数08H和06H,使用ADD指令对它们进行相加后结果为0EH(00001110B),显然需要用非压缩型BCD数加法调整指令对ADD的运算结果进行调整,调整后得到两个非压缩型BCD数01H和04H,将它们分别加上30H后变为其对应的ASCII码31H(1的ASCII码)和34H(4的ASCII码),然后调用功能号为02H用于单个字符输出的DOS功能调用将它们显示出来。

综上所述,需要考虑以下问题。

(1)从键盘输入一个一位十进制数的方法通过功能号为1的DOS功能调用实现从键盘输入一个字符,格式如下:MOV AH, 01HINT 21H ;此时程序等待用户键入,键入字符的ASCII码值存在AL中SUB AL, 30H ;减去30H后得到键入数字所代表的数值(2)提示信息字符串的显示通过功能号为9的DOS功能调用实现字符串显示,注意字符串的最后一个字符必需为’$’。

汇编语言实验7实验报告

汇编语言实验7实验报告

汇编语言实验7实验报告一、实验目的本次实验旨在通过汇编语言编写程序,实现对字符串的操作和输出。

二、实验内容1. 编写一个汇编程序,要求从键盘输入一个字符串,并将其逆序输出到屏幕上;2. 编写一个汇编程序,要求从键盘输入两个字符串,并将它们拼接起来后输出到屏幕上。

三、实验过程1. 字符串逆序输出程序首先,需要从键盘输入一个字符串。

为了方便起见,我们可以先规定字符串的最大长度为100。

接着,我们需要定义两个变量:```buffer db 100 ; 用于存储输入的字符串length dw ? ; 存储输入的字符串长度```其中,db代表定义字节型变量,dw代表定义双字节型变量。

然后,我们需要使用INT 21H中断来读取用户输入的字符串。

具体而言,我们可以使用下面这段代码:```mov ah, 0Ah ; 设置INT 21H功能号为0Ahmov dx, offset buffer ; 将buffer的地址传给DX寄存器int 21h ; 调用INT 21H中断```该代码会将用户输入的字符串存储在buffer中,并且将其长度存储在length变量中。

接着,我们需要将该字符串逆序输出到屏幕上。

为了实现这个功能,我们可以使用栈来存储字符串中的每个字符,并逐个弹出来输出。

具体而言,我们可以使用下面这段代码:```mov si, offset buffer + 1 ; 将si寄存器指向字符串的第一个字符mov cx, length ; 将cx寄存器设置为字符串长度dec cx ; 字符串长度需要减1reverse:push byte ptr [si] ; 将当前字符压入栈中inc si ; 指向下一个字符loop reverse ; 循环直到所有字符都被压入栈中mov ah, 02h ; 设置INT 21H功能号为02h,表示输出一个字符print:pop dx ; 弹出栈顶元素int 21h ; 输出该字符loop print ; 循环直到所有字符都被弹出并输出完毕```2. 字符串拼接程序首先,需要从键盘输入两个字符串。

精选10个汇编语言程序案例集

精选10个汇编语言程序案例集

精选10个汇编语言程序案例集摘要:一、汇编语言简介二、案例1:简单算术运算三、案例2:字符串处理四、案例3:逻辑与关系运算五、案例4:循环与条件语句六、案例5:函数调用与参数传递七、案例6:数组与指针操作八、案例7:内存管理九、案例8:输入输出操作十、案例9:操作系统调用十一、案例10:网络编程十二、总结与拓展正文:一、汇编语言简介汇编语言是一种低级编程语言,它与计算机硬件的操作紧密相关。

汇编语言通过对计算机指令进行汇编,实现对计算机资源的控制。

下面将介绍10个汇编语言程序案例。

二、案例1:简单算术运算案例1是一个实现加减乘除算术运算的汇编程序。

通过编写相应的汇编指令,实现对两个整数的加减乘除操作。

三、案例2:字符串处理案例2是一个处理字符串的汇编程序。

通过汇编指令实现字符串的输入、输出、查找、替换等功能。

四、案例3:逻辑与关系运算案例3是一个处理逻辑与关系运算的汇编程序。

通过汇编指令实现逻辑与、逻辑或、逻辑非以及关系运算。

五、案例4:循环与条件语句案例4是一个处理循环与条件语句的汇编程序。

通过汇编指令实现for、while、if-else等循环与条件控制结构。

六、案例5:函数调用与参数传递案例5是一个处理函数调用与参数传递的汇编程序。

通过汇编指令实现函数调用,以及将参数传递给函数。

七、案例6:数组与指针操作案例6是一个处理数组与指针操作的汇编程序。

通过汇编指令实现数组的创建、访问、排序等操作,以及指针的运算与控制。

八、案例7:内存管理案例7是一个处理内存管理的汇编程序。

通过汇编指令实现内存的分配、释放、拷贝等操作。

九、案例8:输入输出操作案例8是一个处理输入输出操作的汇编程序。

通过汇编指令实现键盘输入、显示输出等功能。

十、案例9:操作系统调用案例9是一个处理操作系统调用的汇编程序。

通过汇编指令实现操作系统提供的功能,如文件操作、进程管理等。

十一、案例10:网络编程案例10是一个处理网络编程的汇编程序。

微型计算机技术题库

微型计算机技术题库

第1章强化训练一、单项选择题1. 在微处理器内部实现信息交换的总线称为()。

A.片总线B.内部总线C.芯片总线D.系统总线2. 下列哪组设备安装在主机箱中()。

A.显示器、硬盘驱动器、电源B.键盘、CPU、I/O接口卡C.内存、鼠标、光盘驱动器D.Cache、主板、电源3. 单片机又可称为()。

A.个人计算机B.嵌入式计算机C.单板机D.PC机4. 以下设备属于微型计算机的输入设备的是()。

A.键盘、鼠标、扫描仪B.鼠标、打印机、音箱C.键盘、音箱、麦克风D.打印机、显示器、扫描仪5. 以下设备属于微处理器的组成部件的是()。

A.内存B.硬盘C.通用寄存器D.I/O接口6. 计算机中常用的BCD码是()。

A.二进制数B.十六进制数C.二进制编码的十进制数D.不带符号数的二进制形式7. 目前,在计算机中采用二进制数,是因为()。

A.容易实现B.算术四则运算规则简单C.可进行二值逻辑运算D.以上都是8. 下列数中最大值的是()。

A.5AHB.01100011BC.28D.(10011000)BCD9. 下列数中最小的值是()。

A.(28)10B.(01100011)2C.(10011000)BCDD.(5A)1610. 构成微机的主要部件除CPU、系统总线、I/O接口外,还有()。

A.CRTB.键盘C.磁盘D.内存(ROM和RAM)11. 已知[X]原=10011010B,[Y]原=11101011B,则[X-Y]补=()。

A.溢出B.01111011BC.10000101BD.01010001B12. 十进制数-75用二进制10110101表示,其表示方式是()。

A.原码B.补码C.反码D.ASCII码13. 有一个8位机器数的补码是11111101,其相应的十进制真值是()。

A.-3B.-2C.509D.25314. 十进制数-38的8位机器数补码是()。

A.01011011B.110110110C.11011011D.0101101015. 十进制数38的8位机器数补码是()。

汇编语言writestring

汇编语言writestring

汇编语言writestring汇编语言是一种底层的计算机语言,用于控制计算机硬件执行特定的指令。

在汇编语言中,writestring是一个常用的指令,用于将字符串输出到屏幕上。

本文将详细介绍writestring指令的使用方法和注意事项。

一、writestring指令的基本用法在汇编语言中,使用writestring指令可以将一个字符串输出到屏幕上。

该指令的基本语法如下:writestring 字符串地址其中,字符串地址是一个指向存储字符串的内存地址的指针。

在使用writestring指令之前,需要先将字符串存储到内存中,并将字符串地址赋值给字符串指针,然后再使用writestring指令将字符串输出。

二、存储字符串到内存中在使用writestring指令之前,需要先将字符串存储到内存中。

可以使用db伪指令来定义一个字符串,并将其存储到内存中的某个地址。

例如,下面的代码将字符串"Hello, world!"存储到内存地址0x1000处:.datastr db 'Hello, world!', 0在这里,db指令用于定义一个字节类型的数据,即字符串中的每一个字符。

字符串以单引号包围,并以逗号分隔每个字符。

最后的0表示字符串的结束符。

str是一个标签,用于表示字符串的起始地址。

三、将字符串地址赋值给字符串指针在使用writestring指令之前,需要将字符串地址赋值给一个字符串指针。

字符串指针是一个用于存储字符串地址的寄存器或内存单元。

例如,下面的代码将字符串地址0x1000赋值给寄存器eax:mov eax, 0x1000四、使用writestring指令将字符串输出在将字符串地址赋值给字符串指针之后,就可以使用writestring 指令将字符串输出到屏幕上了。

例如,下面的代码使用writestring指令将字符串输出:writestring eax在这里,eax是一个存储字符串地址的寄存器。

汇编语言输出HelloWorld

汇编语言输出HelloWorld

汇编语言输出HelloWorld```汇编语言输出HelloWorld```在计算机编程领域,汇编语言被广泛用于编写底层代码,实现对硬件的直接控制。

汇编语言具有高效性和灵活性等特点,因此在一些对性能要求较高的场景中得到了广泛应用。

本文将介绍如何使用汇编语言输出经典的HelloWorld字符串。

首先,我们需要了解汇编语言的基本语法和指令集。

x86汇编语言是一种常用的汇编语言,广泛应用于PC平台。

在x86汇编语言中,程序员通过编写一系列指令来控制计算机的运行。

这些指令可以操作和传输数据,进行逻辑判断和循环等操作。

通常,我们使用汇编语言编写的程序需要经过两个步骤才能在计算机上运行:汇编和链接。

汇编是将汇编代码翻译成机器码的过程。

在这个过程中,我们需要使用到一个叫做汇编器的工具。

不同的汇编器有不同的命令和语法,但是它们的基本原理都是相同的。

链接是将多个目标文件组合在一起,生成可执行文件的过程。

在这个过程中,我们需要使用一个叫做链接器的工具。

链接器会根据目标文件中的符号和地址信息,将各个目标文件合并成一个完整的程序。

接下来,我们来编写一个用汇编语言输出HelloWorld的示例程序:```assemblysection .datahello db 'Hello, World!',10len equ $-hellosection .textglobal _start_start:; 输出HelloWorld字符串mov eax, 4mov ebx, 1mov ecx, hellomov edx, lenint 0x80; 退出程序mov eax, 1xor ebx, ebxint 0x80```上面的程序使用到了x86汇编语言的一些基本指令,以及Linux系统调用来实现输出字符串和退出程序的功能。

其中,`.data`部分定义了程序中使用的数据段。

在这里,我们定义了一个以`hello`为标识的字符串,内容为`Hello, World!`,并以换行符结束。

微机原理实验指导书

微机原理实验指导书

实验一数据传送实验目的:1.熟悉8086指令系统的数据传送指令及8086的寻址方式。

2.利用TurboDebugger调试工具来调试汇编语言程序。

实验任务:1.通过下述程序段的输入和执行来熟悉TurboDebugger的使用,并通过显示器屏幕观察程序的执行情况。

练习程序段如下:MOVBL,08HMOVCL,BLMOVAX,03FFHMOVBX,AXMOVDS:[0020H],BX2.用以下程序段将一组数据压入(PUSH)堆栈区,然后通过不同的出栈顺序出栈,观察出栈后数据的变化情况。

压栈程序段如下:MOVAX,0102HMOVBX,0304HMOVCX,0506HMOVDX,0708HPUSHAXPUSHBXPUSHCXPUSHDX出栈程序段请自行编写(用不同的出栈顺序)。

3.指出下列指令的错误并加以改正,上机验证之。

(1)MOV[BX],[SI](2)MOVAH,BX(3)MOVAX,[SI][DI](4)MOVBYTEPTR[BX],2000H(5)MOVCS,AX(6)MOVDS,2000H4.设置各寄存器及存储单元的内容如下:(BX)=0010H,(SI)=0001H(10010H)=12H,(10011H)=34H,(10012H)=56H,(10013H)=78H(10120H)=0ABH,(10121H)=0CDH,(10122H)=0EFH说明下列各条指令执行完后AX寄存器中的内容,并上机验证。

(1)MOVAX,1200H(2)MOVAX,BX(3)MOVAX,[0120H](4)MOVAX,[BX](5)MOVAX,0110H[BX](6)MOVAX,[BX][SI](7)MOVAX,0110H[BX][SI]5.将DS:1000H字节存储单元中的内容送到DS:2020H单元中存放。

试分别用8086的直接寻址、寄存器间接寻址、变址寻址、寄存器相对寻址传送指令编写程序段,并上机验证结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

精选课件
2
【例5.5】分析下面的程序,写出程序执行后的结果。
data SEGMENT
buf1 DB 'Hello, ',13,10, 'this is an example.$ ',13,10
buf2 DB '-- END --$'
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
LEA DX,[buf1]
MOV AH,9
精选课件
8
INT 21H MOV AX,4C00H INT 21H code ENDS END main 【解】执行结果如下: Hello, this is an example. -- END --
精选课件
9
5.3.2 字符串输入
【入口参数】AH = 0AH,是DOS的子功能号10 DS:DX = 输入缓冲区的起始逻辑地址
5.3 字符串输入输出方法
5.3.1 字符串输出
【入口参数】AH = 9,是DOS的子功能号 DS:DX = 待输出字符串的首字符的逻辑地址 【说明】
(1)被输出的字符串的长度不限,但必须连续存放在内存
的某个地方,且以ASCII值为24H的字符'$'结束,中间可以含
有回车符、换行符、响铃符等特殊功能符号,存放字符串的
4
分析一下例5.5的程序:
(1)程序包括两个段,data段中只有变量定义,是数据段, code段中是指令序列,是代码段。
(2)ASSUME伪指令只用来说明code段中定义的各标识符 (实际只有标号main)以CS为缺省段寄存器,data段中的各标 识符(两个变量)以DS为缺省段寄存器。ASSUME伪指令本身并 没有对CS和DS赋值的功能,所以代码段的最前面两条指令就 是用来对DS赋值,因为后面的字符串输出要求把输出串的段 地址放到DS中。
输入缓冲区有特定的要求,其内存图如图5.3所示。
DS:DX
len1
允许输入的最大字符数
len2
实际输入的字符数
……
输入串的各个字符
图5.3 用DOS的10号子功能进精选行课字件 符串输入的缓冲区要求
10
【出口参数】由DOS的10号子功能在输入缓冲区中填写实 际输入情况,即根据键盘输入情况,对图5.3中的“实际输入 字符数”和“输入串的各个字符”部分进行填写。
(6)由于9号子功能调用的结果并不改变除了AL以外的 其它寄存器的值,故调用完后AH中仍然是9,所以第2次调 用INT 21H时只对DX重新赋了值,取的是buf2的偏移地址, 因而第2次INT 21H调用仍然是9号,从光标所在位置输出 buf2的内容直到'$',于是得到前面的输出结果。
精选课件
7
【例5.6】对例5.5的程序稍做修改成为下面的情况,写出 程序执行后的结果。
data SEGMENT
buf1 DB 'Hello, ',13,10, 'this is an example. ',13,10
buf2 DB -- END --$
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
main:MOV AX,data
MOV DS,AX
(5)变量buf1中的第1个字符是字母'H',9号子功能从该字
母开始,逐个显示后续字符,遇到13和10分别进行回车换行处
理,直到遇到'$'符为止,'$'本身并不出现在屏幕上,此时的输
出情况是:
精选课件

6
Hello,
this is an example.
并且光标停在了第2行输出的最后一个符号‘.’的后面。虽然 buf1的定义中在‘$’后面还有内容,这些内容都不会被输出。
【说明】
(1)输入缓冲区是一段连续的内存区,首地址必须在调用 10号子功能前放到指定的寄存器DS和DX中。
(2)10号子功能在调用时等待操作员从键盘上按键,直到 按下回车键为止,按键情况会显示在屏幕上,最后按下的回车 键会导致回车操作。如果在按回车键之前发现输入有错误,可 以使用退格键或向左的箭头进行修改。
精选课件
11
(3)输入缓冲区的最前面一个字节(图5.3中len1处)的值 由用户程序填写,用以指出允许输入的最大字符数。该值是
字节型无符号数,有效范围是0~255,最后按的回车键也计算 在内。当已输入len1–1个字符后就只能按回车键了,按其它键 都会被认为是不正确的输入而不被机器认可,并且喇叭还会
精选课件
5
(3) 程序中没有类似的指令对CS赋值。这是因为操作系 统DOS把该程序调进内存后,会把机器的控制权交给该程序, 这是通过修改CS和IP的值的方法实现的。也就是说,DOS在移 交控制权时就已经把CS和IP都放好了正确的值,而不需要用户 程序进行处理。
(4)程序中的第1次INT 21H调用前,用LEA指令把变量 buf1的偏移地址取到寄存器 DX中,用MOV指令把AH赋值为子 功能号9,而在此之前DS已被赋值为buf1所在的data 段的段地 址。
发出“嘀”的一声响以示警告。如果len1=1,表示只能按1个 键,这个键只能是回车键,按其它键都会有“嘀”的一声警
告;如果len1=0,表示一个键都不能按,包括回车键在内的任 何按键都会被拒绝并且发出“嘀”的警告声,但机器又在等
待输入,这一矛盾将导致无限期等待,即死机。
精选课件
12
(4)输入缓冲区的次字节(图5.3中len2处)是由DOS的 10号子功能填写的。在调用前用户程序可把它设为任意值, 用户程序填写的这个值对10号子功能调用没有任何影响。
起始逻辑地址必须放在指定的寄存器DS和DX中。
精选课件
1
(2)‘$’符本身不输出到屏幕。
(3) 调用结果是把字符串中的各个字符从光标当前所在 位置起,依次显示在屏幕上,直至遇到‘$’为止,光标停在 最后一个输出符号的后面。
(4)如果程序中需要输出‘$’,只能用2号子功能实现。
(5)9号子功能调用将影响AL的内容,不改变其余寄存 器及标志寄存器的值。
main:MOV AX,data
MOV DS,AX
精选课件
3
LEA DX,[buf1]
MOV AH,9
INT 21H
MOV DX,OFFSET buf2
INT 21H
MOV AX,4C00H
INT 21H
code ENDS
END main 【解】执行结果如下:
Hello,
this is an example.-- END精-选- 课件
相关文档
最新文档