汇编语言程序代码

合集下载

汇编语言代码生成.exe步骤及TD测试

汇编语言代码生成.exe步骤及TD测试

一、大体思路:用记事本和DOS中的EDIT命令先编写源程序,再把编好文件的后缀名改为*.asm,再进入DOS打开MASM文件夹,分别利用指令MASM和LINK,生成*.obj 和*.exe,然后在DOS中就可以运行该程序。

二、机器环境介绍:利用桌面当作起始位置、MASM的位置C盘DOS命令介绍:开启DOS程序 cmd退回上一层目录 cd..进入子目录就输入 cd+空格+子目录名一下子就回到根目录 cd \程序的名字为:HELLO三、具体方法:第一步:在桌面上单击鼠标右键新建一个记事本,打开记事本输入所要编程的内容,以*.txt的后缀名保存第二步:将保存好的文件,复制好之后,粘贴到C盘的MASM文件夹下(此处有问题,可能是操作系统版本的问题,我把MASM文件夹粘贴到了下面),并更改后缀名为*.asm第三步:在单击(开始)中找到(运行),输入(cmd),开启DOS程序,以下是最为关键的一个环节。

输入(C:),再输入(CD MASM),现在MASM已经在使用中。

第四步:在DOS的窗口光标移动处,输入(MASM HELLO),此时在C盘\用户\lenovo 的MASM文件夹下生成*.obj文件,按四下回车;再输入(LINK HELLO),再按四下回车,便生成*.exe,可执行文件;最后在DOS中直接输入(HELLO),便可运行刚刚编写的程序。

第五步:当文件在编译的过程中,遇到了错误,可以返回第一步,对源程序进行修改。

第六步:启动TD 并同时载入要调试的程序:把要调试的可执行文件拖到TD.EXE 文件名上,Windows 就会打开一个DOS 窗口并启动TD,然后TD 会把该可执行文件自动载入内存供用户调试。

四、ASM文件的抓图五、TD进行调试的界面抓图。

常见汇编代码

常见汇编代码

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

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

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

一、数据传输指令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寄存器中。

汇编的基本常用指令

汇编的基本常用指令

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

以下是一些常用的汇编指令: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填充。

汇编语言程序

汇编语言程序

2020/12/27
16
4.2.4 表达式
在80x86汇编语言中,有数值表达式和地址 表达式两种。
数值表达式 由各种常量与数值运算符连接而成的式子,
称为数值表达式。数值表达式的计算结果是 一个数值,它只有大小而没有属性。 算术、关系、逻辑运算符
2020/12/27
17
地址表达式
由常量、变量、标号、寄存器和数值运算符、 地址运算符组合而成的有意义的式子,称为 地址表达式,单个变量、标号是地址表达式 的最简形式。由于变量和标号具有段 (SEG)、偏移(OFFSET)、类型 (TYPE)3种属性,这就决定了对它们的访 问是多种形式的。
Байду номын сангаас第四章 汇编语言程序
4.1 汇编语句 4.2 汇编语言数据 4.3 8086指令系统 4.4 汇编语言伪指令 4.5 汇编源程序结构 4.6 上机操作过程
2020/12/27
1
4.1 汇编语句
4.1.1 语句种类 汇编语言有3种语句类型,指令语句、伪指令语句、宏指令语
句。
指令语句是可执行语句,在汇编时可产生供机器执行的二进制
2020/12/27
3
2.名字
名字是一串字符序列,最多包含31个字符。在汇 编语言中,名字的应用范围很广,有寄存器名、变 量名、常量名、标号、指令名等等。在语句格式中 作为第一可选成分出现的<名字>,在不同的语句 中具有不同的含义。它在指令语句中表示标号,后 面必须跟有冒号“:”;而在伪指令语句中表示变 量名,常量名,段名,过程名,后面不能有冒号。 这是两种语句在格式上的主要不同之处。
指令语句中的标号和伪指令语句中变量名,段名, 过程名是一种符号地址,可作为汇编指令的一个操 作数,但常量名不是符号地址,不能用做目的操作 数。不同的标号、变量和常量不能同名。

汇编语言代码例子

汇编语言代码例子

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

汇编语言的特点是可以迅速地将机器指令转换为机器代码,并且可以编写出非常高效的程序,也就是所谓的“驱动程序”,它们能够直接控制计算机硬件,如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 码显示

