汇编语言代码

合集下载

常见汇编代码

常见汇编代码

常见汇编代码汇编语言是一种低级语言,主要用于编写计算机的指令集。

在程序开发和系统调试中,掌握常见的汇编代码是非常重要的。

本文将介绍一些常见的汇编代码及其用途。

一、数据传输指令1. MOV:将数据从一个位置复制到另一个位置。

例如,MOV AX, BX将BX寄存器中的数据复制到AX寄存器中。

2. XCHG:交换两个位置的数据。

例如,XCHG AX, BX将AX寄存器和BX寄存器中的数据进行交换。

3. PUSH:将数据推入栈中。

例如,PUSH AX将AX寄存器的数据推入栈中。

4. POP:将数据从栈中弹出。

例如,POP AX将从栈中弹出的数据存储到AX寄存器中。

二、算术指令1. ADD:将两个数相加并将结果存储在目标位置。

例如,ADD AX, BX将AX寄存器和BX寄存器中的数据相加,并将结果存储到AX寄存器中。

2. SUB:将两个数相减并将结果存储在目标位置。

例如,SUB AX, BX将AX寄存器中的数据减去BX寄存器中的数据,并将结果存储到AX寄存器中。

3. MUL:将两个数相乘并将结果存储在目标位置。

例如,MUL AX, BX将AX寄存器和BX寄存器中的数据相乘,并将结果存储到AX寄存器中。

4. DIV:将两个数相除并将结果存储在目标位置。

例如,DIV AX, BX将AX寄存器中的数据除以BX寄存器中的数据,并将商存储到AX寄存器中。

三、逻辑指令1. AND:对两个数进行逻辑与操作,并将结果存储在目标位置。

例如,AND AX, BX将AX寄存器和BX寄存器中的数据进行逻辑与操作,并将结果存储到AX寄存器中。

2. OR:对两个数进行逻辑或操作,并将结果存储在目标位置。

例如,OR AX, BX将AX寄存器和BX寄存器中的数据进行逻辑或操作,并将结果存储到AX寄存器中。

3. XOR:对两个数进行逻辑异或操作,并将结果存储在目标位置。

例如,XOR AX, BX将AX寄存器和BX寄存器中的数据进行逻辑异或操作,并将结果存储到AX寄存器中。

汇编语言程序代码

汇编语言程序代码

汇编语言程序代码尽管现代编程语言如Java、Python等变得越来越流行,但汇编语言仍然是计算机科学领域中重要的一部分。

汇编语言是一种低级语言,它直接与计算机的硬件交互。

本文将介绍一些常见的汇编语言程序代码示例,帮助读者更好地理解和应用汇编语言。

1. 汇编语言入门汇编语言是一种基于机器指令的编程语言,它将符号标签与机器指令一一对应。

下面是一个简单的汇编语言程序示例:```assemblysection .datamessage db "Hello, World!", 0section .textglobal _start_start:; write the message to standard outputmov eax, 4 ; system call number for writemov ebx, 1 ; file descriptor for standard outputmov ecx, message ; pointer to the messagemov edx, 13 ; message lengthint 0x80 ; trigger the system call; exit the programmov eax, 1 ; system call number for exitxor ebx, ebx ; exit code 0int 0x80 ; trigger the system call```以上汇编代码实现了在屏幕上输出"Hello, World!"的功能。

它使用了Linux内核的系统调用接口来完成输入输出操作。

2. 汇编语言的数据处理汇编语言可以直接对计算机的寄存器和内存进行操作,因此具有较高的灵活性和效率。

下面是一个将两个数字相加并输出结果的示例:```assemblysection .datanum1 dd 42num2 dd 23result dd 0section .textglobal _start_start:; load the values of num1 and num2 into registers mov eax, [num1]mov ebx, [num2]; add the valuesadd eax, ebx; store the result into memorymov [result], eax; convert the result to string for printingmov ebx, resultmov ecx, 10xor edx, edxdiv ecxadd edx, '0'mov byte [ebx+4], dlmov ax, dxxor edx, edxdiv ecxadd edx, '0'mov byte [ebx+3], dlmov ax, dxxor edx, edxdiv ecxadd edx, '0'mov byte [ebx+2], dlmov ax, dxxor edx, edxdiv ecxadd edx, '0'mov byte [ebx+1], dlmov ax, dxadd al, '0'mov byte [ebx], al; write the result to standard output mov eax, 4mov ebx, 1mov ecx, resultmov edx, 5int 0x80; exit the programmov eax, 1xor ebx, ebxint 0x80```以上汇编代码将数字42和23相加,并将结果输出到屏幕上。

