汇编小程序

合集下载

用IDA反汇编个STM32小程序

用IDA反汇编个STM32小程序

本帖最后由yjmwxwx 于2014-12-11 00:12 编辑
想仿制别人的一款产品,但是只有固件没有源码无法修改程序,于是研究了一下反汇编。

下面把过程贴出来,方法对错我也不知道,我小学文化不懂英文操作这款软件有困难。

目标某开发的一个LED小程序
把HEX文件转为BIN文件
打开IDA
打开刚刚的BIN文件
选择ARM:
然后还有个高级选项选择Cortex-M (忘记截图)
ROM地址
反汇编
开头的是数据,第一个是站顶,第二个是复位向量,我们从他解开程序按D健转换
跳转到复位向量指向的地址
按C键转换成代码
反汇编完成,观看程序结构
2014-12-10 23:31 上传下载附件(72.81 KB)。

(完整版)8086汇编经典例程,推荐文档

(完整版)8086汇编经典例程,推荐文档

sub bl,26 mov al,'a' add al,bl
MOV CX,00H WAIT1: LOOP WAIT1
;延时计数器 ;延时
DW 2 DUP (25*8,25*8,50*8) DW 12 DUP (25*8),100*8
jmp next40
DEC DX
next24: sub bl,52
==========================================
MAIN ENDP
MOV AX,[SI]
5. 编写一个数组排序(从小到大)的小程序,数组在程
序中定义,程序先将原数组显示一遍,然后排序,再
DISP PROC
将排好序的数组显示一遍。
PUSH SI
==========================================
MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100 DW 2 DUP(50,50,25,25),100 DW 3 DUP(50,25,25),100
crlf proc push ax push dx
音演奏歌曲 ========================================== ;这是一个音乐程序,按大写字母“A”,唱乐曲“玛丽
ccc segment assume cs:ccc,ds:qqq
main proc far start: mov ax,qqq
mov ds,ax
next3:
jmp next10 cmp al,'a' jnae next4 cmp al,'z' ja next4 sub al,'a'

如何用代码制作小程序

如何用代码制作小程序

如何用代码制作小程序在当今数字化时代,小程序已成为许多企业和个人开发者提供服务和产品的一个重要方式。

借助代码,我们可以轻松地制作出功能强大、用户体验良好的小程序。

本文将介绍如何利用代码制作小程序。

第一步:选择开发工具在制作小程序之前,我们需要选择合适的开发工具。

目前市面上有许多流行的小程序开发工具,例如微信小程序开发者工具、支付宝开放平台、百度智能小程序IDE等。

根据自己的需求和技术背景选择一款合适的开发工具是非常重要的。

第二步:编写代码在选择好开发工具之后,接下来就要开始编写代码了。

小程序的代码通常使用类似于HTML、CSS和JavaScript的语法进行编写。

开发者可以根据小程序的需求,编写不同的功能和交互效果。

编写代码需要耐心和细心,确保代码逻辑正确。

第三步:调试和测试完成代码编写后,我们需要进行调试和测试。

在开发工具中,我们可以模拟用户的操作,检查小程序的显示效果和交互效果。

同时,我们也需要对不同的设备和平台进行测试,确保小程序在各种情况下都能正常运行。

第四步:发布小程序当小程序开发完成并通过测试后,就可以考虑发布小程序了。

在发布前,需要准备好小程序的名称、描述、图标等信息,并按照开发工具的指引,上传代码和提交审核。

审核通过后,小程序就可以正式上线供用户使用了。

结语通过上述步骤,我们可以使用代码制作出功能强大、用户体验良好的小程序。

在制作小程序的过程中,编写代码、调试测试都是需要仔细处理的环节,只有确保每个步骤都正确无误,才能制作出令人满意的小程序。

希望本文能帮助你更好地理解如何用代码制作小程序。

精选10个汇编语言程序案例集

精选10个汇编语言程序案例集

精选10个汇编语言程序案例集摘要:一、汇编语言简介二、案例1:简单算术运算三、案例2:字符串处理四、案例3:逻辑与关系运算五、案例4:循环与条件语句六、案例5:函数调用与参数传递七、案例6:数组与指针操作八、案例7:内存管理九、案例8:输入输出操作十、案例9:操作系统调用十一、案例10:网络编程十二、总结与拓展正文:一、汇编语言简介汇编语言是一种低级编程语言,它与计算机硬件的操作紧密相关。