用汇编语言编写的程序

用汇编语言编写的程序汇编语言是一种低级的编程语言,直接操作计算机硬件。

通过使用汇编语言,程序员可以更加精确地控制计算机的功能和执行过程。

下面将介绍一个用汇编语言编写的程序的例子,以帮助读者更好地理解汇编语言的特点和用途。

一、程序概述这个用汇编语言编写的程序的功能是计算从1到100的所有整数的和。

通过使用汇编语言的特性,我们可以实现高效的计算过程,以最小的资源消耗完成任务。

二、程序设计程序的设计思路是使用循环结构,从1开始累加到100,并将结果保存在寄存器中。

具体的程序设计如下:1. 初始化寄存器:将累加结果的寄存器置零,准备开始累加过程;2. 设定循环起始值:将循环计数器设为1,作为累加的起始值;3. 累加过程:将当前的累加结果与循环计数器相加,将结果保存在累加结果的寄存器中;4. 判断循环结束条件:如果循环计数器小于等于100,则继续循环,否则跳转到结束;5. 循环迭代:将循环计数器加1,准备下一次循环;6. 结束:输出最终的累加结果。

三、程序实现下面是具体的汇编代码实现:```assemblysection .datasum db 0 ; 累加结果count db 1 ; 循环计数器section .textglobal _start_start:mov al, 0 ; 初始化累加结果寄存器 mov bl, 1 ; 初始化循环计数器add al, bl ; 累加过程inc bl ; 循环迭代cmp bl, 101 ; 判断循环结束条件 jle _start ; 继续循环; 输出最终累加结果mov ah, 0x0emov al, 'T'int 0x10mov ah, 0x0e mov al, 'h' int 0x10mov ah, 0x0e mov al, 'e'int 0x10mov ah, 0x0e mov al, ' 'int 0x10mov ah, 0x0e mov al, 's'int 0x10mov ah, 0x0e mov al, 'u'int 0x10mov ah, 0x0e mov al, 'm' int 0x10mov ah, 0x0e mov al, ' 'int 0x10mov ah, 0x0e mov al, 'i'int 0x10mov ah, 0x0e mov al, 's'int 0x10mov ah, 0x0e mov al, ':'int 0x10mov ah, 0x0e mov al, ' 'int 0x10mov ah, 0x0e mov al, '5'int 0x10mov ah, 0x0emov al, '0'int 0x10mov ah, 0x0e mov al, '5'int 0x10mov ah, 0x0e mov al, '0'int 0x10mov ah, 0x0e mov al, '0'int 0x10mov ah, 0x0e mov al, '0'int 0x10mov ah, 0x0e mov al, 0x0d int 0x10mov ah, 0x0e mov al, 0x0aint 0x10; 程序结束mov eax, 1xor ebx, ebxint 0x80```四、程序运行结果以上的程序经过编译、链接后可以在计算机上运行。

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. 引言汇编语言是一种基于计算机硬件体系结构的低级语言。

它用于编写与硬件交互的程序,并且具有直接访问计算机底层硬件的能力。

汇编指令是汇编语言中的基本操作指令,用于执行各种计算机操作,如数据传输、算术运算和逻辑运算等。

本文将为您介绍一些常见的汇编指令。

2. 数据传输指令数据传输指令用于在寄存器之间或内存和寄存器之间传输数据。

2.1 MOV - 数据传送指令mov是最常见的数据传送指令之一。

它用于将数据从一个源操作数传送到一个目的操作数。

mov destination, source其中,destination是目的操作数,source是源操作数。

这两个操作数可以是寄存器、内存地址或立即数。

2.2 LEA - 加载有效地址指令lea指令用于加载一个有效地址到一个目的操作数。

lea destination, source其中,destination是目的操作数,通常为一个寄存器,source是一个内存地址。

3. 算术运算指令算术运算指令用于执行加法、减法、乘法和除法等算术运算。

3.1 ADD - 加法指令add指令用于将两个操作数相加,并将结果存储在目的操作数中。

add destination, source其中,destination是目的操作数,source是源操作数。

这两个操作数可以是寄存器或内存地址。

3.2 SUB - 减法指令sub指令用于将第二个操作数从第一个操作数中减去,并将结果存储在目的操作数中。

sub destination, source其中,destination是目的操作数,source是源操作数。

这两个操作数可以是寄存器或内存地址。