汇编的基本常用指令

汇编的基本常用指令

汇编的基本常用指令汇编语言是一种底层的程序设计语言,主要用于编写机器码指令。

以下是一些常用的汇编指令:1. MOV:将数据从一个位置复制到另一个位置。

2. ADD:将两个操作数相加,并将结果存储在目的操作数中。

3. SUB:将第二个操作数从第一个操作数中减去,并将结果存储在目的操作数中。

4. INC:将一个操作数的值增加1。

5. DEC:将一个操作数的值减少1。

6. CMP:比较两个操作数的值,并将结果影响到标志寄存器中。

7. JMP:无条件跳转到指定的代码位置。

8. JZ / JE:当指定的条件成立时,跳转到指定的代码位置(零标志或相等标志)。

9. JNZ / JNE:当指定的条件不成立时,跳转到指定的代码位置(非零标志或不相等标志)。

10. JL / JB:当源操作数小于目的操作数时,跳转到指定的代码位置(小于标志或借位标志)。

11. JG / JA:当源操作数大于目的操作数时,跳转到指定的代码位置(大于标志或进位标志)。

12. CALL:调用一个子程序或函数。

13. RET:返回子程序或函数的调用处。

14. NOP:空操作,用于占位或调整程序代码的位置。

15. HLT:停止运行程序,将CPU置于停机状态。

这里只列举了一些基本的汇编指令,实际上汇编语言有更多更复杂的指令,具体使用哪些指令取决于所使用的汇编语言和目标处理器的指令集架构。

继续列举一些常用的汇编指令:16. AND:将两个操作数进行按位与运算,并将结果存储在目的操作数中。

17. OR:将两个操作数进行按位或运算,并将结果存储在目的操作数中。

18. XOR:将两个操作数进行按位异或运算,并将结果存储在目的操作数中。

19. NOT:对一个操作数的每一位进行取反操作。

20. SHL / SAL:将一个操作数的每一位向左移动指定的位数。

对于无符号数,使用SHL指令;对于带符号数,使用SAL指令。

21. SHR:将一个操作数的每一位向右移动指定的位数,高位空出的位使用0填充。

汇编语言的所有指令

汇编语言的所有指令