汇编语言通过对计算机指令进行汇编,实现对计算机资源的控制。

下面将介绍10个汇编语言程序案例。

二、案例1:简单算术运算案例1是一个实现加减乘除算术运算的汇编程序。

通过编写相应的汇编指令,实现对两个整数的加减乘除操作。

三、案例2:字符串处理案例2是一个处理字符串的汇编程序。

通过汇编指令实现字符串的输入、输出、查找、替换等功能。

四、案例3:逻辑与关系运算案例3是一个处理逻辑与关系运算的汇编程序。

通过汇编指令实现逻辑与、逻辑或、逻辑非以及关系运算。

五、案例4:循环与条件语句案例4是一个处理循环与条件语句的汇编程序。

通过汇编指令实现for、while、if-else等循环与条件控制结构。

六、案例5:函数调用与参数传递案例5是一个处理函数调用与参数传递的汇编程序。

通过汇编指令实现函数调用,以及将参数传递给函数。

七、案例6:数组与指针操作案例6是一个处理数组与指针操作的汇编程序。

通过汇编指令实现数组的创建、访问、排序等操作,以及指针的运算与控制。

八、案例7:内存管理案例7是一个处理内存管理的汇编程序。

通过汇编指令实现内存的分配、释放、拷贝等操作。

九、案例8:输入输出操作案例8是一个处理输入输出操作的汇编程序。

通过汇编指令实现键盘输入、显示输出等功能。

十、案例9:操作系统调用案例9是一个处理操作系统调用的汇编程序。

通过汇编指令实现操作系统提供的功能,如文件操作、进程管理等。

十一、案例10:网络编程案例10是一个处理网络编程的汇编程序。

20个简单汇编语言程序

20个简单汇编语言程序

20个简单汇编语言程序汇编语言是一种底层编程语言,其语法简洁、速度快,被广泛应用于嵌入式系统和设备驱动程序的开发。

本文将介绍20个简单的汇编语言程序,帮助读者了解该语言的基本语法和用法,以便更好地进行编程。

1. 程序1:将两个数相加并显示结果。

这个程序演示了如何使用汇编语言进行简单的算术操作。

2. 程序2:计算并显示斐波那契数列。

这个程序展示了如何使用循环和条件语句来求解数学问题。

3. 程序3:判断一个数是否是素数。

这个程序演示了如何使用分支语句来进行逻辑判断。

4. 程序4:将一个字符串逆序输出。

这个程序展示了如何使用栈来实现字符串逆序。

5. 程序5:计算一个字符串的长度。

这个程序展示了如何使用循环和计数器来确定字符串的长度。

6. 程序6:将一个字符串转换为大写。

这个程序演示了如何使用位运算来进行字符转换。

7. 程序7:计算一个数的阶乘。

这个程序展示了如何使用循环和累加运算来求解阶乘。

8. 程序8:判断一个字符串是否是回文。

这个程序演示了如何使用循环和栈来进行字符串回文判断。

9. 程序9:实现快速排序算法。

这个程序展示了如何使用递归和分区操作来进行快速排序。

10. 程序10:实现冒泡排序算法。

这个程序演示了如何使用循环和比较操作来进行冒泡排序。

11. 程序11:计算一个数组的平均值。

这个程序展示了如何使用循环和累加运算来求解平均值。

12. 程序12:查找一个数组中的最大值。

这个程序演示了如何使用循环和比较操作来进行最大值查找。

13. 程序13:判断一个数是否是回文。

这个程序展示了如何使用循环和取余操作来进行数字回文判断。

14. 程序14:实现字符串拼接操作。

这个程序演示了如何使用循环和指针操作来进行字符串拼接。

15. 程序15:实现矩阵乘法运算。

这个程序展示了如何使用循环和累加运算来进行矩阵乘法。

16. 程序16:计算一个数的平方根。

这个程序演示了如何使用二分法和近似计算来求解平方根。

17. 程序17:实现字符串匹配操作。

Linux下简单C语言小程序的反汇编分析

Linux下简单C语言小程序的反汇编分析

Linux下简单C语⾔⼩程序的反汇编分析韩洋原创作品转载请注明出处《Linux内核分析》MOOC课程写在开始,本⽂为因为参加MOOC相关课程⽽写的作业,如有疏漏,还请指出。

