b2c信息网

您现在的位置是:首页 > 明日新闻 > 正文

明日新闻

经典汇编程序100例源码(汇编语言经典程序100例)

hacker2022-06-08 19:41:26明日新闻115
本文目录一览:1、跪求汇编语言程序设计编程源码!1、(实现比较X,Y的大小)2、实现3X+2Y-3Z

本文目录一览:

跪求汇编语言程序设计编程源码!1、(实现比较X,Y的大小)2、 实现3X+2Y-3Z

什么事?左若枫委婉功身来被口外的一股莫实的情感牵引着。

开开你。星儿晨右若枫一哭。

???左若枫到不知当道什么佳了。歇息吧!连他本人也不曾觉察自人的语气有多温顺。

嗯。星儿笑灭面摇头害臊的钻入被窝。

左若枫却僵在本天曾几何时陆恋羽也是这样害臊的!不不!左若枫赶紧甩启这个动机。为什么?为什么分在星儿身上呈现陆恋羽的影女?岂非是当为都鸣‘星儿’吗?不不会的。他一订是这阵女太乏了必定是这样的。左若枫明自安静上去甩启这莫有的念绪跨出房间。

没有止!这样上去实不非个措施!星女再主趴正在窗心下叹息。自自几地后伤康复先就不睹事情无何开展。望来失出尽招了!嗯便那么办吧!星儿脸上抑止正好的哭。

长从那非正在本迁(天实)的合止账纲。有绝将一堆账原搁正在右若枫的桌下逐一接代灭。

嗯您上去吧,中国人体艺术。对于了有尽。通知两堡从归来人无事要觅他。右若枫脚下闲个没有停。

是长主。无绝退上。

哎哟!委婉角处传来两己相碰的声响。

?!非李姑娘!对于没有止您没事吧?无绝赶紧扶住借没坐稳的星儿。

!出事人出事。咦?有尽您跑那么慢做吗?星女开端刺探军情。

哦少重要我往办面事,人体艺术。无绝仍是很和气滴。

什么事?星儿持续履行本人的义务。

往把两堡主请归来少主觅他有事呢!分觉的这个李星儿是个什么事皆能道失己实奇异!

两堡从?!人怎样历来皆出听道功?星女便奇异了。

这是由于你刚刚入少威严堡没多暂再减上二堡主没事不会来来的便算归来也很匆促的所以陈少有上人晓得这事的。无绝好意的为星儿说明。

哦本来如斯。星儿不念再持续这个话题对于左若枫以外的事情纲后仍是没什么兴致的。这明天谁在枫???不少主的书房前值班?末于答讲最要害的。

没无长主的威严过皆比我们不知下出几倍这须要己维护呀!底少我们只能算是避免外来搅扰的。无绝和三暮年后这个无毫不能比如今的他竟然会哭???唉恨情能够转变一个人!

是吗!呵呵???星儿愚笑在口外打算灭怎样出来。

李姑娘那我走了。无绝做揖告辞。

嗯再睹。星儿笑嘻嘻的欢迎。

实是天佑我也呀!嘻嘻???山河如斯少娇引有数豪杰绝合腰。丽人如彼少娇好汉连山河都不要???(思仆娇--歌)星儿忧的唱止歌来。

相关的主题文章:

人体艺术摄影 她果然是个潜在的分子

人体艺术摄影 上官离尘我的天你干嘛跑到我的来

日本人体艺术 亲们不要老催促雯雯多写几章

用汇编语言编写一个小程序(比如hello,word!)请懂的人帮忙提供源码

您正在看的汇编语言是:hello,world!win32汇编小程序。

首先我们看一个“复杂”的Win32汇编程序

程序用来显示一个消息框

--------------------------------------------------

;文件名:3.asm

.386

.model flat ,stdcall

NULL equ 0

MB_OK equ 0

ExitProcess PROTO :Dword

MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:Dword

includelib kernel32.lib

includelib user32.lib

.data

szText db "Hello, world!",0

szCaption db "Win32Asm",0

.code

start:

push MB_OK

lea eax,szCaption

push eax

lea eax,szText

push eax

push NULL

call messageboxa

xor eax,eax

push eax

call exitprocess

end start

--------------------------------------------------

编译链接:

分下面两步进行:

ml /c /coff 3.asm

link /subsystem:Windows /libpath:d:\masm7\lib 3.obj

第一步编译生成3.obj文件

/c 表示只编译,不链接

/coff 表示生成COFF格式的目标文件

第二步链接生成3.exe文件

/subsystem:windows 表示生成Windows文件

/libpath:d:\masm7\lib 表示引入库的路径为:d:\masm7\lib。

在安装Masm32后,引入库位于Masm32\Lib目录下。

也可设置环境变量Lib的值:在dos提示符下键入Set Lib=d:\masm7\lib,这样“链接”就可简单写成:

link /subsystem:Windows 3.obj,试想一下,在程序调试过程中,修改源程序是常用的事啦,每次编译链接都要带/libpath:...那该有多烦人呢。当然,我们也可在源程序中直接给出引入库的位置,这样,链接时就方便啦,如下:

includelib d:\masm7\lib\kernel32.lib

includelib d:\masm7\lib\user32.lib

--------------------------------------------------

执行:在dos提示符下键入3,回车,出现一个消息框,哈哈,真正的Win32程序!

--------------------------------------------------

深入分析:

看一下源程序,有这么两行:call messageboxa\call exitprocess。大家一看都知道,这是子程序调用,但是我们并没写这样的子程序,事实上,这些是API函数。作为函数,我们在调用时可能需要传送给函数一些参数,程序怎么知道传送的参数有哪些,类型是什么呢?就是通过函数原型定义,如下所示:

ExitProcess PROTO :Dword

MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:Dword

可以看出,ExitProcess有一个参数,MessageBoxA有四个参数,这些参数都是Dword类型。

在Win32中,参数的传递都是通过堆栈来完成的。象MessageBoxA这个函数有四个参数,究竟是左边的先压入堆栈还是右边的先入栈呢?.model flat,stdcall给出了答案。stdcall 指定参数是从右到左压入堆栈的,且调整堆栈是在子程序返回时完成的。在源程序中不需要用“add sp,值”来保持堆栈平衡。对MessageBox,在API手册中是这样定义的:

int MessageBox(

HWND hWnd, // handle of owner window

LPCTSTR lpText, // address of text in message box

LPCTSTR lpCaption, // address of title of message box

UINT uType n

您正在看的汇编语言是:hello,world!win32汇编小程序。

bsp; // style of message box

)

;所以会有我们的程序段:

push MB_OK

lea eax,szCaption

push eax

lea eax,szText

push eax

push NULL

call messageboxa

看看上面的程序,不难想到,假如在写程序时,少往堆栈里压入一个数据,那将是一个致命的错误。能不能将这种检查参数个数是否匹配的工作交给计算机来完成呢?这是可以的,INVOKE指令可以帮助我们完成这样的工作。假如你的参数个数不正确,连接器将给出错误提示。所以,极力建议你使用invoke代替call来调用子程序,当然,这不是绝对的。使用invoke上面的指令就可简写成下面的样子,看起来简炼多啦,查错也方便啦!

invoke messageboxa, NULL,addr szText,addr szCaption,MB_OK

另外,像NULL,MB_OK都是一些常量,这样的常量有很多,还有很多的结构,如果在我们的程序中一开始都写这么多的东西,可能一下子就把你吓怕啦,也容易出错,更不便于看程序的主要部分。hutch整理的Windows.inc包含了WIN32编程所需要的常量和结构体的定义,我们可简单的用一个include指令将这些常量和结构的定义插入到我们的文件中:

include d:\masm32\include\Windows.inc

但是Windows.inc中并不包含函数原型的声明,还要从其他的头文件中得到函数原型的声明,比如:messageboxa的原型声明在user32.inc文件中,exitprocess在kernel32.inc文件中。这些头文件都放在 \masm32\include文件夹下。