汇编语言的所有指令数据传送指令集MOV功能: 把源操作数送给目的操作数语法: MOV 目的操作数,源操作数格式: MOV r1,r2MOV r,mMOV m,rMOV r,dataXCHG功能: 交换两个操作数的数据语法: XCHG格式: XCHG r1,r2 XCHG m,r XCHG r,mPUSH,POP功能: 把操作数压入或取出堆栈语法: PUSH 操作数POP 操作数格式: PUSH r PUSH M PUSH data POP r POP mPUSHF,POPF,PUSHA,POPA功能: 堆栈指令群格式: PUSHF POPF PUSHA POPALEA,LDS,LES功能: 取地址至寄存器语法: LEA r,m LDS r,m LES r,mXLAT(XLATB)功能: 查表指令语法: XLAT XLAT m算数运算指令ADD,ADC功能: 加法指令语法: ADD OP1,OP2 ADC OP1,OP2格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data影响标志: C,P,A,Z,S,OSUB,SBB功能:减法指令语法: SUB OP1,OP2 SBB OP1,OP2格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data影响标志: C,P,A,Z,S,OINC,DEC功能: 把OP的值加一或减一语法: INC OP DEC OP格式: INC r/m DEC r/m影响标志: P,A,Z,S,ONEG功能: 将OP的符号反相(取二进制补码)语法: NEG OP格式: NEG r/m影响标志: C,P,A,Z,S,OMUL,IMUL功能: 乘法指令语法: MUL OP IMUL OP格式: MUL r/m IMUL r/m影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志)DIV,IDIV功能:除法指令语法: DIV OP IDIV OP格式: DIV r/m IDIV r/mCBW,CWD功能: 有符号数扩展指令语法: CBW CWDAAA,AAS,AAM,AAD功能: 非压BCD码运算调整指令语法: AAA AAS AAM AAD影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD)DAA,DAS功能: 压缩BCD码调整指令语法: DAA DAS影响标志: C,P,A,Z,S位运算指令集AND,OR,XOR,NOT,TEST功能: 执行BIT与BIT之间的逻辑运算语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL功能: 移位指令语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL影响标志: C,P,Z,S,OROR,ROL,RCR,RCL功能: 循环移位指令语法: ROR r/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL 影响标志: C,P,Z,S,O程序流程控制指令集CLC,STC,CMC功能: 设定进位标志语法: CLC STC CMC标志位: CCLD,STD功能: 设定方向标志语法: CLD STD标志位: DCLI,STI功能: 设定中断标志语法: CLI STI标志位: ICMP功能: 比较OP1与OP2的值语法: CMP r/m,r/m/data标志位: C,P,A,Z,OJMP功能: 跳往指定地址执行语法: JMP 地址JXX功能: 当特定条件成立则跳往指定地址执行语法: JXX 地址注:A: ABOVE,当C=0,Z=0时成立B: BELOW,当C=1时成立C: CARRY,当弁时成立CXZ: CX寄存器的值为0(ZERO)时成立E: EQUAL,当Z=1时成立G: GREATER(大于),当Z=0且S=0时成立L: LESS(小于),当S不为零时成立N: NOT(相反条件),需和其它符号配合使用O: OVERFLOW,O=1时成立P: PARITY,P=1时成立PE: PARITY EVEN,P=1时成立PO: PARITY ODD,P=0时成立S: SIGN,S=1时成立Z: ZERO,Z=1时成立LOOP功能: 循环指令集语法: LOOP 地址LOOPE(Z)地址LOOPNE(Z) 地址标志位: 无CALL,RET功能: 子程序调用,返回指令语法: CALL 地址RET RET n标志位: 无INT,IRET功能: 中断调用及返回指令语法: INT n IRET标志位: 在执行INT时,CPU会自动将标志寄存器的值入栈,在执行IRET时则会将堆栈中的标志值弹回寄存器字符串操作指令集MOVSB,MOVSW,MOVSD功能: 字符串传送指令语法: MOVSB MOVSW MOVSD标志位: 无CMPSB,CMPSW,CMPSD功能: 字符串比较指令语法: CMPSB CMPSW CMPSD标志位: C,P,Z,S,OSCASB,SCASW功能: 字符串搜索指令语法: SCASB SCASW标志位: C,P,Z,S,OLODSB,LODSW,STOSB,STOSW功能: 字符串载入或存贮指令语法: LODSB LODSW STOSB STOSW标志位: 无REP,REPE,REPNE功能: 重复前缀指令集语法: REP 指令S REPE 指令S REPNE 指令S标志位: 依指令S而定对于IBM PC机它有它的指令系统,其中包括:数据传送指令、串处理指令、算术指令、控制移动指令、逻辑指令、处理机控制指令。

汇编语言文件的读写源代码

汇编语言文件的读写源代码

汇编语言文件的读写源代码一、概述汇编语言是一种低级语言,可以直接操作计算机的硬件资源。

在使用汇编语言编程时,文件的读写是非常常见的操作。

本文将介绍如何使用汇编语言进行文件的读写操作,并给出相应的源代码示例。

二、文件读取1. 打开文件在进行文件读取操作之前,首先需要打开待读取的文件。

以下是一个打开文件的汇编语言源代码示例:```assemblysection .datafilename db 'example.txt', 0mode db 'r', 0file dd 0section .textglobal _start_start:; 打开文件mov eax, 5mov ebx, filenamemov ecx, modeint 0x80mov [file], eax; ...```在上述示例中,首先定义了一个变量 `filename` 用于存储待读取文件的文件名,变量 `mode` 用于指定打开文件的模式。

然后使用系统调用 `int 0x80` 进行文件打开操作,并将返回的文件描述符保存在变量`file` 中。

2. 读取文件内容文件打开之后,就可以开始读取文件的内容了。

以下是一个读取文件内容的汇编语言源代码示例:```assemblysection .bssbuffer resb 1024section .text; ...; 读取文件内容mov eax, 3mov ebx, [file]mov ecx, buffermov edx, 1024int 0x80; ...```在上述示例中,定义了一个缓冲区变量 `buffer` 来存储读取的文件内容,并使用系统调用 `int 0x80` 进行文件读取操作。

读取的文件内容将被存储到缓冲区变量 `buffer` 中。

三、文件写入1. 创建文件在进行文件写入操作之前,有时需要先创建一个新的文件。