选了⼀门Linux内核分析课程,因为阅读内核代码中或多或少要涉及到At&T汇编代码的阅读,所以这⾥写下⼀个对⼀个简单C命令⾏程序的反汇编分析过程,⼀⽅⾯完成作业,另⼀⽅⾯当作练⼿。

下⾯开始:1、编写我们的C语⾔⼩程序这⾥我们使⽤简单的例⼦,代码如下:1 #include <stdio.h>23int exG(int x)4 {5return x + 5;6 }78int exF(int x)9 {10return exG(x);11 }1213int main(void)14 {15return exF(10) + 2;16 }使⽤vim等编辑器写⼊上述代码,保存到main.c,然后使⽤下⾯命令⽣成汇编源⽂件:x86系统:$gcc -S -o main.s main.cx64系统:$gcc -m32 -S -o main.s main.c因为我们这⾥以32位平台为例⼦,所以在x64机器上要加上-m32来使GCC⽣成32位的汇编源⽂件。

2、处理源⽂件执⾏完上述命令后,当前⽬录下就会有⼀个main.s的⽂件,使⽤vim打开,不需要的链接信息[以"."开头的⾏],得到如下汇编代码:1 exG:2 pushl %ebp3 movl %esp, %ebp4 movl 8(%ebp), %eax5 addl $5, %eax6 popl %ebp7 ret8 exF:9 pushl %ebp10 movl %esp, %ebp11 pushl 8(%ebp)12 call exG13 addl $4, %esp14 leave15 ret16 main:17 pushl %ebp18 movl %esp, %ebp19 pushl $1020 call exF21 addl $4, %esp22 addl $2, %eax23 leave24 ret可以看到这个⽂件⾥是GCC帮我们⽣成的汇编代码,这⾥需要说明下AT&T格式和intel格式,这两种格式GCC是都可以⽣成的,如果要⽣成intel格式的汇编代码,只需要加上 -masm=intel选项即可,但是Linux下默认是使⽤AT&T格式来书写汇编代码,Linux Kernel代码中也是AT&T格式,我们要慢慢习惯使⽤AT&T格式书写汇编代码。

汇编语言程序设计(5)

汇编语言程序设计(5)
15
例:
第 4 章 汇编语言程序设计简介
ORG 1000H
BUF1: DB 38H, 7FH, 80H
BUF2: DB 45H, 66H
ORG伪指令指定了标号BUF1的地址为1000H, 而DB伪 指令是将其后的二进制数表38H, 7FH, 80H依次存放在1000H, 1001H, 1002H 3 个连续单元之中, BUF2也是一个标号, 其地 址与前一条伪指令连续, 即1003H, 1004H地址单元中依次存 放 45H, 66H。
如果在程序中要多次使用到某一地址,由EQU指令将其赋值 给一个字符名称,一旦需要对其进行变动,只要改变EQU命 令后面的数字即可,而不需要对程序中涉及到该地址的所有 指令逐句进行修改。
13
第 4 章 汇编语言程序设计简介
注意, 由EQU等值的字符名称必须先赋值后使用,且 在同一个源程序中,同一个标号只能赋值一次。 例:
H)=10H。
18
第 4 章 汇编语言程序设计简介
六、BIT——位地址符号指令
指令功能为:将位地址赋值给指定的符号名称,通常用于位符 号地址的定义。
指令如下:
字符名称 BIT 位地址
例如,X1 BIT P1.0
汇编结果为将位地址P1.0赋给变量X1,即在程序中便可 使用X1代替位地址P1.0。
19
(c)多分支
30
第 4 章 汇编语言程序设计简介
2. 一般分支程序结构实例
【例5】 x, y均为8位二进制数, 设 x存入R0, y存入R1, 求解:
1 y 1
0
x0 x0 x0
31
第 4 章 汇编语言程序设计简介
程序如下:
START:
CJNE R0,#00H,SUL1

ARM汇编学习笔记

ARM汇编学习笔记

这两天参加了一个编写操作系统的项目,因为要做很多底层的东西,而且这个操作系统是嵌入式的,所以开始学习ARM汇编,发现ARM汇编和一般PC平台上的汇编有很多不同,但主要还是关键字和伪码上的,其编程思想还是相同的。

现将一些学习感悟部分列出来,希望能给有问题的人一点帮助。