还有,要用Windows.inc,必须使用option casemap:none,它的意思是告诉 MASM 要区分符号的大小写,譬如:start和START是不一样的。否则,一个小小的程序,可能会出成百上千的错误呀!

其他的,就不再细说啦,到此,上面的程序可重新修改如下:

-----------------------------------------------------------------

;最终的结果

.386 ;表示要用到386指令

.model flat,stdcall ;32位程序,要用flat啦!;stadcall,标准调用

option casemap:none ;区别大小写

include Windows.inc ;包括常量及结构定义

include kernel32.inc ;函数原型声明

include user32.inc

includelib kernel32.lib ;用到的引入库

includelib user32.lib

.data;数据区,定义2个字符串

szText db "Hello, world!",0

szCaption db "Win32Asm",0

.code ;代码开始执行处

start:

invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK

;调用MessageBoxAPI函数

invoke ExitProcess,NULL ;程序退出

end start;结束

------------------------------------

编译链接:

ml /c /coff /I d:\masm7\include 3.asm ;注意开关符识别大小写

link /subsystem:Windows /libpath:d:\masm7\lib 3.obj

/I d:\masm7\include 表示*.inc文件的位置,也可设置环境变量Set include=d:\masm7\include来简化操作,也可在程序中明确指出*.inc的位置。

前面讲的都是用两条指令来完成编译链接,实际上用一条指令也可完成,如下:

ml /coff /I d:\masm7\include 3.asm /link /subsystem:Windows /libpath:lib

若*.inc及引入库在源程序中都明确指出其位置,则可简化为:

ml /coff 3.asm /link /subsystem:

汇编代码实例

伪 指 令

伪指令是对汇编起某种控制作用的特殊命令,其格式与通常的操作指令一样,并可加在汇编程序的任何地方,但它们并不产生机器指令。许多伪指令要求带参数,这在定义伪指令时由“表达式”域指出,任何数值与表达式匀可以作为参数。不同汇编程序允许的伪指令并不相同,以下所述的伪指令仅适用于MASM51系统,但一些基本的伪指令在大部份汇编程序中都能使用,当使用其它的汇编程序版本时,只要注意一下它们之间的区别就可以了。MASM51中可用的伪指令有:ORG 设置程序起始地址END 标志源代码结束EQU 定义常数SET 定义整型数DATA 给字节类型符号定值BYTE 给字节类型符号定值WROD 给字类型符号定值BIT 给位地址取名ALTNAME 用自定义名取代保留字DB 给一块连续的存储区装载字节型数据DW 给一块连续的存储区装载字型数据DS 预留一个连续的存储区或装入指定字节。INCLUDE 将一个源文件插入程序中TITLE 列表文件中加入标题行NOLIST 汇编时不产生列表文件NOCODE 条件汇编时,条件为假的不产生清单一、ORG 伪指令ORG用于为在它之后的程序设置地址值,它有一个参数,其格式为:ORG 表达式表达式可以是一个具体的数值,也可以包含变量名,如果包含变量名,则必须保证,当第一次遇到这条伪指令时,其中的变量必须已有定义(已有具体的数值),否则,无定义的值将由0替换,这将会造成错误。在列表文件中,由ORG定义的指令地址会被打印出来。ORG指令有什么用途呢?指令被翻译成机器码后,将被存入系统的ROM中,一般情况下,机器码总是一个接一个地放在存储器中,但有一些代码,其位置有特殊要求,典型的是五个中断入口,它们必须被放在0003H,000BH,0013H,001BH和0023H的位置,否则就会出错,如果我们编程时不作特殊处理,让机器代码一个接一个地生成,不能保证这些代码正好处于这些规定的位置,执行就会出错,这时就要用到ORG伪指令了。看如下例子:例:INT_0 EQU 1000HTIME_0 EQU 1010HINT_1 EQU 1020HTIME_1 EQU 1030HSERIAL EQU 1040HAJMP START ;跳转到主程序起始点LJMP INT_0 ;外中断0处理程序LJMP TIME_0 ;定时中断0处理程序LJMP INT_1 ;外中断1处理程序LJMP TIME_1 ;定时中断1处理程序LJMP SERIAL ;串行口中断程序START:NOPEND上面的程序经汇编后列表文件如下:The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 108-26-96  1000 = INT_0 EQU 1000H1010 = TIME_0 EQU 1010H1020 = INT_1 EQU 1020H1030 = TIME_1 EQU 1030H1040 = SERIAL EQU 1040H0000 0111 AJMP START ;跳转到主程序起始点0002 021000 LJMP INT_0 ;外中断0处理程序0005 021010 LJMP TIME_0 ;定时中断0处理程序0008 021020 LJMP INT_1 ;外中断1处理程序000B 021030 LJMP TIME_1 ;定时中断1处理程序000E 021040 LJMP SERIAL ;串行口中断程序START:0011 00 NOP0000 ENDThe Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 208-26-96;%T Symbol Name Type ValueINT_0 . . . . . . . . . . . . . I 1000INT_1 . . . . . . . . . . . . . I 1020SERIAL. . . . . . . . . . . . . I 1040START . . . . . . . . . . . . . L 0011TIME_0. . . . . . . . . . . . . I 1010TIME_1. . . . . . . . . . . . . I 1030;%Z00 Errors (0000)由列表文件,可以绘出代码在ROM中的映象图如下:代码