以下是一个创建文件的汇编语言源代码示例:```assemblysection .datafilename db 'output.txt', 0mode db 'w', 0file dd 0section .textglobal _start_start:; 创建文件mov eax, 8mov ebx, filenamemov ecx, modemov edx, 0777int 0x80mov [file], eax; ...```在上述示例中,首先定义了一个变量 `filename` 用于存储待创建文件的文件名,变量 `mode` 用于指定创建文件的模式。

汇编语言指令大全及实例解析

汇编语言指令大全及实例解析

汇编语言指令大全及实例解析
汇编语言是一种底层的计算机语言,它直接操作计算机的硬件资源。

在汇编语言中,指令是最基本的操作单位,通过指令可以实现对计算机硬件的控制和操作。

本文将为大家介绍一些常用的汇编语言指令,并通过实例解析它们的具体用法和功能。

1. MOV指令。

MOV指令用于将数据从一个位置复制到另一个位置。

例如,下面的汇编代码将把寄存器AX中的值移动到寄存器BX中:
MOV BX, AX.
这条指令将AX中的值复制到BX中。

2. ADD指令。

ADD指令用于将两个操作数相加,并将结果存储到目标操作数中。

例如,下面的汇编代码将把寄存器AX和BX中的值相加,并将结果存储到AX中:
ADD AX, BX.
3. SUB指令。

SUB指令用于将目标操作数减去源操作数,并将结果存储到目标操作数中。

例如,下面的汇编代码将把寄存器AX中的值减去BX 中的值,并将结果存储到AX中:
SUB AX, BX.
4. CMP指令。

CMP指令用于比较两个操作数的大小,并根据比较结果设置标志位。

例如,下面的汇编代码将比较AX和BX中的值:
CMP AX, BX.
以上是一些常用的汇编语言指令及其实例解析。

通过学习和理解这些指令,我们可以更好地理解和掌握汇编语言的编程技巧,从而更好地编写高效的汇编语言程序。

希望本文对大家有所帮助。

单片机汇编语言经典一百例

单片机汇编语言经典一百例汇编语言是一种底层的程序设计语言,是一种将汇编指令直接翻译成机器指令的语言。

在单片机编程中,掌握汇编语言是非常重要的,因为它可以充分发挥单片机的性能,并且提高程序的运行效率。

本文将介绍一百个经典的单片机汇编语言例子,帮助读者更好地理解汇编语言的使用。

1. 点亮LED灯```ORG 0x0000 ; 程序起始地址MOV P1, #0xAA ; P1口输出高电平,LED灯点亮END ; 程序结束```2. LED流水灯效果```ORG 0x0000 ; 程序起始地址MOV P1, #0x01 ; P1口输出低电平,第一个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x02 ; P1口输出低电平,第二个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x04 ; P1口输出低电平,第三个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x08 ; P1口输出低电平,第四个LED点亮CALL DELAY ; 调用延时函数…DELAY: ; 延时函数MOV R0, #100 ; 设置延时时间DELAY_LOOP:DJNZ R0, DELAY_LOOP ; 循环减一RET ; 返回END ; 程序结束```3. 数码管动态扫描显示```ORG 0x0000 ; 程序起始地址CLR P0.0 ; P0.0口输出低电平,选择第一个数码管MOV P2, #0x7E ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.1 ; P0.1口输出低电平,选择第二个数码管MOV P2, #0x30 ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.2 ; P0.2口输出低电平,选择第三个数码管MOV P2, #0x6D ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.3 ; P0.3口输出低电平,选择第四个数码管MOV P2, #0x79 ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数…DELAY: ; 延时函数MOV R0, #100 ; 设置延时时间DELAY_LOOP:DJNZ R0, DELAY_LOOP ; 循环减一RET ; 返回END ; 程序结束```...通过以上例子,我们可以看到单片机汇编语言的应用非常广泛,可以实现各种各样的功能。

汇编语言代码例子

汇编语言代码例子汇编语言代码例子是指使用汇编语言编写的代码,它是机器语言的一种表示形式,主要用于编写计算机的低级程序,而不是用于创建高级程序。

汇编语言的特点是可以迅速地将机器指令转换为机器代码,并且可以编写出非常高效的程序,也就是所谓的“驱动程序”,它们能够直接控制计算机硬件,如CPU、内存和磁盘。

