2024年10月汇编语言程序的实例(什么是汇编语言!例子!~)

 更新时间:2024-10-12

  ⑴汇编语言程序的实例(什么是汇编语言!例子!~

  ⑵什么是汇编语言!例子!~

  ⑶汇编语言(AssemblyLanguage)是面向机器的程序设计语言。在汇编语合中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址妈。这样用符号代替机器语盲的二进制码,就把机器语音变成了汇编语言。于是汇编语言亦称为符号语言。汇编语言比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。例如:START:INAL,HMOVBL,ALINAL,HMOVCL,ALMOVAX,ADLOP:ADDAL,BLADCAH,DELJNZADLOPHLT

  ⑷求一个汇编语言程序实例(MASMforwindows环境下

  ⑸;统计BUF中正数的个数;分析:每个元素是一个位有符号二进制数,因此要判断其是否为正数,;需选择带符号数条件转移指令进行判断转移(例如JG,JNG,JL,JNL)。;由于共有n个元素,因此整个程序的结构就是对以上判断重复n次.ASSUMECS:CODE,DS:DATADATASEGMENTBUFDB,,,,,,,-,-,NEQU$-BUF;计算BUF中元素的个数COUNTDW?DATAENDSCODESEGMENTSTART:MOVAX,DATAMOVDS,AXLEABX,BUF;取BUF的偏移地址,然后赋值给BXMOVCX,N;BUF中元素的个数,赋值给CXMOVAX,;AX存放正数的个数NEXT:CMPbyteptr,JNGLESS;小于或等于,跳转INCAXLESS:INCBX;指向下一个元素LOOPNEXTMOVCOUNT,AXMOVAX,CHINTHCODEENDSENDSTART流程图:

  ⑹用汇编语言编写一个简单程序

  ⑺计算U=(X+(Y*Z-))/W其中:X,Y,Z,W均为十六位有符号数。程序如下:DATASEGMENTXDW;位变量YDWZDWWDWUDW?,?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,YIMULZ;计算Y*Z,内容放在DX,AX中MOVCX,AXMOVBX,DXSUBCX,;计算Y*Z-SBBBX,MOVAX,XCWD;将X符号扩展,形成DX:AX中的双字ADDAX,CX;计算X+(Y*Z-),内容放在DX,AX中ADCDX,BXIDIVW;计算(X+(Y*Z-))/WMOVU,AXMOVU+,DXMOVAH,CHINTHCODEENDSENDSTART

  ⑻汇编语言程序设计实例

  ⑼第一题:movcl,movch,next:dehjeexitmovbx,shlax,rolbx,cmpbx,jznextinljmpnextexit:movah,chinth第二题:movcx,movsi,offsetbuffernext:movbx,wordptrincbxmovwordptr,bxincsiincsiloopexitjmpnextexit:movah,chinth

  ⑽判断双字的高位字是不是,如果不是,直接返回(清除进位标志(将低字求反,然后+(将进位保存起来(将高位字求反,加上刚才的进位--------------XXXX:MOVAX,X+;取X的高位字CMPAX,JBX_EXIT;是正数就跳转MOVAX,X;取X的低位字XORAX,FFFFH;取反ADDAX,PUSHFMOVX,AXMOVAX,X+;取X的高位字XORAX,FFFFH;取反POPFADCAX,MOVX+,AXX_EXIT:RET

  ⑾谁给我写一个最简单的汇编语言程序

  ⑿............上来就是LCD人家看得懂么......HAJMPMAINHMAIN:MOVP,#HMOVP,#HMOVP,#HMOVP,#HACALLDELMOVP,#FFHMOVP,#FFHMOVP,#FFHMOVP,#FFHACALLDELAJMPMAINHDEL:MOVR,#HDEL:MOVR,#FFHDEL:MOVR,#FFHDEL:DJNZR,DELDJNZR,DELDJNZR,DELretend给新手的新手注释:H表示地址mov是赋值的含义R,R.....是寄存器,main相当于C语言中主函数,是程序的入口H~H一般用于存放中断函数无条件跳转语句(即为AJMP,SJMP,LJMP,者无条件跳转的地址量有限,LJMP最大(Kbyte空间内语句可跳转,SJMP最小(-H~+H,AJMP为KByte无条件跳转DEL在该程序中表示延时函数,首先对寄存器R,R,R赋值,R*R*R*机器周期为延时时间【机器周期:MHZ晶振=usMHZ=us】执行完DEL中的MOV后执行的是DJNZ命令,相当于C中i--,不同的是若i--!=,则跳转到中(所代表的自定义函数{PS:DEL~DEL均是是自定义函数,在延时函数里,为了达到延时值,一般都象我所写的那样DEL:DJNZR...,DEL这样,i--后又跳回来...,注意,在这里DEL,DEL,...DEL合起来叫做延时函数}END表程序结束符(必须有ACALL是表示调用子程序(这里,子函数是延时函数DEL。。。。。与RET配套RET表返回调用子程序处另外,该函数P的点亮反映了共阴极合共阳极的不同,共阳极是MCU(即为单片机接上若干发光二极管,并接电源V=+V,如此一来,共阳极熄灭整个一组端口FFH,点亮整个一组端口为H共阴极熄灭与点亮与共阳极恰起相反,因为共阴极MCU接上发光二极管后(从电路图看发光二极管上那一小竖道要面向GND而不是像共阳极那样面向MCU,当然在实际上也要注意接法的正负接GND

  ⒀汇编语言,举一个例子,CX为零时,结束程序

  ⒁以下是从键盘输入一个一位数的程序,赋值给CX,输入等于则什么都不做,不等于则输出“cx!=”,经调试通过DATASEGMENTIN_ADB’INPUT:CX=’,’$’OUT_ADB’OUTPUT:CX!=’,’$’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARMOVAX,DATAMOVDS,AXMOVAH,;输出“CX=“LEADX,IN_AINTHMOVAH,;从键盘输入一个数字赋值给CXINTHXORAH,AH;清零AHMOVCX,AXSUBCX,H;需要将从键盘接受的字符的ASCII码转为数字(ASCII码=数字+HMOVAH,;设置光标位置行列MOVBH,MOVDH,MOVDL,INTH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CMPCX,;比较CX和的大小JEEXIT;相等则跳转到EXIT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MOVAH,;CX不等于才会执行该语句,输出CX!=LEADX,OUT_AINTHEXIT:;CX=程序什么都不做直接退出MOVAX,CHINTHMAINENDPCODEENDSENDMAIN

  ⒂用汇编语言编一个程序,要求如下:

  ⒃用十进制形式显示字符位置的代码如下:DSEGSEGMENTmsgidb“pleaseinputastring:$“;显示信息,提示输入一串字符bufdb,tabledbdup(?);输入字符串缓冲区msgddbdh,ah,“thelocationis:$“;显示信息,提示所在位置DSEGENDSCSEGSEGMENTassumecs:CSEG,ds:DSEG,es:DSEGMAINPROCFAR;主程序入口movax,dsegmovds,axmoves,axleadx,msgi;显示信息,提示输入一串字符movah,inthleadx,buf;输入字符串movah,ahinthleasi,bufmovcl,;输入字符实际个数存入CX中movch,leadi,table;输入字符起始地址存入DImoval,h;要查找的字符送ALcld;置方向标志为地址增量repnzscasbjnztjleadx,msgd;显示信息,提示所在位置movah,inthsubdi,offsettablemovbx,dicalldisp;用十进制形式显示位置tj:movah,;按任意键退出inthmovax,ch;程序结束,返回到操作系统系统inthMAINENDPdispproearmovcx,dcalldec_divmovcx,dcalldec_divmovcx,dcalldec_divmovcx,dcalldec_divmovcx,dcalldec_divretdec_divproearmovax,bxmovdx,divcxmovbx,dxmovdl,aladddl,hmovah,inthretdec_divendpdispendpCSEGENDSENDMAIN

  ⒄SRT:MOVA,RMOVR,ASRT:CLRFMOVA,RDECAMOVR,AMOVR,AJZSRTMOVA,RMOVR,ASRT:MOVA,RMOVR,AINCRMOVA,RMOVR,ACLRCSUBBA,RJNCSRTSETBFMOVA,RMOVR,ADECRMOVA,RMOVR,AINCRSRT:DJNZR,SRTMOVA,RMOVR,AJBF,SRTSRT:RETEND比如上面的这个例子,采用某种计算机的汇编指令写出来的实现某个功能的程序。打字不易,如满意,望采纳。

  ⒅伪指令伪指令是对汇编起某种控制作用的特殊命令,其格式与通常的操作指令一样,并可加在汇编程序的任何地方,但它们并不产生机器指令。许多伪指令要求带参数,这在定义伪指令时由“表达式”域指出,任何数值与表达式匀可以作为参数。不同汇编程序允许的伪指令并不相同,以下所述的伪指令仅适用于MASM51系统,但一些基本的伪指令在大部份汇编程序中都能使用,当使用其它的汇编程序版本时,只要注意一下它们之间的区别就可以了。MASM51中可用的伪指令有:设置程序起始地址END标志源代码结束EQU定义常数SET定义整型数DATA给字节类型符号定值BYTE给字节类型符号定值WROD给字类型符号定值BIT给位地址取名ALTNAME用自定义名取代保留字DB给一块连续的存储区装载字节型数据DW给一块连续的存储区装载字型数据DS预留一个连续的存储区或装入指定字节。INCLUDE将一个源文件插入程序中TITLE列表文件中加入标题行NOLIST汇编时不产生列表文件NOCODE条件汇编时,条件为假的不产生清单一、伪指令用于为在它之后的程序设置地址值,它有一个参数,其格式为:表达式表达式可以是一个具体的数值,也可以包含变量名,如果包含变量名,则必须保证,当第一次遇到这条伪指令时,其中的变量必须已有定义(已有具体的数值,否则,无定义的值将由替换,这将会造成错误。在列表文件中,由定义的指令地址会被打印出来。指令有什么用途呢?指令被翻译成机器码后,将被存入系统的ROM中,一般情况下,机器码总是一个接一个地放在存储器中,但有一些代码,其位置有特殊要求,典型的是五个中断入口,它们必须被放在H,BH,H,BH和H的位置,否则就会出错,如果我们编程时不作特殊处理,让机器代码一个接一个地生成,不能保证这些代码正好处于这些规定的位置,执行就会出错,这时就要用到伪指令了。看如下例子:例:INT_EQUHTIME_EQUHINT_EQUHTIME_EQUHSERIALEQUHAJMPSTART;跳转到主程序起始点LJMPINT_;外中断处理程序LJMPTIME_;定时中断处理程序LJMPINT_;外中断处理程序LJMPTIME_;定时中断处理程序LJMPSERIAL;串行口中断程序START:NOPEND上面的程序经汇编后列表文件如下:TheCybericMicroSystemsFamilyAssembler,Version.Page--=INT_EQUH=TIME_EQUH=INT_EQUH=TIME_EQUH=SERIALEQUHAJMPSTART;跳转到主程序起始点LJMPINT_;外中断处理程序LJMPTIME_;定时中断处理程序LJMPINT_;外中断处理程序BLJMPTIME_;定时中断处理程序ELJMPSERIAL;串行口中断程序START:NOPENDTheCybericMicroSystemsFamilyAssembler,Version.Page--;%TSymbolNameTypeValueINT_.............IINT_.............ISERIAL.............ISTART.............LTIME_.............ITIME_.............I;%ZErrors()由列表文件,可以绘出代码在ROM中的映象图如下:代码HHHHHHHHHHH地址HHHHHHHHHHAH代码HHHHHHH地址BHCHDHEHFHHHHHH由上面的映象图可知,在03H处的代码为10H,而不是我们要的02H,所以外断程序INT_0不能被正确执行,其它各中断程序的情况同样如此,如在0BH处,本来存放的应当是定时器0中断程序,但按上述的映象图,0BH处开始的3个代码是:02H,10H,30H,这是定时器1的入口地址,所以,如果定时器0发生中断,所执行的其实是定时器1的中断程序,这当然不对。例2:INT_EQUHTIME_EQUHINT_EQUHTIME_EQUHSERIALEQUHAJMPSTART;跳转到主程序起始点HLJMPINT_;外中断处理程序BHLJMPTIME_;定时中断处理程序HLJMPINT_;外中断处理程序BHLJMPTIME_;定时中断处理程序HLJMPSERIAL;串行口中断程序START:NOPEND上面的程序经过汇编后列表文件如下:TheCybericMicroSystemsFamilyAssembler,Version.Page--=INT_EQUH=TIME_EQUH=INT_EQUH=TIME_EQUH=SERIALEQUHAJMPSTART;跳转到主程序起始点HLJMPINT_;外中断处理程序BBHBLJMPTIME_;定时中断处理程序HLJMPINT_;外中断处理程序BBHBLJMPTIME_;定时中断处理程序HLJMPSERIAL;串行口中断程序START:NOPENDTheCybericMicroSystemsFamilyAssembler,Version.Page--;%TSymbolNameTypeValueINT_.............IINT_.............ISERIAL.............ISTART.............LTIME_.............ITIME_.............I;%ZErrors()由列表文件,可以绘出代码在ROM中的映象图如下:代码HHHHH地址HHHHHHHHHHAH代码HHHHHH地址BHCHDHEHFHHHHHHH代码HHH地址HHHHAHBHCHDHEHFHH代码HHHH地址HHHHHHHHHAHBH由映象图可知,各中断程序的代码都在其规定地址处,一旦产生中断即可执行相应的程序。至于图中未填的部分(如H),根据各编程器不同而不同,一般为FFH或H。二、ENDEND语句标志源代码的结束,汇编程序遇到END语句即停止运行。若没有END语句,汇编将报错。END语句有一个参数,可以是数值,也可以是表达式,其格式是:标号:END表达式它的值就是程序的地址并且作为一个特殊的记录写入HEX文件。若这个表达式省略,HEX文件中其值就是。三、EQUEQU以及其它一些符号定义伪指令用来给程序中出现的一些符号赋值。对这些符号名的要求与其它符号相同,即长度不限,大小写字母可互换并且必须以字母开头。由等值指令定义的符号是汇编符号表的一部分。等值伪指令有两种形式。一种用EQU,另一种用字符“=”即符号名EQU表达式符号名=表达式两种形式的效果是一样的。符号名在左边,其对应的值在右边。值可以是变元,其它的符号名或表达式。只要在两遍扫描中求出表达式的值就行,否则引用该符号名时将报错。当表达式的值是字符串时,只取后两个字符。若串长为,高位字节被置,符号名的值被打印在程序清单中。由等值伪指令定义的符号名不允许重名。如果经定义的符号名被重定义,则汇编将报出错,并且这个符号名按新定义的处理,最好不要在程序中出现重名。例:=ABCEQUH=XYEQUABC-F=JK=XYJK=XY+JK在列表文件中最左边的数字不是这些伪指令所在的地址而是通过汇编后赋给符号名的值。第一条符号名ABC被起来H,第二条XY被赋于ABC-,因此XY的值为H-=H,JK的值为(即FH),XYJK的值XY+JK=H+FH=H四、SETSET伪指令有些类似于等值伪指令,它定义了一个整数类型的符号名,它的格式为符号名SET表达式SET伪指令与等值伪指令的唯一区别在于SET伪指令所定义的符号名右以在程序中多次定义,而不报错。例:D=KSETB=KSET五、DATA与BYTEDATA与BYTE都是用来定义字节类型的存储单元,赋予字节类型的存储单元一个符号名,以便在程序中通过符号名来访问这个存储单元,以帮助对程序的理解。BYTE与DATE之间的区别类似于EQU和SET,BYTE伪指令不能定义重名。六、WORDWORD伪指令类似于DATE伪指令,只是WORD伪指令定义了一个字类型的符号名,其格式为:符号名WORD表达式=VALWORD=PARWORDH一个字由2个字节组成。当然,因为8051汇编语言集没有字操作,所以程序执行时,只处理字节。WROD伪指令仅仅允许用户定义一个认为是字的存储位置。七、BITBIT伪指令定义了一个字位类型的符号名,其格式为:符号名BIT表达式这里表达式的值是一个位地址,这个伪指令有助于位的地址符号化。例:F=LOGBIT=YBITH八、ALTNAME替换名(ALTNAME伪指令提供用户一种手段,以定义一个符号名来替换一个保留字,此后这个答名与被替换的保留字均可等效地用于程序中。任何保留类型的答名均可被替换。替换名伪指令格式为:ALTNAME保留字,新名例:=ALTNAMERCOUNTAEAMOVA,RBEMOVA,COUNT九、DBDB伪指令用于定义一个连续的存储区,给该存储区的存储单元赋值。该伪指令的参数即为存储单元的值,在表达式中对变元个数没有限制,只要此条伪指令能容纳在源程序的一行内,其格式为:标号:DB表达式只要表达式不是字符串,每一表达式值都被赋给一个字节。计算表达式值时按16位处理,但其结果只取低8位,若多个表达式出现在一个DB伪指令中,它们必须以逗号分开。表达式中有字符串时,以单引号“’”作分隔符,每个字符占一个字节,字符串不加改变地被存在各字节中,并不将小写字母转换成大写字母。例如:DBHHHHDB’Thisisademo!’十、DWDW为以字节为单元(十六位二进制来给一个的存储区赋值,其格式为:标号:DW表达式例如:DBDW,,BDEDW’ABCD’,’BC’,’A’ACEDW*h,+h,’YZ’,h-AFEAA十一、DSDS为定义存储内容的伪指令,用它定义一个存储区,并用指定的参数填满该存储区。DS伪指令包含两个变元,第一个变元定义了存储区的长度的字节数,在汇编时,汇编程序将跳过这些单元把其它指令汇编在这些字节之后,因此在使用DS伪指令时第一个变元不可活力第二个变元表示在这些单元中真入什么值,第二个变元可以活力活力时这些字节将不处理。下例中处有一条DS,则空出个字节,下一第指令被汇编到C处;在C处空出BH个单元,在这些字节中被H所填充。DS指令的格式如下:标号:DS表达式1,表达式2表达式1定义了存储区的长度(以字节为单位。这个变元不能省略。表达式2是可选择的,它的值低8位用以填入所定义的存储区。若省略则这部分存储单元不处理。例:INCADSAINCABDSBH,HINCA十二、INCLUDEINCLUDE伪指令用于链接源文件,即将一个源文件插入到另一个源文件中。它有一个参数,指出将要插入的文件名,该文件名中可包括驱动器名和路径名。若文件没有扩展名,则默认为是ASM。但待插入的文件必须是可以打开的。若文件打开操作失败,则产生致命错误,汇编将停止运行。反之,汇编程序将文件内容读入并按源代码处理。当遇到文件结速符时,汇编程序返回到INCLUDE伪指令处继续身下处理源程序。被插入的文件在程序清单中以“I”开头。本宏汇编版本支持级嵌套,可在程序中用INCLUDE伪指令插入任意多个文件,但是,在一般情况下DOS允许打开的文件数量是有限的,如果用户需要打开较多的文件,则必须在CONFIG.SYS文件中加入FILES=4或更多的值,若超过8级嵌套或打开的文件太多,则产生致命错误,汇编中止运行。INCLUDE伪指令提供了模块化程序设计手段,在汇编程序处理主程序时,模块被插入,尽管这不等价于链接和装配可重定位的目标模块,但它具有类似的功能,被插入的源文件中不应该包含END伪指令,否则,汇编就会提前停止运行,END伪指令只能出现在主程序中。此外,在主程序进行汇编前所有附加的源文件必须通过汇编,产生相应的HEX及LST文件,由于附加的文件没有END伪指令,因此,附加文件汇编时,汇编程序将显示:“没有结束语句”的错误,但并不影响与主程序的链接。下面是一个使用INCLUDE伪指令的例子,其主程序的源文件MAIN.ASM为:;MAIN.ASMHSTART:CLRAMOVR,AINCLUDEMODINCRINCLUDEMOD.ASMDECRENDSTART主程序为带有END伪指令的完整的源文件。程序中有两INCLUDE伪指令,分别将两附加的文件MOD1.ASM及MOD2.ASM链接到主程序中。以下是这两个文件。;MOD.ASMMOVR,#HMOVR,#H;MOD.ASMMOVR,#HANLA,#HMOVR,A注意MOD1.ASM及MOD2.ASM均没有END指令。在进行汇编时必须先对MOD1.ASM和MOD2.ASM进行汇编,然后在汇编MAIN.ASM,由于上两个文件没有END伪指令,所以在汇编时会出现错误提示,不用管它,继续下面的工作,就可以得到正确的结果。以下是形成的列表文件:TheCybericMicroSystemsFamilyAssembler,Version.Page;MOD.ASMMOVR,#HANLA,#HMOVR,A--;MAIN.ASMHSTART:ECLRAFBMOVR,AIINCLUDEMODI;MOD.ASMIAMOVR,#HIBDMOVR,#HIDDINCRIINCLUDEMOD.ASMI;MOD.ASMIEEMOVR,#HIANLA,#HIFMOVR,ABDECRENDSTARTTheCybericMicroSystemsFamilyAssembler,Version.Page--;%TSymbolNameTypeValueSTART.............L;%ZErrors()十三、TITLTITLE伪指令用于在列表文件页头建立一个标题,其格式为:$TITLE标题行这里标量行就是将出现在页头的标量与通常的字符串定义不同。这里标量行不加引号。汇编从$TITLE之后的第一个可打印字符开始,到回车符之间的字符串作为标量标量的最大长度是6个字符,基标量行省略,则标题行为空行。若TITLE伪指令在一页,它说明的标量行包含在本页,否则,标题将出现在下页页头。十四、PAGEPAGE伪指令用于形成新的一中定义一面的行数。其格式为:$PAGE表达式若表达式缺省则开始新的一页,若有表达式,则每页行数重新定义。汇编开始时页长为66行。一页中除出页外,剩余55行用于打印源程序,这一格式适用于标准打印纸。如果变元值小于66,页内可打印的源代码行将相应减少。页长最小值为12。若小于12时,每页内除页上只打印一行源程序。页长变元是16位字节,因而每页最长可定义到65535行,这时分页打印变为连续打印,在屏幕显示程序清单或在卷筒纸上打印程序清单时,常常使用连续打印,如果在启动汇编时用/N选项,页长就是65535。十五、LIST与NOLIST它们的格式为:$LIST$NOLISTLIST伪指令使汇编时主生程序清单,但即使不用该指令,汇编也会自动产生清单。但如果使用了NOLIST伪指令后需要继续主生清单则必须使用LIST伪指令。NOLIST伪指令使汇编时不产生清单,所有包含此伪指令及在这条伪指令之后的语句都不进入列表文件。当不需要任何列表文件,并且不需要显示程序清单时,可以在启动汇编时不加.L附加项,且在源代码的第一行加上NOLIST指令。使用NOLIST伪指令与附加项/L不同之处是NOLIST伪指令可加在源程序中,与LIST伪指令配合使用,使源程序中某些部分不产生清单。而不加附加项/L则不产生任何程序清单。不过,不管有无$NOLIST伪指令,程序在汇编时检查到的错误都将在屏幕上显示出错的源代码行及错误信息十六、NOCODE其格式为$NOCODENOCODE伪指令使得在汇编时,条件汇编程序结构中那些真值为假的条件不产生清单。有关条件汇编结构在下面介绍。如果没有这条伪指令,汇编将主生所有条件下的清单,不论其真值是否为真。但是假的条件,不产生目标码。而NOCODE伪指令使汇编清单中只列出那些由汇编程序用到的部分,因此,当使用NOCODE伪指令时,程序清单与源程序并非逐行对应。本文来自CSDN博客,转载请标明出处:

您可能感兴趣的文章:

相关文章