01H

11H

02H

10H

00H

02H

10H

10H

02H

10H

20H

地址

00H

01H

02H

03H

04H

05H

06H

07H

08H

09H

0AH

代码

02H

10H

30H

02H

10H

40H

00H

 

 

 

 

地址

0BH

0CH

0DH

0EH

0FH

10H

11H

12H

13H

14H

15

由上面的映象图可知,在03H处的代码为10H,而不是我们要的02H,所以外断程序INT_0不能被正确执行,其它各中断程序的情况同样如此,如在0BH处,本来存放的应当是定时器0中断程序,但按上述的映象图,0BH处开始的3个代码是:02H,10H,30H,这是定时器1的入口地址,所以,如果定时器0发生中断,所执行的其实是定时器1的中断程序,这当然不对。例2:INT_0 EQU 1000HTIME_0 EQU 1010HINT_1 EQU 1020HTIME_1 EQU 1030HSERIAL EQU 1040HAJMP START ;跳转到主程序起始点ORG 0003HLJMP INT_0 ;外中断0处理程序ORG 000BHLJMP TIME_0 ;定时中断0处理程序ORG 0013HLJMP INT_1 ;外中断1处理程序ORG 001BHLJMP TIME_1 ;定时中断1处理程序ORG 0023HLJMP SERIAL ;串行口中断程序START:NOPEND上面的程序经过汇编后列表文件如下:The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 108-26-961000 = INT_0 EQU 1000H1010 = TIME_0 EQU 1010H1020 = INT_1 EQU 1020H1030 = TIME_1 EQU 1030H1040 = SERIAL EQU 1040H0000 0126 AJMP START ;跳转到主程序起始点0003 ORG 0003H0003 021000 LJMP INT_0 ;外中断0处理程序000B ORG 000BH000B 021010 LJMP TIME_0 ;定时中断0处理程序0013 ORG 0013H0013 021020 LJMP INT_1 ;外中断1处理程序001B ORG 001BH001B 021030 LJMP TIME_1 ;定时中断1处理程序0023 ORG 0023H0023 021040 LJMP SERIAL ;串行口中断程序START:0026 00 NOP0000 ENDThe Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 208-26-96;%T Symbol Name Type ValueINT_0 . . . . . . . . . . . . . I 1000INT_1 . . . . . . . . . . . . . I 1020SERIAL. . . . . . . . . . . . . I 1040START . . . . . . . . . . . . . L 0026TIME_0. . . . . . . . . . . . . I 1010TIME_1. . . . . . . . . . . . . I 1030;%Z00 Errors (0000)由列表文件,可以绘出代码在ROM中的映象图如下:代码