汇编语言代码例子包括:1. MOV 命令。

MOV 是移动指令,是把某个寄存器中的值移动到另一个寄存器中,或者把内存地址中的值移动到寄存器中,如:mov ax, bx 将bx中的值移动到ax中。

2. ADD 命令。

ADD 是加法指令,是把某个寄存器中的值和另一个寄存器中的值相加,或者把内存地址中的值和寄存器中的值相加,如:add ax, bx 将bx中的值和ax中的值相加。

3. SUB 命令。

SUB 是减法指令,是把某个寄存器中的值和另一个寄存器中的值相减,或者把内存地址中的值和寄存器中的值相减,如:sub ax, bx 将bx中的值从ax中减去。

4. MUL 命令。

MUL 是乘法指令,是把某个寄存器中的值和另一个寄存器中的值相乘,或者把内存地址中的值和寄存器中的值相乘,如:mul ax, bx 将bx中的值和ax中的值相乘。

5. DIV 命令。

DIV 是除法指令,是把某个寄存器中的值和另一个寄存器中的值相除,或者把内存地址中的值和寄存器中的值相除,如:div ax, bx 将bx中的值从ax中除去。

6. CMP 命令。

CMP 是比较指令,是把某个寄存器中的值和另一个寄存器中的值进行比较,或者把内存地址中的值和寄存器中的值进行比较,如:cmp ax, bx 将bx中的值和ax中的值进行比较。

7. JMP 命令。

JMP 是跳转指令,是根据条件跳转到指定的指令处执行,如:jmp label 跳转到“label”标记处执行。

8. CALL 命令。

CALL 是调用指令,是把子程序调用到当前程序中,如:call subroutine 调用名为“subroutine”的子程序。

汇编语言程序代码


BEGIN: MOV AH, 1 ;从键盘输入一个字符的 DOS 调用 INT 21H SUB AL, ‘0’ JB STOP ;输入字符<‘0’吗? CMP AL, 9 ;输入字符>‘9’吗? JA STOP CBW MOV CX, AX ;响铃次数 N JCXZ STOP BELL: MOV DL, 07H ;准备响铃 MOV AH, 2 ;显示一个字符的 DOS 调用,实际为响铃 INT 21H CALL DELAY100ms ;延时 100ms LOOP BELL STOP: RET 5.6 编写程序,将一个包含有 20 个数据的数组 M 分成两个数组:正数数组 P 和负数数组 N, 并分别把这两个数组中数据的个数显示出来。 答:程序如下:
SHR AX, CL ;右移四次 DEC CH JNZ A10 ;循环四次完了码? B10: MOV DL, STORE ;四组数分别放在 AL、BL、CL 和 DL 中 MOV CL, STORE+1 MOV BL, STORE+2 MOV AL, STORE+3 STOP: RET 5.4 试编写一程序,要求比较两个字符串 STRING1 和 STRING2 所含字符是否完全相同,若相 同则显示‘MATCH’,若不相同则显示‘NO MATCH’。 答:程序如下:
DSEG SEGMENT STORE DB 4 DUP (?) DSEG ENDS BEGIN: MOV CL, 4 ;右移四次 MOV CH, 4 ;循环四次 LEA BX, STORE A10: MOV DX, AX AND DX, 0FH ;取 AX 的低四位 MOV [BX], DL ;低四位存入 STORE 中 INC BX
CMP AL, 41H ;又<A 吗? JB INPUT ;不是‘A~F’的数重新输入 CMP AL, 46H ;>F 吗? JA INPUT ;不是‘A~F’的数重新输入 AND AL, 0FH ;转换为:1010B~1111B ADD AL, 9 BINARY: OR BL, AL ;将键盘输入的数进行组合 DEL CH JNZ INPUT DISPN: MOV CX, 16 ;将 16 位二进制数一位位地转换成 ASCII 码显示 DISP: MOV DL, 0 ROL BX, 1 RCL DL, 1 OR DL, 30H MOV AH, 2 ;进行显示 INT 21H LOOP DISP STOP: RET 代码转换; 查表法,实现一位 16 进制数转换为 ASCII 码显示

windows环境下32位汇编语言程序设计附书代码

windows环境下32位汇编语言程序设计附书代码汇编语言是一种底层计算机语言,用于编写与计算机硬件直接交互的程序。

在Windows环境下,可以使用32位汇编语言进行程序设计。