1、ARM汇编的格式:在ARM汇编里,有些字符是用来标记行号的,这些字符要求顶格写;有些伪码是需要成对出现的,例如ENTRY和END,就需要对齐出现,也就是说他们要么都顶格,要么都空相等的空,否则编译器将报错。

常量定义需要顶格书写,不然,编译器同样会报错。

2、字符串变量的值是一系列的字符,并且使用双引号作为分界符,如果要在字符串中使用双引号,则必须连续使用两个双引号。

3、在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同样的,当src变量代表一个数组时,需要将r0寄存器指向src 则需要这样赋值:LDR r0,=src 当格式是LDR r0,[r2],则第二个参数表示寄存器,我的理解是[]符号表示取内容,r2本身表示一个寄存器地址,取内容候将其存取r0这个寄存器中。

4、在语句:CMP r0,#numBHS stop书上意思是:如果r0寄存器中的值比num大的话,程序就跳转到stop标记的行。

但是,实际测试的时候,我发现如果r0和num相等也能跳转到stop 标记的行,也就是说只要r0小于num才不会跳转。

下面就两个具体的例子谈谈ARM汇编(这是我昨天好不容易看懂的,呵呵)。

第一个是使用跳转表解决分支转移问题的例程,源代码如下(保存的时候请将文件后缀名改为s):AREA JumpTest,CODE,READONLYCODE32num EQU 4ENTRYstartMOV r0, #4MOV r1, #3MOV r2, #2MOV r3, #0CMP r0, #numBHS stopADR r4, JumpTableCMP r0, #2MOVEQ r3, #0LDREQ pc, [r4,r3,LSL #2]CMP r0, #3MOVEQ r3, #1LDREQ pc, [r4,r3,LSL #2]CMP r0, #4MOVEQ r3, #2LDREQ pc, [r4,r3,LSL #2]CMP r0, #1MOVEQ r3, #3LDREQ pc, [r4,r3,LSL #2]DEFAULTMOVEQ r0, #0SWITCHENDstopMOV r0, #0x18LDR r1, =0x20026SWI 0x123456JumpTableDCD CASE1DCD CASE2DCD CASE3DCD CASE4DCD DEFAULTCASE1ADD r0, r1, r2B SWITCHENDCASE2SUB r0, r1, r2B SWITCHENDCASE3ORR r0, r1, r2B SWITCHENDCASE4AND r0, r1, r2B SWITCHENDEND程序其实很简单,可见我有多愚笨!还是简要介绍一下这段代码吧。

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

---------程序sy3-1:实现从键盘输入一位数字,判断其奇偶性。

并在屏幕上输出一个标志,若为奇数,则输出1;否则输出0。

---------如果输入的不是数字,则显示字符串“ERROR”。

DATAS SEGMENTSTRING DB "ERROR$" ;定义字符串FLAG DB ? ;设置奇偶标志DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV FLAG,'1' ;给标志位FLAG赋初值MOV AH,01HINT 21H ;接收键盘输入一位数CMP AL,30HJB ERRCMP AL,39HJA ERRTEST AL,01H ;测试,根据最后一位判断奇偶性JNZ OUTPUT ;不为0则为奇数MOV FLAG,'0'OUTPUT:MOV DL,FLAGMOV AH,02HINT 21H ;输出标志位JMP EXITERR: ;显示字符串MOV DX,OFFSET STRINGMOV AH,9INT 21HEXIT:MOV AH,4CHINT 21HCODES ENDSEND START;---------程序sy3-2:根据用户输入的星期几数字代号(0代表星期天),在屏幕上显示相应的英文缩写名。

DATAS SEGMENTs0 db "Sun$"S1 DB "Mon$"S2 DB "Tue$"S3 DB "Wed$"S4 DB "Thu$"S5 DB "Fri$"S6 DB "Sat$"ADDR_TABLE DW S0,S1,S2,S3,S4,S5,S6 ;定义地址表DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV AH,1INT 21H ;接受键盘输入CMP AL,30HJB EXITCMP AL,36H ;不是数字0~6,则退出程序JA EXITSUB AL,30H ;转变为数字MOV BL,2MUL BL ;数字乘以2的结果是在地址表中的相应位置的偏移值MOV BX,AX ;将输入的数字转换为地址表中的偏移地址MOV DX,ADDR_TABLE[BX] ;取地址表中的相应内容(即DX为字符串的偏移地址)MOV AH,9INT 21H ;显示字符串EXIT:MOV AH,4CHINT 21HCODES ENDSEND START;-------------SY4-1.ASM: 该程序计算1~100的和并用十进制的形式在屏幕上显示出来。