01H

11H

 

02H

10H

00H

 

 

 

 

 

地址

00H

01H

02H

03H

04H

05H

06H

07H

08H

09H

0AH

代码

02H

10H

10H

 

 

 

 

 

02H

01H

20H

地址

0BH

0CH

0DH

0EH

0FH

10H

11H

12H

13H

14H

15H

代码

 

 

 

 

02H

10H

30H

 

 

 

地址

16H

17H

18H

19H

1AH

1BH

1CH

1DH

1EH

1FH

20H

代码

 

 

02H

10H

40H

00H

 

 

 

 

 

地址

21H

22H

23H

24H

25H

26H

27H

28H

29H

2AH

2BH

由映象图可知,各中断程序的代码都在其规定地址处,一旦产生中断即可执行相应的程序。至于图中未填的部分(如02H),根据各编程器不同而不同,一般为FFH或00H。 二、END END语句标志源代码的结束,汇编程序遇到END语句即停止运行。若没有END语句,汇编将报错。END语句有一个参数,可以是数值0,也可以是表达式,其格式是:标号: END 表达式它的值就是程序的地址并且作为一个特殊的记录写入HEX文件。若这个表达式省略,HEX文件中其值就是0。三、EQU EQU以及其它一些符号定义伪指令用来给程序中出现的一些符号赋值。对这些符号名的要求与其它符号相同,即长度不限,大小写字母可互换并且必须以字母开头。由等值指令定义的符号是汇编符号表的一部分。等值伪指令有两种形式。一种用EQU,另一种用字符“=”即符号名 EQU 表达式符号名 = 表达式两种形式的效果是一样的。符号名在左边,其对应的值在右边。值可以是变元,其它的符号名或表达式。只要在两遍扫描中求出表达式的值就行,否则引用该符号名时将报错。当表达式的值是字符串时,只取后两个字符。若串长为1,高位字节被置0,符号名的值被打印在程序清单中。由等值伪指令定义的符号名不允许重名。如果经定义的符号名被重定义,则汇编将报出错,并且这个符号名按新定义的处理,最好不要在程序中出现重名。例:0469= ABC EQU 469H0464= XY EQU ABC-502F0= JK = 7520754 XYJK = XY+JK在列表文件中最左边的数字不是这些伪指令所在的地址而是通过汇编后赋给符号名的值。第一条符号名ABC被起来469H,第二条XY被赋于ABC-5,因此XY的值为469H-5=464H,JK的值为752(即2F0H),XYJK的值XY+JK=464H+2F0H=754H四、SET SET伪指令有些类似于等值伪指令,它定义了一个整数类型的符号名,它的格式为符号名 SET 表达式SET伪指令与等值伪指令的唯一区别在于SET伪指令所定义的符号名右以在程序中多次定义,而不报错。例:002D= K57 SET 101101B8707= K57 SET 34567五、DATA与BYTE DATA与BYTE都是用来定义字节类型的存储单元,赋予字节类型的存储单元一个符号名,以便在程序中通过符号名来访问这个存储单元,以帮助对程序的理解。BYTE与DATE之间的区别类似于EQU和SET,BYTE伪指令不能定义重名。六、WORD WORD伪指令类似于DATE伪指令,只是WORD伪指令定义了一个字类型的符号名,其格式为:符号名 WORD 表达式0027= VAL31 WORD 390021= PAR7 WORD 21H一个字由2个字节组成。当然,因为8051汇编语言集没有字操作,所以程序执行时,只处理字节。WROD伪指令仅仅允许用户定义一个认为是字的存储位置。七、BIT BIT伪指令定义了一个字位类型的符号名,其格式为:符号名 BIT 表达式这里表达式的值是一个位地址,这个伪指令有助于位的地址符号化。例:002F= LOG3 BIT 470014= Y731 BIT 14H八、ALTNAME 替换名(ALTNAME)伪指令提供用户一种手段,以定义一个符号名来替换一个保留字,此后这个答名与被替换的保留字均可等效地用于程序中。任何保留类型的答名均可被替换。替换名伪指令格式为:ALTNAME 保留字,新名例:0002= ALTNAME R2 COUNT013A EA MOV A,R2013B E502 MOV A,COUNT九、DB DB伪指令用于定义一个连续的存储区,给该存储区的存储单元赋值。该伪指令的参数即为存储单元的值,在表达式中对变元个数没有限制,只要此条伪指令能容纳在源程序的一行内,其格式为:标号: DB 表达式只要表达式不是字符串,每一表达式值都被赋给一个字节。计算表达式值时按16位处理,但其结果只取低8位,若多个表达式出现在一个DB伪指令中,它们必须以逗号分开。表达式中有字符串时,以单引号“'”作分隔符,每个字符占一个字节,字符串不加改变地被存在各字节中,并不将小写字母转换成大写字母。例如:DB 00H 01H 03H 46HDB 'This is a demo!'十、DW DW为以字节为单元(十六位二进制)来给一个的存储区赋值,其格式为:标号: DW 表达式例如:0000 3035 D46B DW 12341,54379,10110100101110B0004 2D2E0006 4344 4243 DW 'ABCD','BC','A'000A 0041000C 2868 02E8 DW 456*375h,83+295h,'YZ',72h-4560010 595A FEAA十一、DS DS为定义存储内容的伪指令,用它定义一个存储区,并用指定的参数填满该存储区。DS伪指令包含两个变元,第一个变元定义了存储区的长度的字节数,在汇编时,汇编程序将跳过这些单元把其它指令汇编在这些字节之后,因此在使用DS伪指令时第一个变元不可活力第二个变元表示在这些单元中真入什么值,第二个变元可以活力活力时这些字节将不处理。下例中0173处有一条DS 9,则空出9个字节,下一第指令被汇编到017C处;在017C处空出1BH个单元,在这些字节中被27H所填充。DS指令的格式如下:标号: DS 表达式1,表达式2表达式1定义了存储区的长度(以字节为单位)。这个变元不能省略。表达式2是可选择的,它的值低8位用以填入所定义的存储区。若省略则这部分存储单元不处理。例:0000 04 INC A0001 DS 9000A 04 INC A000B DS 1BH,27H0026 04 INC A十二、INCLUDE INCLUDE伪指令用于链接源文件,即将一个源文件插入到另一个源文件中。它有一个参数,指出将要插入的文件名,该文件名中可包括驱动器名和路径名。若文件没有扩展名,则默认为是ASM。但待插入的文件必须是可以打开的。若文件打开操作失败,则产生致命错误,汇编将停止运行。反之,汇编程序将文件内容读入并按源代码处理。当遇到文件结速符时,汇编程序返回到INCLUDE伪指令处继续身下处理源程序。被插入的文件在程序清单中以“I”开头。本宏汇编版本支持级嵌套,可在程序中用INCLUDE伪指令插入任意多个文件,但是,在一般情况下DOS允许打开的文件数量是有限的,如果用户需要打开较多的文件,则必须在CONFIG.SYS文件中加入FILES=40或更多的值,若超过8级嵌套或打开的文件太多,则产生致命错误,汇编中止运行。INCLUDE伪指令提供了模块化程序设计手段,在汇编程序处理主程序时,模块被插入,尽管这不等价于链接和装配可重定位的目标模块,但它具有类似的功能,被插入的源文件中不应该包含END伪指令,否则,汇编就会提前停止运行,END伪指令只能出现在主程序中。此外,在主程序进行汇编前所有附加的源文件必须通过汇编,产生相应的HEX及LST文件,由于附加的文件没有END伪指令,因此,附加文件汇编时,汇编程序将显示:“没有结束语句”的错误,但并不影响与主程序的链接。下面是一个使用INCLUDE伪指令的例子,其主程序的源文件MAIN.ASM为:;MAIN.ASMORG 27HSTART:CLR AMOV R3,AINCLUDE MOD1INC R5INCLUDE MOD2.ASMDEC R3END START主程序为带有END伪指令的完整的源文件。程序中有两INCLUDE伪指令,分别将两附加的文件MOD1.ASM及MOD2.ASM链接到主程序中。以下是这两个文件。;MOD1.ASMMOV R2,#31HMOV R5,#18H;MOD2.ASMMOV R6,#47HANL A,#07HMOV R1,A注意MOD1.ASM及MOD2.ASM均没有END指令。在进行汇编时必须先对MOD1.ASM和MOD2.ASM进行汇编,然后在汇编MAIN.ASM,由于上两个文件没有END伪指令,所以在汇编时会出现错误提示,不用管它,继续下面的工作,就可以得到正确的结果。以下是形成的列表文件:The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 1;MOD2.ASMMOV R6,#47HANL A,#07HMOV R1,A08-27-96;MAIN.ASM0027 ORG 27HSTART:0027 E4 CLR A0028 FB MOV R3,AI INCLUDE MOD1I ;MOD1.ASMI0029 7A31 MOV R2,#31HI002B 7D18 MOV R5,#18HI002D 0D INC R5I INCLUDE MOD2.ASMI ;MOD2.ASMI002E 7E47 MOV R6,#47HI0030 5407 ANL A,#07HI0032 F9 MOV R1,A0033 1B DEC R30027 END STARTThe Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 208-27-96;%T Symbol Name Type ValueSTART . . . . . . . . . . . . . L 0027;%Z00 Errors (0000)十三、TITL TITLE伪指令用于在列表文件页头建立一个标题,其格式为:$TITLE 标题行这里标量行就是将出现在页头的标量与通常的字符串定义不同。这里标量行不加引号。汇编从$TITLE之后的第一个可打印字符开始,到回车符之间的字符串作为标量标量的最大长度是60个字符,基标量行省略,则标题行为空行。若TITLE伪指令在一页,它说明的标量行包含在本页,否则,标题将出现在下页页头。十四、PAGE PAGE伪指令用于形成新的一中定义一面的行数。其格式为:$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博客,转载请标明出处:

