代码转换汇编
- 格式:doc
- 大小:64.00 KB
- 文档页数:11
汇编代码.386将十进制按位转换成为二进制互相转化实验报告全文共四篇示例,供您参考第一篇示例:引言汇编语言是一种底层的计算机语言,它直接面向计算机的硬件和指令集架构。
在计算机科学领域中,对汇编语言的理解和掌握是非常重要的,因为它可以帮助程序员更深入地理解计算机系统的工作原理。
本文将围绕着汇编语言中的十进制到二进制的转换,展开一项实验报告,通过编写汇编代码.386实现十进制和二进制的相互转换,并对实验结果进行分析和总结。
实验目的1. 了解汇编语言中的数据处理、位操作等基本概念和指令;2. 掌握利用汇编语言将十进制数字转换为二进制数,并将二进制数转换为十进制数的方法;3. 加深对计算机底层原理的理解,提高汇编语言编程能力。
实验过程1. 十进制转为二进制我们使用汇编语言编写代码,将给定的十进制数字转换为二进制数。
我们可以选择一个整数N作为输入,然后使用位操作指令将其转换为对应的二进制数。
在汇编语言中,可以使用移位操作来实现这一转换。
我们可以将整数N的每一位通过移位操作得到对应的二进制位,直到整个数转换完成。
2. 二进制转为十进制接下来,我们利用汇编语言编写代码,实现将给定的二进制数转换为十进制数的功能。
对于一个二进制数,我们可以通过相应的位操作和乘法操作将其转换为对应的十进制数。
具体来说,我们可以取得二进制数的每一位,并将其乘以相应位数的权值,然后求和得到十进制数。
实验结果在实验过程中,我们成功地编写了汇编代码.386来实现十进制和二进制的相互转换。
通过实际的测试和验证,我们得到了正确的转换结果。
这证明了我们的汇编代码在功能上是正确的,能够准确地进行十进制和二进制之间的转换。
实验总结通过这次实验,我们深入探讨了汇编语言中的数据处理和位操作等基本概念。
我们不仅了解了如何使用汇编语言进行十进制和二进制的转换,还加深了对计算机底层原理的理解。
我们也发现了汇编语言在实现这种功能上的高效性和灵活性。
结论本次实验通过汇编代码.386将十进制按位转换成为二进制,并实现了二进制到十进制的互相转化。
keil c语言转汇编
在Keil C中,可以使用内置的编译器和调试器将C语言代码转换为汇编代码。
以下是将C语言代码转换为汇编代码的步骤:
1.打开Keil C并创建一个新的C项目。
2.在项目中创建一个C源文件(.c文件),并将的C代码写在这个文件中。
3.在Keil C的菜单栏中,选择“Project” > “Options for Target”。
4.在弹出的对话框中,选择“C/C++”选项卡。
5.在“C Compiler”下拉菜单中,选择要使用的编译器。
通常情况下,可以选择“ARM”或“C51”编译器,具体取决于的目标硬件。
6.在“Output”下拉菜单中,选择“Assemble only”选项。
这将指示编译器只生成汇编代码而不进行编译。
7.点击“OK”保存设置。
8.在Keil C的菜单栏中,选择“Project” > “Build Target”。
这将使用选定的编译器将的C代码编译为汇编代码。
9.编译过程完成后,打开生成的目标文件(.obj文件)。
10.在目标文件中,将找到已转换为汇编代码的C代码。
可以使用文本编辑器打开目标文件并查看其中的汇编代码。
请注意,转换后的汇编代码可能会被优化和重排,以适应目标硬件的要求。
因此,生成的汇编代码可能与在C源文件中编写的代码有所不同。
c++编译顺序c++编译顺序是指c++程序从源代码到可执行文件的转换过程中,各个源文件和目标文件的生成和处理的先后顺序。
c++程序一般由多个源文件(.cpp)和头文件(.h)组成,每个源文件都需要经过预处理(preprocess),编译(compile),汇编(assemble)和链接(link)四个阶段,才能最终生成可执行文件(.exe)。
不同的源文件之间可能存在依赖关系,比如一个源文件调用了另一个源文件中定义的函数或变量,或者一个源文件包含了另一个头文件中声明的内容。
因此,c++编译顺序需要考虑这些依赖关系,保证每个源文件在被处理之前,它所依赖的其他源文件或头文件已经被正确地处理过。
原理c++编译是基于c++程序的运行原理和编译器的工作原理。
c++程序的运行原理是基于计算机硬件和操作系统的,计算机只能执行机器语言指令,而操作系统负责加载可执行文件到内存,并调用入口函数开始执行。
因此,c++程序需要将人类可读的高级语言代码转换为机器可执行的二进制代码,并且按照操作系统规定的格式组织成可执行文件。
这个转换过程就是由编译器完成的。
编译器是一种软件,它可以将一种语言(源语言)翻译成另一种语言(目标语言)。
为了提高翻译效率和质量,编译器一般分为多个模块,每个模块负责完成一部分翻译工作,并生成中间结果。
这些中间结果可以是文本文件,也可以是二进制文件。
最后一个模块负责将所有中间结果合并成最终结果。
这些模块之间也有依赖关系,后面的模块需要使用前面模块生成的中间结果作为输入。
步骤c++编译可以分为四个阶段:预处理(preprocess),编译(compile),汇编(assemble)和链接(link)。
每个阶段都会生成对应的中间结果,并且有自己的工作内容和注意事项。
下面分别介绍每个阶段的具体内容。
预处理预处理是指对源代码进行一些文本替换和拷贝操作,以便于后续阶段进行语法分析和翻译。
预处理主要完成以下工作:-处理预处理指令(preprocessor directive),即以#开头的指令,比如#include, #define, #ifdef, #endif等。
北华航天工业学院课程设计报告(论文)设计课题:代码转换大小写字母转换专业班级:电子信息工程学生姓名:指导教师:设计时间: 2010-12-16北华航天工业学院电子工程系微机原理课程设计任务书指导教师:教研室主任:年月日内容摘要在课程设计之前,具备微机原理的理论知识和实践能力;熟悉汇编语言编程技术;熟悉80X86的CPU结构和指令系统;熟悉相关常用接口电路的设计使用方法是必不可少的。
因此原理部分重新温习并整理了相关知识。
课程设计要求进行大小写字母的转换。
其实字母大小写的区别在于他们的ASCII码范围,它们之间的转换其实就是加减相应的ASCII码值。
在判断输入的字母是大写的还是小写的(即判断输入符号ASCII码在41H~5AH还是在61H~7AH内)之后,决定判断是加上还是减去ASCII码值。
关键词:汇编代码转换大小写目录一、概述 (1)二、方案设计与论证 (1)1.汇编语言基础 (1)2.方案设计 (2)三、程序设计 (3)1.程序设计流程图 (3)2.程序代码 (4)四、运行结果 (5)五、心得体会 (6)六、参考文献 (6)一、概述:在计算机系统中有多种数制和编码,常用的数制有二进制、八进制以及十六进制,常用的代码有BCD码、ASCll码和七段显示码等。
这些数制和编码根据其作用的不同,在存储形式上也有差异。
在实际应用中,它们也因使用的要求不同而有所差异。
在配备操作系统管理程序的计算机中,有些代码转换程序已在系统管理软件中编好。
还有些代码转换需要根据使用要求通过编程完成。
因此,代码转换是非数据处理中最常见的情况。
二、方案设计:1、汇编语言基础汇编:计算机不能直接识别和执行汇编语言程序,而要通过“翻译”把源程序译成机器语言程序(目标程序)才能执行,这一“翻译”工作称为汇编。
汇编有人工汇编和计算机汇编两种方法。
汇编语言是面向机器的,每一类计算机分别有自己的汇编语言。
汇编语言占用的内存单元少,执行效率高,广泛应用于工业过程控制与检测等场合。
浅谈单⽚机中C语⾔与汇编语⾔的转换⼀、单⽚机课设题⽬要求与软件环境介绍做了⼀单⽚机设计,要⽤C语⾔与汇编语⾔同时实现,现将这次设计的感受和收获,还有遇到的问题写下,欢迎感兴趣的朋友交流想法,提出建议。
单⽚机设计:基于51单⽚机的99码表设计软件环境:Proteus8.0 + Keil4要求:1,开关按⼀下,数码管开始计时。
2,按两下,数码管显⽰静⽌。
3,按三下,数码管数值清零。
⼆、C语⾔程序1 #include<reg51.h>2#define uint unsigned int3#define uchar unsigned char4 uchar shi,ge,aa,keycount=0,temp;5 sbit anjian=P1^7;6 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};7void display(shi,ge);8void key ();9void init();10void delay(uint z);11/*-----主程序-----*/12void main()13 {14 init(); //初始化15while(1)16 {17 key ();18if(keycount==1)19 TR0=1; //开中断20if(keycount==2)21 TR0=0;22if(keycount==3)23 {24 temp=0;25 keycount=0;26 }27if(aa==10){aa=0;28if(temp<=99)29 {30 temp++;display(shi,ge);31 }32else33 temp=0;}34 }35 }363738/*------初始化程序-------*/39void init()40 {41 keycount=0;42 temp=0;43 TMOD=0x01;44 TH0=(65536-50000)/256;45 TL0=(65536-50000)%256;46 EA=1;47 ET0=1;48//TR0=0;49 }50/*-----定时器中断-----*/51void timer0() interrupt 152 {53 TH0=(65536-50000)/256;54 TL0=(65536-50000)%256;55 aa++;56 }57/*-----显⽰⼦程序-----*/58void display(shi,ge)59 {60 shi=temp/10;61 ge=temp%10;62 P0=table[shi];;delay(70);63 P2=table[ge]; ;delay(70);64 }65/*-----按键检测⼦程序-----*/66void key ()67 {68if(anjian==0)69 {70 delay(5); //消抖71if(anjian==0)72 keycount++;73 }74//while(anjian==0);75//display(shi,ge); //等待按键弹起76 }77/*-----延时⼦程序-----*/78void delay(uint z) //延时约1ms79 {80uint x,y;81for(x=z;x>0;x--)82for(y=100;y>0;y--);83 }电路仿真结果如下:三、C语⾔转汇编语⾔步骤好了,那么接下来我们就开始C语⾔——>汇编语⾔之旅(1)C语⾔1-10⾏改为1 ORG 0000H //汇编起始伪指令,功能是规定程序存储器中源程序或数据块存放的起始地址2 ajmp STAR //ajmp⽆条件跳转指令3 ORG 000bh4 ajmp timer05 anjian equ P1.7 //位定义6 keycount equ 40h7 shi equ 41h8 gewei equ 42h9 aa equ 43h10 temp equ 44h11tab: db 3fh,6h,5bh,4fh,66h //建表12 db 6dh,7dh,7h,7fh,6fh(2)C语⾔中的初始化函数 12-14⾏和39-49⾏改为1STAR:2 acall init //⼦程序近程调⽤指令,功能是主程序调⽤⼦程序,调⽤⼦程序的范围为2kb1init:2mov keycount,#0 //keycount=03mov temp,#0 //temp=14mov tmod,#01h //TMOD=0x015mov TH0,#606mov TL0,#1767setb EA //位置位指令,对操作数所指出的位进⾏置1操作8setb ET09setb TR010retacall为⼦程序近程调⽤指令,返回⽤ret。
gcc的四个步骤第一步:预处理预处理是GCC的第一个步骤,也是代码编译过程的第一步。
在预处理阶段,预处理器将根据一些特殊的预处理指令,对源代码进行一系列的处理,包括宏扩展、头文件包含、条件编译等等。
预处理的目的是提前处理一些不会因代码中的变化而改变的内容,为后续的编译步骤做准备。
预处理器首先会替换代码中的宏定义,将宏名称替换为其对应的宏代码。
然后进行头文件包含,将头文件中的内容插入到源文件中。
预处理器还会处理条件编译指令,根据条件对代码进行选择性编译。
最后生成一个经过预处理的中间文件,供下一步的编译使用。
第二步:编译编译是GCC的第二个步骤,也是代码编译过程的核心。
在编译阶段,编译器将预处理得到的中间文件进一步处理,将其转换为汇编语言代码。
编译器会对代码进行一系列的语法分析、语义分析、优化等操作,以保证代码的正确性和性能。
语法分析是指编译器对源代码进行词法分析和语法分析,将代码分解为基本的语法单元,并构建语法树。
语义分析是指编译器对语法树进行类型检查、语义检查等操作,确保代码的合法性和一致性。
优化是指编译器对代码进行一系列的优化操作,以提高代码的执行效率。
编译器将经过处理的代码转换为汇编语言代码,并生成一个汇编语言文件,作为下一步的汇编过程的输入。
第三步:汇编汇编是GCC的第三个步骤,也是代码编译过程的重要一环。
在汇编阶段,汇编器将编译得到的汇编语言文件进行处理,将其转换为机器码或者可重定位文件。
汇编器将汇编语言代码按照特定的指令格式和地址方式进行翻译,生成与特定处理器架构相兼容的机器码。
汇编器首先会解析汇编语言指令,将其转换为二进制机器码指令。
然后将地址符号转换为实际地址,生成指令和数据的链接关系。
最后生成一个与目标处理器兼容的机器码文件或可重定位文件。
第四步:链接链接是GCC的最后一个步骤,也是代码编译过程的最后一环。
在链接阶段,链接器将多个汇编产生的可重定位文件进行处理,将其合并成一个单一的可执行文件。
实验二:二进制到BCD码转换学生姓名:何茂杰学号:2010305104 专业班级:计算机本科一班指导老师:文远熔实验日期:实验成绩:一、实验目的1.掌握无条件转移指令、条件转移指令;2.掌握利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的方法;3.掌握直接向视频RAM送ASCII码进行屏幕显示的方法;4.掌握屏幕字符显示程序编写与调试。
二、实验内容将存放在BIN的一个16位无符号数转换为BCD码,结果的万、千,百、十、个位依次存放在BCD+0、BCD+1、BCD+2、BCD+3、BCD+4单元内三、实验环境PC微机DOS操作系统或Windows 操作系统四、实验要求对操作数的寻址、转换方法至少要由两种以上。
五、主要实验步骤及结果1.直接向VRAM送ASCII码显示字符(1)用A命令在100H处键入下列程序MOV AX,B000MOV DS,AXXOR AL,ALXOR BX,BXMOV CX,100LOP:MOV [BX],ALINC BXINC ALPUSH CXMOV CX,8DELY:PUSH CXMOV CX,0J:LOOP JPOP CXLOOP DELYPOP CXLOOP LOPINT 20(2)用N命令和W命令将此程序存入文件中。
(一定要先存入!)(3)用G命令运行此程序,仔细观察每一个ASCII码显示结果,并和字符表及上一道程序运行情况进行对照,其控制字符区(07-0DH)显示结果和INT 21H 2号功能调用有何不同?控制字符区在该程序中没有显示,在上一个程序中显示为笑脸等符号。
(4)自编程序:将存放在BIN的一个16位无符号数转换为BCD码反汇编;-U10013A3:0100 BB0010 MOV BX,100013A3:0103 8B07 MOV AX,[BX]13A3:0105 BB0000 MOV BX,000013A3:0108 BA0000 MOV DX,000013A3:010B BB0A00 MOV BX,000A13A3:010E F7F3 DIV BX13A3:0110 A21310 MOV [1013],AL13A3:0113 89161410 MOV [1014],DX13A3:0117 BB6400 MOV BX,006413A3:011A F7F3 DIV BX13A3:011C A21210 MOV [1012],AL13A3:011F 89D0 MOV AX,DX执行情况:-t=100AX=0000 BX=1000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=13A3 ES=13A3 SS=13A3 CS=13A3 IP=0103 NV UP EI PL NZ NA PO NC 13A3:01038B07 MOV AX,[BX] DS:1000=0000六、思考题利用INT 21H 显示和直接向VRAM送ASCII码显示方法在显示结果上有什么不同?答:利用INT 21H显示时,07H-0DH的控制符会用笑脸之类的符号显示;直接向VRAM 送ACSII码时,07H-0DH的控制符不显示。
build 用法
“build”在C语言中通常用于与程序的编译过程相关的操作。
在开发过程中,在写好C代码后,需要将代码编译成可执行的程序,以便在计算机上运行。
这个编译过程就是“build”。
“Build”过程主要包括以下步骤:
1. 预处理(Preprocessing):处理代码中的预处理指令,比如宏定义和条件编译等。
预处理器会根据预处理指令对源文件进行替换和处理。
2. 编译(Compilation):将预处理后的源文件转换为汇编代码。
3. 汇编(Assembly):将汇编代码转换为机器码或可重定位目标文件,这些文件包含了可以在计算机上执行的二进制指令。
4. 链接(Linking):将多个目标文件以及可能需要的库文件(如标准库)合并在一起,生成最终的可执行文件。
链接器会解决符号引用、地址重定位等问题。
通过“build”,我们可以将C代码转换为可执行的二进制文件,以便在计算机上运行和测试程序。
编译过程中的错误和警告也会被报告出来,方便开发者进行调试和修复。
c语言编译C语言是一种通用的高级编程语言,由美国计算机科学家丹尼斯·里奇于1972年在贝尔实验室开发。
C语言具有简洁、高效、可移植等特点,被广泛应用于系统软件、嵌入式软件、游戏开发、科学计算等领域。
C语言的编译过程是将源代码转换为可执行文件的过程,下文将详细介绍C语言的编译过程。
一、C语言的编译过程C语言的编译过程包括预处理、编译、汇编和链接四个阶段。
下面分别介绍这四个阶段的作用和实现方式。
1. 预处理预处理阶段是在编译之前进行的,其作用是将源代码中的预处理指令替换为实际的代码。
预处理指令以#号开头,包括#include、#define、#ifdef、#ifndef等指令。
预处理器将这些指令替换为实际的代码,生成一个新的源文件。
预处理后的源文件通常以.i作为扩展名。
2. 编译编译阶段是将预处理后的源代码转换为汇编代码的过程。
编译器将C语言源代码转换为一种称为中间代码的形式,中间代码是一种类似汇编语言的低级语言。
中间代码具有平台无关性,可以在不同的平台上进行优化和执行。
编译后的结果通常以.s作为扩展名。
3. 汇编汇编阶段是将编译生成的汇编代码转换为机器代码的过程。
汇编器将汇编代码转换为可执行的机器代码,并生成一个目标文件。
目标文件包括可执行代码、数据段、符号表等信息。
目标文件通常以.o 或.obj作为扩展名。
4. 链接链接阶段是将多个目标文件合并为一个可执行文件的过程。
链接器将目标文件中的符号和地址进行解析,生成一个可执行文件。
可执行文件包括操作系统可以直接执行的代码和数据,通常以.exe、.dll 或.so作为扩展名。
二、C语言编译器C语言编译器是将C语言源代码转换为可执行文件的工具,包括预处理器、编译器、汇编器和链接器四个部分。
C语言编译器可以在不同的平台上运行,生成可在目标平台上运行的可执行文件。
下面分别介绍常用的C语言编译器。
1. GCCGCC(GNU Compiler Collection)是一款开源的C语言编译器,由GNU组织开发。
反汇编c代码反汇编C代码是将C代码转换成相应的汇编代码的过程。
可以使用工具如IDA Pro、objdump等来进行反汇编操作。
以下是一个示例的C代码及其反汇编结果:```c#include <stdio.h>int main() {int a = 5;int b = 10;int c = a + b;printf("The sum of %d and %d is %d\n", a, b, c);return 0;}```反汇编结果:```Disassembly of section .text:0000000000401000 <main>:401000: 55 push %rbp401001: 48 89 e5 mov %rsp,%rbp401004: c7 45 fc 05 00 00 00 movl $0x5,-0x4(%rbp)40100b: c7 45 f8 0a 00 00 00 movl $0xa,-0x8(%rbp)401012: 8b 55 f8 mov -0x8(%rbp),%edx401015: 8b 45 fc mov -0x4(%rbp),%eax401018: 01 d0 a dd %edx,%eax40101a: 89 45 f4 mov %eax,-0xc(%rbp)40101d: 8b 45 f4 mov -0xc(%rbp),%eax401020: 89 c6 mov %eax,%esi401022: bf 00 00 00 00 mov $0x0,%edi401027: b8 00 00 00 00 mov $0x0,%eax40102c: e8 df ff ff ff callq 401010 <printf@plt>401031: b8 00 00 00 00 mov $0x0,%eax401036: c9 leaveq401037: c3 retq```这里展示了`main`函数的反汇编结果。
二进制编码的十进制数,简称BCD码(Binarycoded Decimal). 这种方法是用4位二进制码的组合代表十进制数的0,1,2,3,4,5,6 ,7,8,9 十个数符。
4位二进制数码有16种组合,原则上可任选其中的10种作为代码,分别代表十进制中的0,1,2,3,4,5,6,7,8,9 这十个数符。
最常用的BCD码称为8421BCD码,8.4.2.1 分别是4位二进数的位取值。
点击此处将给出十进制数和8421BCD编码的对应关系表。
1、BCD码与十进制数的转换BCD码与十进制数的转换.关系直观,相互转换也很简单,将十进制数75.4转换为BCD码如:75.4=(0111 (0101.0100)BCD 若将BCD码1000 0101.0101转换为十进制数如: (1000 0101.0101)BCD=85.5注意:同一个8位二进制代码表示的数,当认为它表示的是二进制数和认为它表示的是二进制编码的十进制数时,数值是不相同的。
例如:00011000,当把它视为二进制数时,其值为24;但作为2位BCD码时,其值为18。
又例如00011100,如将其视为二进制数,其值为28,但不能当成BCD码,因为在8421BCD 码中,它是个非法编码 .2、BCD码的格式计算机中的BCD码,经常使用的有两种格式,即分离BCD码,组合BCD码。
所谓分离BCD码,即用一个字节的低四位编码表示十进制数的一位,例如数82的存放格式为:_ _ _1 0 0 0 _ _ _ _0 0 1 0 其中_表示无关值。
组合BCD码,是将两位十进制数,存放在一个字节中,例82的存放格式是1000 0010 3、BCD码的加减运算由于编码是将每个十进制数用一组4位二进制数来表示,因此,若将这种BCD码直接交计算机去运算,由于计算机总是把数当作二进制数来运算,所以结果可能会出错。
例:用BCD码求38+49。
解决的办法是对二进制加法运算的结果采用"加6修正,这种修正称为BCD调整。
即将二进制加法运算的结果修正为BCD码加法运算的结果,两个两位BCD数相加时,对二进制加法运算结果采用修正规则进行修正。
修正规则:(1)如果任何两个对应位BCD数相加的结果向高一位无进位,若得到的结果小于或等于9,则该不需修正;若得到的结果大于9且小于16时,该位进行加6修正。
(2)如果任何两个对应位BCD数相加的结果向高一位有进位时(即结果大于或等于16),该位进行加6修正.(3)低位修正结果使高位大于9时,高位进行加6修正。
下面通过例题验证上述规则的正确性。
用BCD码求35+21 BCD码求25+37 用BCD码求38+49 用BCD码求42+95用BCD码求91+83 用BCD码求94+7 用BCD码求76+45两个组合BCD码进行减法运算时,当低位向高位有借位时,由于"借一作十六"与"借一作十"的差别,将比正确的结果多6,所以有借位时,可采用"减6修正法"来修正.两个BCD码进行加减时,先按二进制加减指令进行运算,再对结果用BCD调整指令进行调整,就可得到正确的十进制运算结果。
实际上,计算机中既有组合BCD数的调整指令,也有分离BCD数的调整指令。
另外,BCD码的加减运算,也可以在运算前由程序先变换成二进制数,然后由计算机对二进制数运算处理,运算以后再将二进制数结果由程序转换为BCD码131 将ASCII码表示的十进制数转换为二进制数汇编代码1.将ASCII码表示的十进制数转换为二进制数十进制数可以表示为:Dn×10n+Dn-1×10n-1+…+D0×100=Di×10i 其中Di代表十进制数1、2、3…9、0。
上式可以转换为:ΣDi×10i=((…(Dn×10+Dn-1)×10)+Dn-2)×10+…+D1)×10+D0由上式可归纳十进制数转换为二进制的方法:从十进制数的最高位Dn开始作乘10加次位的操作,依次类推,则可求出二进制数结果。
本实验要求将缓冲区中的一个五位十进制数00012的ASCII码转换成二进制数,并将转换结果按位显示在屏幕上。
;***********************************************************************data SEGMENT ;定义数据段msg DB ' hua xian asks you to input ASCLL numbers:$'msg2 DB 0DH,0AH,'OverFlow!!$',0DH,0AHmsg3 DB 0DH,0AH,'The Binary number:$'array DW 100 dup(0)TEN DW 10TAB DB 4data ENDS;*********************************************************************** STACK SEGMENT PARA STACK ;定义堆栈段DW 64 DUP(?)STACK ENDS;***********************************************************************code SEGMENT ;定义代码段;-------------------------------------------------------------------MAIN PROC FARASSUME CS:code,DS:data,SS:STACKMOV AX,data ;data送到DS中MOV DS,AXLEA DX,msg ;输出要求MOV AH,9HINT 21HLEA BX,array ;array数组的地址传送到BX中SUB CX,CX ;使CX = 0CALL INPUT ;调用INPUT子程序CALL CONVERT ;调用CONVERT子程序PUSH AX ;保护AX中的数据因为AX中的数据有用,但在此后又;必须用到axLEA DX,msg3 ;输出“The Binary number:”MOV AH,9H ;INT 21H ;中断POP AX ;返回受保护的AX中的数据CALL DISPLAY ;输出二进制数OUT0:MOV AX,4C00h ;返回DOSINT 21hMAIN ENDP;-------------------------------------------------------------------INPUT PROC NEARWAIT_HERE:MOV AH,7 ;等待输入INT 21HCMP AL,0DH ;是否是回车键JE OUT1 ;如果是则跳转道OUT1否则继续执行CMP AL,'0' ;AL < '0'?JL WAIT_HERE ;如果是则跳转到WAIT_HERE否则继续执行CMP AL,'9' ;AL > '9'?JG WAIT_HERE ;如果是则跳转到WAIT_HERE否则继续执行MOV [BX],AL ;把键盘输入的数字送到array[bx]中ADD BX,2 ;增加bx的值,能够使得下一个数存放到array 数组中的下;一个位置, 因为是字节型所以加2INC CX ;增加计数器的值MOV AH,2H ;输出刚刚输入的数字,若不是数字则永远不会到此步MOV DL,AL ;dl中存放要显示的值INT 21H ;中断JMP WAIT_HERE ;显示完后跳转到WAIT_HEREOUT1:ret ;退出次过程INPUT ENDP;-----------------------------------------------------------------CONVERT PROC NEARSUB CX,1 ;计数器减1LEA BX,array ;bx为array数组的首地址MOV AX,[BX] ;把数组中的值送到ax中SUB AX,30H ;减30h是将ascll码转换为十进制数CMP CX,0 ;如果仅仅输入了一个数字则跳出JE OUT3LOOP1: ;否则就开始运行MUL TEN ;把刚才的十进制数*10,再加下一位数ADD BX,2ADD AX,[BX]SUB AX,30HLOOP LOOP1OUT3:retCONVERT ENDP;-----------------------------------------------------------------DISPLAY PROC NEARMOV BX,AX ;ax中存放着答案,但是因为后面要用到ax所以把值放到;bx中MOV CX,16 ;计数器设置为16MOV AH,2H ;为输出作准备此处用到ax,若不做上面的处理LOOP2:ROL BX,1 ;把bx左移1位,若有进位cf=1JC PRINT1 ;监测cf如果是1,则跳转道print1MOV DX,'0' ;到这说明他不是,则把‘0’送入dx.dx为输出的内容JMP PRINT0 ;然后跳转道print0PRINT1:MOV DX,'1'PRINT0:PUSH AX ;判断如果cx能被4整除,则输出空格PUSH DX ;这里是保护ax dx cx让他们进栈。
PUSH CXMOV AL,CLDIV TABCMP AH,0JNE OUT4MOV AH,2HMOV DX,' 'INT 21HOUT4:POP CXPOP DXPOP AX ;栈的特点是先进后出,所以要反序出栈INT 21H ;中断,跳转到dos所提供的功能,输出LOOP LOOP2 ;cx-1 然后进行循环,直到cx==0终止; LEA BX,array;LOOP2:; MOV DX,[BX]; MOV AH,2H ;print the number; INT 21H; INC BX; LOOP LOOP2retDISPLAY ENDP;-------------------------------------------------------------------code ENDSEND MAIN2 十进制ASCII码转BCD码code segmentassume cs:codestart:push cspop dsmov dx,offset tipsmov ah,9int 21hmov si,3500h;十进制ASCII存于3500H起单元mov di,350ah;BCD后再存于350AH起内存mov cx,10;只够输入10个字符Q0:mov ah,1int 21hcmp al,'0'jb Q1cmp al,'9'ja Q1mov [si],alsub al,30hmov [di],aljmp Q2Q1:mov al,0ffhmov [si],almov [di],alQ2:inc siinc diQ3:loop Q0mov ah,0int 16hmov ah,4chint 21htips db 'Press any key...',0dh,0ah,'$'code endsend start3从键盘输入一个16进制数,转换成十进制数然后输出,汇编程序实现DATA SEGMENTDATA1 DB ?DATA2 DB 2 DUP(?)DATA20 DB 2 DUP(?)DATA3 DB 'Input Error, Please Enter Again!','$'DATA ENDSSTACK SEGMENTDB 5 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV BX,0INPUT:MOV AH,01HINT 21HCMP AL,51H;判断输入的字符是否为QJE EXIT ;如果是Q就退出CMP AL,71H;判断输入的字符是否为qJE EXIT ;如果是Q就退出PUSH AX ;把从键盘输入的字符的ASCII存到堆栈段SUB AL,30H ;判断是否为数字CMP AL,00HJL INDI ;如果不是就提示错误CMP AL,09H ;MOV BL,AL ;JLE OUTPUT2;如果是数字就输出POP AX ;把AL的值取出来PUSH AX ;MOV BL,ALSUB AL,41H;判断是否为大写字母A到FCMP AL,00HJL INDI ;如果不是就提示错误CMP AL,06HJL CHANGEPOP AXPUSH AXMOV BL,ALSUB AL,61H;判断是否为小写字母a到fCMP AL,00HJL INDI ;如果不是就提示错误CMP AL,06HJL CHANGEPOP AXJMP INDICHANGE:MOV SI,0MOV DI,0MOV CL,4MOV AL,BLAND AL,11011111B;统一换为大写字母再转换,如果是大写字母就不变SUB AL,31HMOV BL,ALAND AL,0FH ;与运算,取低位MOV [DATA2+SI],AL ;把个位数存到DATA2中MOV AL,BLSAR AL,CL ;算术右移,取高位MOV[DATA20+DI],AL;把十位数存到DATA20中OUTPUT1: MOV DL,48H;输出十六进制符号HMOV AH,02HINT 21HMOV DL,3DH ;输出等号‘=’MOV AH,02HINT 21HMOV DL,[DATA20+DI];输出十位数ADD DL,30HMOV AH,02HINT 21HMOV DL,[DATA2+SI];输出个位数ADD DL,30HMOV AH,02HINT 21HMOV DL,20HMOV AH,02HINT 21HJMP INPUT;跳到输入数字OUTPUT2: MOV DL,48H ;输出数字MOV AH,02HINT 21HMOV DL,3DHMOV AH,02HINT 21HMOV DL,BLADD DL,30HMOV AH,02HINT 21HMOV DL,20HMOV AH,02HINT 21HJMP INPUTINDI:MOV DL,20H ;提示子程序MOV AH,02HINT 21HMOV DX,OFFSET DATA3 ;显示提示信息MOV AH,09HINT 21HJMP INPUTEXIT:MOV AH,4CHINT 21HCODE ENDSEND START4 用汇编语言将BCD码转换成二进制码,并以二进制串的形式输出,在屏幕上显示出来DATAS SEGMENTbuffer1 dw 1657hbuffer2 dw ? ;分配两个字节的空间DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXmov ax,[buffer1]and ax,0f000hmov cl,12shr ax,clmov dx,ax ;至此,已将5678h(BCD)中的5(十进制)取出,并放入dx中call change ;调用chang,将5乘以10mov ax,dxmov bx,[buffer1]and bx,0f00hmov cl,8shr bx,cladd ax,bxmov dx,axcall changemov ax,dxmov bx,[buffer1]and bx,00f0hmov cl,4shr bx,cladd ax,bxmov dx,axcall changemov ax,dxmov bx,[buffer1]and bx,000fhadd ax,bx ;至此,ax中的值已是5678(十进制),但电脑是将其以二进制的形式存储的,故应是0679h,二进制就是0000011001111001mov buffer2,ax ;因为后面会用到ah,为避免在其过程中丢失ax中的数据,故将ax中的数据放入buffer2中mov cx,16again:shl buffer2,1 ;将已经转换成二进制的数逐个显示出来mov dl,0adc dl,30hmov ah,2int 21hloop againMOV AH,4CHINT 21Hchange proc ;子程序change的功能是实现dx乘以10 add dx,dxmov cx,dxadd dx,dxadd dx,dxadd dx,cxretchange endpCODES ENDSEND START。