code segmentassume cs:codestart:mov cx,100mov ax,0mov bx,1s:add ax,bx ;循环累加求和inc bxloop smov bx,ax ;将显示bx的值;----------下面程序段的功能是以十进制形式显示BX的内容MOV SI,10000 ;因为BX〈65536,循环处理5次MOV CX,5ROTATE:MOV AX,BXMOV DX,0 ;被除数送(DX,AX)DIV SI ;除数MOV BX,DX ;余数要作为下一步的被除数MOV DL,ALADD DL,30HMOV AH,2 ;显示商(即对应位上的数字)INT 21HMOV AX,SIMOV DX,0MOV DI,10DIV DI ;把除数除以10后的商作为下一步的除数MOV SI,AX ;改变除数LOOP ROTATEmov ah,4chint 21h ;返回DOScode endsend startDATA SEGMENTSTRING1 DB 'Move the cursor Backward.'STRING2 DB 'Move the cursor backward.'MESS1 DB 'Mactch.',13,10,'$'MESS2 DB 'No match!',13,10,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,-1 ;SI要记录不匹配的位置MOV CX,25S: INC SIMOV AL,STRING1[SI]CMP AL,STRING2[SI] ;循环比较LOOPZ SJZ MATCH ;相等则匹配LEA DX,MESS2JMP DISPMATCH:LEA DX,MESS1DISP:MOV AH,9INT 21H ;显示字符串MOV AH,4CHINT 21HCODE ENDSEND STARTDATA SEGMENTSTRING1 DB 'Move the cursor Backward.'STRING2 DB 'Move the cursor Backward.'MESS1 DB 'Mactch.',13,10,'$'MESS2 DB 'No match!',13,10,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX ;源串段地址MOV ES,AX ;目的串段地址MOV SI,OFFSET STRING1 ;源串偏移地址MOV DI,OFFSET STRING2 ;目的串偏移地址MOV CX,25 ;串长度CLD ;方向标志位REPZ CMPSB ;相等则重复比较,遇到不相等的则退出JZ MATCH ;如果退出串比较后,zf=1表示整个字符串都比较完了都相等则匹配LEA DX,MESS2JMP DISPMATCH:LEA DX,MESS1DISP:MOV AH,9INT 21H ;显示字符串MOV AH,4CHINT 21HCODE ENDSEND START;-------------该程序实现找到10个学生成绩数组中最大值并在屏幕上显示;-------------统计小于60的个数,即不及格的人数并显示。

;-------------计算数组平均值(取整数部分,即平均成绩)并显示DATAS SEGMENTGRADE DB 76,68,54,80,45,92,63,58,94,85 STR1 DB "The highest score:$"STR2 DB "the number of failing:$"STR3 DB "average:$"DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV SI,0MOV DX,OFFSET STR1CALL OUTSTRCALL MAXS ;调用比较找最大值MOV BX,0MOV BL,AL ;将最大值送BXCALL BINIDEC ;调用二进制转十进制输出BXCALL CRLF ;调用显示回车换行MOV DX,OFFSET STR2CALL OUTSTRCALL BJG ;调用统计不及格人数MOV BH,0CALL BINIDEC ;以十进制显示不及格人数CALL CRLFMOV DX,OFFSET STR3CALL OUTSTRCALL AVG ;调用求平均值MOV BX,0MOV BL,AL ;将平均值送BXCALL BINIDEC ;以十进制显示平均值MOV AH,4CHINT 21H;-----------子程序OUTSTR:显示字符串。

OUTSTR PROC NEARMOV AH,9INT 21HRETOUTSTR ENDP;-----------子程序AVG:求数组平均值,出口参数为AL。

AVG PROC NEARMOV AX,0MOV SI,0MOV CX,10S: ADD AL,GRADE[SI]ADC AH,0INC SILOOP SMOV BL,10DIV BLRETAVG ENDP;-----------子程序BJG: 统计不及格人数,出口参数为BL。