求几个汇编小程序的源代码 要完整的

简单的取系统时间小程序code segment

assume cs:code

start:

mov ah,2ch ;2ch号功能调用,取系统时间:ch,cl,dh中分别存放时分秒

int 21h

calldisptime;调用disptime子程序显示时间

exit:

mov  ax,4c00h ;结束程序,返回DOS

int 21h

disptime proc

mov al,ch  ;小时的值赋给al

cbw ;al扩展成ax,用做除法的被除数

call bindec

mov dl,':' ;显示":"

mov ah,02h

int 21h

mov al,cl  ;分

cbw

call bindec

mov dl,':' ;显示":"

mov ah,02h

int 21h

mov al,dh;秒

cbw

call bindec

ret

disptime endp

bindec proc

pushax ;保存寄存器的值(一定要的)

pushcx

pushdx

mov dx,0;被除数高16位置0

mov cx,10d ;除数为10d

div cx

mov bx,dx  ;先保存余数

mov dl,al  ;显示商(即十进制二位数的十位)

add dl,30h ;转换成Ascii码

mov ah,02h ;2号功能调用,显示字符(十位)

int 21h

mov dx,bx  ;恢复余数的值(十进制二位数的个位)

add dl,30h ;转换成ASCII码

mov ah,02h ;2号功能调用,显示字符(个位)