3.3 MUL - 乘法指令mul指令用于将两个操作数相乘,并将结果存储在目的操作数中。

其中,destination是目的操作数,source是源操作数。

这两个操作数可以是寄存器或内存地址。

3.4 DIV - 除法指令div指令用于将目的操作数除以源操作数,并将商存储在目的操作数中,余数存储在另一个寄存器中。

(完整版)单片机汇编语言经典一百例

51单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。

实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。

实际应用中例如:波形发生器。

程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;////////////////////////////////////////////////// DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1秒报警程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。

实际应用例如:定时报警器。

程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50个0.2秒,即50*0.2=1秒MOV TMOD,#00000001B;定时器0工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒//////////////////////////////////////// INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51 使用12M晶振,一个周期是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。

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

jns nonneg ;分支条件:AX≥0 neg ax ;条件不满足,求补 nonneg: mov result,ax ;条件满足 ;计算 AX 的绝对值 cmp ax,0 jl yesneg ;分支条件:AX<0 jmp nonneg yesneg: neg ax ;条件不满足,求补 nonneg: mov result,ax ;条件满足 无符号数除以 2 ;将 AX 中存放的无符号数除以 2,如果是奇数,则加 1 后除以 2 test ax,01h ;测试 AX 最低位 jz even ;最低位为 0:AX 为偶数 add ax,1 ;最低位为 1:AX 为奇数,需要加 1 even: rcr ax,1 ;AX←AX÷2 ;如果采用 SHR 指令,则不能处理 AX=FFFFH 的特殊情况 显示 BX 最高位 shl bx,1 ;BX 最高位移入 CF jc one ;CF=1,即最高位为 1,转移 mov dl,’0’ ;CF=0,即最高位为 0,DL←’0’ jmp two ;一定要跳过另一个分支体 one: mov dl,’1’ ;DL←’1’ two: mov ah,2 int 21h ;显示 shl bx,1 ;BX 最高位移入 CF jnc one ;CF=0,即最高位为 0,转移 mov dl,’1’ ;CF=1,即最高位为 1,DL←’1’ jmp two ;一定要跳过另一个分支体 one: mov dl,’0’ ;DL←’0’ two: mov ah,2 int 21h ;显示 mov dl,’0’ ;DL←’0’ shl bx,1 ;BX 最高位移入 CF jnc two ;CF=0,最高位为 0,转移 mov dl,’1’ ;CF=1,最高位为 1,DL←’1’ two: mov ah,2 int 21h ;显示 判断有无实根
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 码显示
JS FUSHU MOV [SI], AX ;是正数,存入正数数组 INC COUNT1 ;正数个数+1 ADD SI, 2 JMP SHORT NEXT FUSHU: MOV [DI], AX ;是负数,存入负数数组 INC COUNT2 ;负数个数+1 ADD DI, 2 NEXT: ADD BX, 2 LOOP BEGIN1 LEA DX, ZHEN ;显示正数个数 MOV AL, COUNT1 CALL DISPLAY ;调显示子程序 LEA DX, FU ;显示负数个数 MOV AL, COUNT2 CALL DISPLAY ;调显示子程序 RET MAIN ENDP DISPLAY PROC NEAR ;显示子程序 MOV AH, 9 ;显示一个字符串的 DOS 调用 INT 21H AAM ;将(AL)中的二进制数转换为二个非压缩 BCD 码 ADD AH, ‘0’;变为 0~9 的 ASCII 码 MOV DL, AH MOV AH, 2 ;显示一个字符的 DOS 调用 INT 21H ADD AL, ‘0’;变为 0~9 的 ASCII 码 MOV DL, AL MOV AH, 2 ;显示一个字符的 DOS 调用 INT 21H LEA DX, CRLF ;显示回车换行 MOV AH, 9 ;显示一个字符串的 DOS 调用 INT 21H RET DISPLAY ENDP ;显示子程序结束 CSEG ENDS ;以上定义代码段 END START 5.7 试编写一个汇编语言程序,求出首地址为 DATA 的 100D 字数组中的最小偶数,并把它存 放在 AX 中。 答:程序段如下:
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, 并分别把这两个数组中数据的个数显示出来。 答:程序如下:
MOV BX, 0 MOV CX, 100 COMPARE: MOV AX, DATA[BX] ;取数组的第一个偶数 ADD BX, 2
TEST AX, 01H ;是偶数吗? LOOPNZ COMPARE ;不是,比较下一个数 JNZ STOP ;没有偶数,退出 JCXZ STOP ;最后一个数是偶数,即为最小偶数,退出 COMPARE1: MOV DX, DATA[BX] ;取数组的下一个偶数 ADD BX, 2 TEST DX, 01H ;是偶数吗? JNZ NEXT ;不是,比较下一个数 CMP AX, DX ;(AX)<(DX)吗? JLE NEXT MOV AX, DX ;(AX)<(DX),则置换(AX)为最小偶数 NEXT: LOOP COMPARE1 STOP: RET 5.8 把 AX 中存放的 16 位二进制数 K 看作是 8 个二进制的“四分之一字节”。试编写程序要 求数一下值为 3(即 11B)的四分之一字节数,并将该数(即 11B 的个数)在终端上显示出来。 答:程序段如下: BEGIN: MOV DL, 0 ;计数初始值 MOV CX, 8 COMPARE: TEST AX, 03H ;是数 03 吗? JNZ NOEQUAL ;不是,转走 INC DL ;是,计数 NOEQUAL: ROR AX, 1 ;准备判断下一个数 ROR AX, 1 LOOP COMPARE ADD DL, ‘0’;将计数值转换为 ASCII 码 MOV AH, 2 ;进行显示 INT 21H STOP: RET 5.9 试编写一个汇编语言程序,要求从键盘接收一个四位的 16 进制数,并在终端上显示与 它等值的二进制数。 答:程序段如下: BEGIN: MOV BX, 0 ;用于存放四位的 16 进制数 MOV CH, 4 MOV CL, 4 INPUT: SHL BX, CL ;将前面输入的数左移 4 位 MOV AH, 1 ;从键盘取数 INT 21H CMP AL, 30H ;<0 吗? JB INPUT ;不是‘0~F’的数重新输入 CMP AL, 39H ;是‘0~9’吗? JA AF ;不是,转‘A~F’的处理 AND AL, 0FH ;转换为:0000B~1001B JMP BINARY AF: AND AL, 1101 1111B ;转换为大写字母
DSEG SEGMENT COUNT EQU 20 ARRAY DW 20 DUP (?);存放数组 COUNT1 DB 0 ;存放正数的个数 ARRAY1 DW 20 DUP (?);存放正数 COUNT2 DB 0 ;存放负数的个数 ARRAY2 DW 20 DUP (?);存放负数 ZHEN DB 0DH, 0AH, ‘The positive number is:’, ‘$’;正数的个数是: FU DB 0DH, 0AH, ‘The negative number is:’, ‘$’;负数的个数是: CRLF DB 0DH, 0AH, ‘$’ DSEG ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG, DS: DSEG START: PUSH DS ;设置返回 DOS SUB AX, AX PUSH AX MOV AX, DSEG MOV DS, AX ;给 DS 赋值 BEGIN: MOV CX, COUNT LEA BX, ARRAY LEA SI, ARRAY1 LEA DI, ARRAY2 BEGIN1: MOV AX, [BX] CMP AX, 0 ;是负数码?
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
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 STRING1 DB ‘I am a student.’ STRING2 DB ‘I am a student!’ YES DB ‘MATCH’, 0DH, 0AH, ‘$’ NO DB ‘NO MATCH’, 0DH, 0AH, ‘$’ DSEG ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG, DS: DSEG, ES: DSEG START: PUSH DS ;设置返回 DOS SUB AX, AX PUSH AX MOV AX, DSEG MOV DS, AX ;给 DS 赋值 MOV ES, AX ;给 ES 赋值 BEGIN: LEA SI, STRING1 ;设置串比较指令的初值 LEA DI, STRING2 CLD MOV CX, STRING2 - STRING1 REPE CMPSB ;串比较 JNE DISPNO LEA DX, YES ;显示 MATCH JMP DISPLAY DISPNO: LEA DX, NO ;显示 NO MATCH DISPLAY: MOV AH, 9 ;显示一个字符串的 DOS 调用 INT 21H RET MAIN ENDP CSEG ENDS ;以上定义代码段 END START 5.5 试编写一程序,要求能从键盘接收一个个位数 N,然后响铃 N 次(响铃的 ASCII 码为 07)。 答:程序段如下:
相关文档
最新文档