BJG PROC NEARMOV CX,10MOV AL,60MOV BX,0COM:CMP AL,GRADE[SI]JlE NEXTINC BXNEXT:INC SILOOP COMRETBJG ENDP;-----------子程序MAXS:通过比较找到最大值,出口参数为AL。

MAXS PROC NEARMOV SI,0MOV CX,9 ;设置比较次数MOV Al,GRADE[SI]LOOP1:INC SICMP GRADE[SI],ALJBE CONTINIU1MOV AL,GRADE[SI] ;保存大值CONTINIU1:LOOP LOOP1RETMAXS ENDP;---------------子程序将bx的内容转换为十进制输出到屏幕BINIDEC PROC NEARMOV SI,10000 ;BX〈65536,循环处理5次MOV CX,5ROTATE:MOV AX,BXMOV DX,0 ;被除数送(DX,AX)DIV SI ;除数MOV BX,DX ;余数要作为下一步的被除数MOV DL,ALADD DL,30HMOV AH,2 ;显示商(即对应位上的数字)INT 21HMOV AX,SIMOV DX,0MOV DI,10DIV DI ;把除数除以10后的商作为下一步的除数MOV SI,AX ;改变除数LOOP ROTATERETBINIDEC ENDP;------------显示回车换行CRLF PROC NEARPUSH AXPUSH DXMOV AH,2MOV DL,0DHINT 21HMOV DL,0AHINT 21HPOP DXPOP AXRETCRLF ENDPCODES ENDSEND START;-------------程序功能:输入表达式,实现500以内的十进制数的加减运算;-------------定义宏:显示以$结束的字符串outstring macro mesmov dx, offset mesmov ah,9int 21hendm;------------设置提示符DATAS SEGMENTmes1 db 'please input the first operand:$'mes2 db 'please input the second operand:$'mes3 db 'please input the operator:$'mes4 db 'output the Calculated Results:$'mes5 db 'first Data of more than 500, please enter again!$'mes6 db 'second Data of more than 500, please enter again!$'mes7 db 'Operator input error, please enter again!$'DATAS ENDSSTACK SEGMENTDW 50 DUP (0)TOS LABEL WORDSTACK ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSTART:MOV AX,DATASMOV DS,AXMOV AX,STACKMOV SS,AXMOV SP,OFFSET TOSs1:outstring mes1 ;输出提示菜单call decibin ;接收键盘十进制输入,以任意非十进制数码结束输入cmp bx,500ja err1 ;控制操作数不大于500push bxcall crlf ;换行jmp s2err1:call crlfoutstring mes5 ;输出错误提示call crlfjmp s1s2: outstring mes2call decibincmp bx,500ja err2push bxcall crlfjmp s3err2:call crlfoutstring mes6call crlfjmp s2s3:outstring mes3mov ah,1 ;输入操作符int 21hmov bl,alcmp bl, '+'jne c1pop axpop bxadd bx,ax ;做加法call crlfoutstring mes4jmp dispc1:cmp bl,'-'jne errcall crlfoutstring mes4pop axpop bxsub bx,ax ;做减法jns dispmov dl,'-'mov ah,2int 21h ;输出负号neg bx ;求绝对值disp:call binidec ;显示运算结果jmp quiterr:call crlfoutstring mes7 ;操作符错误提示call crlfjmp s3quit:MOV AH,4CHINT 21H;------------------------- decibin proc nearmov bx, 0 newchar:mov ah, 1int 21hsub al, 30hjl exitcmp al, 9jg exitcbwxchg ax, bxmov cx, 10mul cxadd bx, axjmp newcharexit: retdecibin endp;-------------------------- binidec proc nearcmp bx,10000djae div1cmp bx,1000djae div2cmp bx,100djae div3cmp bx,10djae div4jmp div5div1: mov cx, 10000dcall dec_divdiv2: mov cx, 1000dcall dec_divdiv3: mov cx, 100dcall dec_divdiv4: mov cx, 10dcall dec_divdiv5: mov cx, 1dcall dec_divretbinidec endp;--------------------------dec_div proc nearmov ax, bxmov dx, 0div cxmov bx, dxmov dl, aladd dl, 30hmov ah, 2int 21hretdec_div endp;-----------------------crlf proc nearmov dl,13mov ah,2int 21hmov dl,10mov ah,2int 21hretcrlf endp;-----------------CODES ENDSEND START;------------程序功能:采用位触发方式控制扬声器发声。

相关文档
最新文档