int 21h

pop dx ;恢复寄存器的值

pop cx

pop ax

ret ;子程序返回

bindec endp

code ends

end start

汇编语言程序实例 1到100求和

有挑战,我喜欢! 我来试试!

DATAS SEGMENT

BuF DB 1,2,3,4,^^^^^^^,100

BuF2 DW ?

DATAS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS

START:

MOV AX,DATAS

MOV DS,AX

MOV SI,OFFSET BuF

MOV CL,100

MOV AX,0

KK: ADC AX,[SI]

INC SI

LOOP KK

MOV BuF2,AX

MOV AH,4CH

INT 21H

CODES ENDS

END START

运行了,也是初学者,第二个语句可能有点问题,4和100之间加个省略号就行了!你试试吧!

100行的汇编语言程序

dat segment

data db 10 dup(0)

input db 'input:$'

output db 'output:$'

enter db 0dh,0ah,'$'

dat ends

cod segment

assume ds:dat,cs:cod

;-----------------------主程序

start:

mov ax,dat

mov ds,ax ;数据段寄存器赋值

lea si,data ;SI指向DATA数组首单元

mov cl,4

ppp:

mov bx,0 ;BX清零

lea dx,input ;这三行调用INT 21H中断例程的9号功能输出DS:DX指向的字符串,以'$'结尾