本文将介绍一些常见的32位汇编语言程序,并附带相关的代码示例。

1.程序的基本结构:在32位汇编语言中,程序的基本结构由三个部分组成:数据段、代码段和堆栈段。

数据段用来声明和初始化程序中使用的全局变量和常量。

例如,下面的代码段声明了一个全局变量message,存储了一个字符串。

```data segmentmessage db 'Hello, World!',0data ends```代码段包含了程序的实际执行代码。

下面的代码段使用`mov`指令将message变量中的字符串存储到寄存器eax中,并使用`int 21h`来调用MS-DOS功能1来显示字符串。

```code segmentstart:mov eax, offset messagemov ah, 09hint 21hmov ah, 4chint 21hcode ends```堆栈段用来存储函数调用过程中的局部变量和返回地址。

2.入栈和出栈操作:在程序中,我们经常需要使用堆栈来保存和恢复寄存器的值,以及传递函数参数和保存函数返回值。

以下是一些常用的堆栈操作指令: ```push reg ;将reg中的值压入堆栈pop reg ;将堆栈顶部的值弹出到reg中```下面的示例演示了如何使用堆栈来保存和恢复寄存器的值:```code segmentstart:push eax ;将eax保存到堆栈mov eax, 10 ;设置eax的值为10pop ebx ;将堆栈顶部的值弹出到ebxadd eax, ebx ;将eax和ebx相加int 3 ;调试中断,用于程序的暂停mov ah, 4chint 21hcode ends```3.条件判断和跳转指令:汇编语言中的条件判断和跳转指令用于根据条件的成立与否来改变程序的执行流程。

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