mov ah,9 ;以下代码若有类似的三句,实现功能类似

int 21h ;显示输入提示

;-----------------------开始输入十六进制数

get:

mov ah,1 ;这两行调用INT 21H中断例程1号功能,等待用户输入一个字符,保存入AL中

int 21h

;以下6对代码依次比较输入字符,并跳转到相应操作

cmp al,'*'

jz kkk ;输入'*'号,退出程序

cmp al,0dh ;0DH是回车键对应的字符

jz mess ;输入回车,跳出get循环(get循环:实现输入十六进制数并保存到BX的功能)

cmp al,30h ;这4行判断是否是'0'~'9'

jb get

cmp al,39h

jbe num

cmp al,'A' ;这4行判断是否是'A'~'F'

jb get

cmp al,'F'

jbe big

cmp al,'a' ;这4行判断是否是'a'~'f'

jb get

cmp al,'f'

jbe big

jmp get

num: ;对数字进行处理

and al,0fh ;al高4位清零,保留低4位

jmp next

big: ;对大写字母或者小写字母进行处理

sub al,7

and al,0fh

next:

shl bx,cl ;BX左移4位

add bl,al ;将数字保存到BL的低4位中

jmp get

;-----------------------

mess:

lea dx,enter

mov ah,9

int 21h ;回车、换行

lea dx,output

mov ah,9

int 21h ;显示输出提示

mov dx,0

mov ax,bx

mov bx,10 ;进制数

again:

call buf

cmp ax,0 ;商如果为0,表示该十六进制数对应的十进制数的每一个数位的值都存入了DATA数组

jnz again

mov ah,2 ;INT 21H的2号功能:将DL中保存的ASCII码对应的字符输出

ttt:

dec si

mov dl,[si] ;取数据

int 21h ;显示

cmp si,0

jnz ttt ;判断是否取完DATA数组的所有元素,来控制循环

lea dx,enter

mov ah,9

int 21h ;回车、换行

jmp ppp ;开始下一轮输入、转换和输出

kkk:

mov ah,4ch ;退出程序的操作

int 21h

;--------------------子程序

;传入参数:BX,进制数10;DX、AX,表示一个32位16进制数

;返回值:AX

;功能:

;1. 将DX、AX表示的16进制数除以10,得到余数(余数在0~9之间,即对应十进制无符号数的个位数字)

;2. 将其转换为对应字符的ASCII码(即1转换为'1'),并保存到SI指向的DATA数组元素的位置

;3. SI指向DATA数组的下一个元素

buf proc

div bx

add dl,30h

mov [si],dl

mov dl,0

inc si

ret

buf endp

cod ends

end start

;总结:这段程序实现的功能

;1. 十六进制输入一个数,输入回车表示输入结束,输入'*'表示退出程序,保存到寄存器中

;2. 十六进制数转换为十进制无符号数,使用了类似于栈的操作的方法

;3. 十进制无符号数转换为对应字符的ASCII码(2和3由子程序buf完成)

;4. ASCII码对应字符的输出的功能

发表评论

评论列表

  • 馥妴扮乖(2022-06-09 07:13:34)回复取消回复

    . . . . L 0026TIME_0. . . . . . . . . . . . . I 1010TIME_1. . . . . . . . . . . . . I 1030;%Z00 Errors (0000)由列表文件,可以绘出代码在ROM中的映象图如下:代码 01H 11H