汇编语言编写从键盘输入一段字符串然后逆序输出DATA SEGMENTDB 512 DUP('$') ;定义可输入的字符个数BUF DB '$'CRLF DB 0DH,0AH,24H ;回车换行符DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV BX,OFFSET BUF ;指针指向待显示字符串尾部AGAIN:MOV AH,01 ;输入字符INT 21HCMP AL,0DH ;是回车吗JE DISP ;是,转显示DEC BX ;指针减1MOV [BX],AL ;存入输入的字符JMP AGAIN ;继续输入DISP:MOV AH,09 ;显示MOV DX,OFFSET CRLF ;回车换行INT 21HMOV DX,BX ;定位待显示字符串首地址MOV AH,09INT 21H ;显示MOV AH,4CH ;DOS返回INT 21HCODE ENDSEND START; 本程序通过编译,运行正确Code SegmentAssume CS:Code,DS:Code; -----------------------------------------; 功能:显示指定地址(Str_Addr)的字符串; 入口:; Str_Addr=字符串地址(要求在数据段); 用法: Output Str_Addr; 用法举例:Output PromptStrOutput MACRO Str_Addrlea dx,Str_Addrmov ah,9int 21hEndM; -----------------------------------------; 功能:输出一个字符; 入口:dl=要显示的字符Enter_Chr proc Nearpush axmov ah,02hint 21hpop axretEnter_Chr endp; -----------------------------------------; 功能:输出回车换行Enter_CTLF proc Nearpush axpush dxmov ah,02hmov dl,0dhint 21hmov dl,0ahint 21hpop dxpop axretEnter_CTLF endp; -----------------------------------------Prompt_Str db 'Please input a string: $' ;输入字符串提示信息Start: push cspop dspush cspop es ;使数据段、附加段与代码段同段Output Prompt_Str ;提示输入字符串lea dx,Buffermov ah,0ah ;从键盘接受一串字符int 21hCALL Enter_CTLF ;输出一个回车、换行CALL Enter_CTLF ;输出一个回车、换行cldlea si,Buffer[1] ;实际输入的字符个数地址mov cl,[si] ;读入实际输入的字符个数test cl,0ffhjz Exit_Proc ;直接回车,没有输入任何字符,结束程序,返回操作系统xor ch,ch ;cx=实际输入的字符个数add si,cx ;字符串尾部地址std ;置方向标志,使变址寄存器自动减量Disp_String:lodsbmov dl,alcall Enter_Chr ;显示一个字符loop Disp_StringExit_Proc: mov ah,4ch ;结束程序int 21hBuffer db 100,?Code ENDSEND Start ;编译到此结束从键盘输入一字符串(不超过255个字符)以相反顺序输出data segmenta db ? dup(?)data endseseg segmentb db ? dup(?)eseg endscode segmentassume cs:codestart:mov ah,0ahint 21hmov bl,allea si,alea di,badd di,n-1mov cx,nmove:cldlodsbstdstosbloop movemov ah,4chint 21hcode endsend start解答:data segment;a db ? dup(?)a db 255,0,255 dup(?)data endseseg segment;b db ? dup(?)b db 255 dup(?)eseg endscode segment;assume cs:codeassume cs:code,ds:data,es:esegstart:mov ax,data ;新增mov ds,ax ;mov ax,eseg ;mov es,ax ;mov dx,offset a ;学习0AH号DOS功能调用mov ah,0ahint 21h;mov bl,al mov ch,0 ; mov cl,a+1 ; ;lea si,a lea si,a+2 lea di,b;add di,n-1 add di,cx dec di;mov cx,n move:cld lodsbstdstosbloop move mov ah,4ch int 21h code ends end start;输入字符串去空格后反向输出的程序.model small.386DATA SEGMENTbuf db 100, 0 ,100 DUP (0)msg1 db 'Please input a string: ',0DH,0Ah,'$'crlf db 0Dh,0Ah,'$'leng db 0DATA ENDSSTACK SEGMENTDB 64 DUP (?)STACK ENDSCODE SEGMENTassume cs:CODE,ds:DATA,es:DATA,ss:STACKSTART:mov ax,DATAmov ds,axmov es,axlea dx,msg1 ;输出提示文字mov ah,09hint 21hlea dx,bufmov ah,0ah ;接受字符串int 21h;mov dx,offset crlfmov ah,09h ;输出字符串中断int 21hcall countcall nospace;把这行去掉之后是可以实现反向输出的,当然不能去空格lea dx,bufmov bl,leng;新字符串长度送到blmov bh,00hcmp bx,0000hjnz L1jz EXITL1:mov dl,buf+1[bx] ;把最后一位送到dl mov ah,02h ;输出一个字符中断int 21hdec bx ;倒着输出字符jnz l1EXIT:mov AH,4CHint 21Hcount:xor dx,dxxor cx,cxlea di,bufpush dimov al,0lop:cmp al,[di]je doneinc dlinc diloop lopdone:mov leng,dl;把数组长度存至lengpop diretnospace:push sipush dipush axpush bxpush cxlea si,bufadd si,2 ;读指针simov di,si ;写指针dixor ch,chmov cl,[si-1] ;字符数组长度cldxor bl,bl ;新的字符长度L2:lodsb ;读取字符cmp al,' 'je L3 ;如果是空格,跳过保存操作 stosb ;保存字符inc bl ;记录长度L3:loop L2mov leng,blpop cxpop bxpop axpop dipop siretCODE ENDSEND START字符串逆序输出data segmentstring db 100,?,100 dup(0) data endscode segmentassume cs:code,ds:data start:mov ax,datamov ds,axlea dx,stringmov ah,0ahint 21hlea bx,string+1mov cl,[bx]mov ch,0add bx,cxnext:mov dl,[bx]mov ah,2int 21hdec bxloop nextmov ah,4chint 21hcode endsend start提示一下,小写跟大写字母的ASCII码值就差32,例如‘a’=97=61h,'A'=41h=65,所以只要将小写字母-20h即可,先简单写个,没运行,参考一下吧MOV DX,DATAMOV DS,DXLEA DX,BUFMOV AH,0AHINT 21HMOV DI,OFFSET BUFMOV CL,[DI+1]XOR CH,CHADD DI,2NEXT:CMP [DI],'a'JB NEXT1CMP [DI],'z'JA NEXT1SUBB [DI],20HINC DINEXT1:LOOP NEXTMOV DI,OFFSET BUFMOV CL,[DI+1]XOR CH,CHADD DI,2ADD DI,CX-1DISP:MOV DL,[DI]MOV AH,2INT 21HINC DILOOP DISP利用10号功能调用从键盘输入长度为8的字符串,回车键结束,然后将其逆序输出DATA SEGMENTBUF DB 8DB ?DB 8 DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV DX,DATAMOV DS,DXMOV AH,0AHMOV DX,OFFSET BUFINT 21HLEX BX,BUFMOV CX,[BX+1]ADD BX,9LOOP1:MOV DL,[BX]MOV AH,02HINT 21HLOOP LOOP1MOV AH,4CHINT 21HCODE ENDSEND START。

相关文档
最新文档