汇编 数组排列

合集下载

risc-v汇编 对5个整数的排序

risc-v汇编 对5个整数的排序

risc-v汇编对5个整数的排序在RISC-V汇编语言中,对5个整数进行排序可以使用简单的冒泡排序算法。

以下是一个示例代码:```assembly# 定义5个整数.datanum1 .word 5num2 .word 3num3 .word 7num4 .word 1num5 .word 6# 定义排序函数.text.globl _start_start:# 将5个整数存储到寄存器中la a0, num1 # a0 -> num1la a1, num2 # a1 -> num2la a2, num3 # a2 -> num3la a3, num4 # a3 -> num4la a4, num5 # a4 -> num5# 调用冒泡排序函数jal sort_bubble# 打印排序后的结果li v0, 1 # 系统调用码:输出整数li t0, 10 # t0 -> 10 (要打印的数字)syscall # 执行系统调用li v0, 10 # 系统调用码:退出程序syscall # 执行系统调用# 冒泡排序函数sort_bubble:# 将5个整数从内存中复制到寄存器中lw a0, 0(a0) # a0 -> num1lw a1, 0(a1) # a1 -> num2lw a2, 0(a2) # a2 -> num3lw a3, 0(a3) # a3 -> num4lw a4, 0(a4) # a4 -> num5# 对5个整数进行冒泡排序sort_loop:# 比较a0和a1,如果a0大于a1,则交换它们的位置blt a0, a1, end_sort_loop # 如果a0小于a1,则跳转到end_sort_loopsw a0, 0(a1) # 将a0的值存储到a1所指向的内存中sw a1, 0(a0) # 将a1的值存储到a0所指向的内存中jr a6 # 返回地址:跳转到sort_loop: (返回值是a6)end_sort_loop: # 结束比较和交换操作jr a6 # 返回地址:跳转到sort_loop: (返回值是a6)jr a6 # 返回地址:跳转到sort_loop: (返回值是a6)jr a6 # 返回地址:跳转到sort_loop: (返回值是a6)jr a6 # 返回地址:跳转到sort_loop: (返回值是a6)jr a6 # 返回地址:跳转到sort_loop: (返回值是a6)jr ra # 返回地址:跳转到调用者(返回值是ra)```。

汇编冒泡法排序

汇编冒泡法排序

汇编实验报告实验题目:从键盘输入任意5个2位有符号十进制数,采用“冒泡法”进行升序排序,输出排序后的结果,并输出排序次数。

实验设计:实验要求用16位机的汇编语言完成,键盘上输入的的数据最终都会以ASCII码形式接受,输出也要求用ASCII码,因而我决定设计专门负责输入和输出的两个子程序。

但是由于要求输入的是有符号的而且是长度不一定不确定的十进制数,用一个子程序直接在输入时转换成二进制会比较麻烦,因而决定可以先以字符串的形式接受来自用户的数据,这样可以以最自由的形式接受数据,不仅数据长度问题可以解决,带不带‘+’‘-’符号也可以识别,而且方便查错。

排序的主要部分是比较简单的,学C的时候已经了解,况且数据结构课又重复了一遍,因而本次实验主要需要解决的还是输入输出、以及数据的转化问题。

我的程序结构比较简单,主要包含几个子程序:GET : 调用10号模块接收一串字符,放进缓存dataEXDTB:解析缓存中的符号数据,转化为二进制并存入数组ansEXBTD:对从BX传过来的二进制数解析,并在屏幕上输出相应的十进制数,无运算结果程序:DATAS SEGMENTDATA DB 21 DUP('$')ANS DW 10 DUP(0)TES DB 'RUN HRER','$'LEN DW 0TMP DW 0SIG DW 00HSTA DW 00H ;STA ANS[STA] IS DIGENT DB 0DH,0AH,'$'RNM DB 'READ 5 DIGITALS',0AH,0DH,'$'PRIT DB 'PAIXU:',0AH,0DH,'$'FINSH DB 'NEW ORDER:','$'EORR DB 'INPUT ERROR!',0AH,0DH,'$'CISHU DB 'EXCHANGE TIME:',0DH,0AH,'$'CIS DW 0EXIT DB 'ENTER A NUMBER TO EXIT',0AH,0DH,'$'DATAS ENDSSTACK SEGMENTTOPE DW 300H DUP(0)STACK ENDSCODES SEGMENTASSUME CS:CODES, DS:DATAS,SS:STACKSTART: ;先跳过写在开头的子程序MOV AX,DATASMOV DS,AXMOV AX,STACKMOV SS,AXMOV SP,00HJMP SART ;AH=09 OUPUT AH=10 INPUT,前面注意有两个字节没用从ds:dx+2开始才是 ;第一个是输入及字符数ENTE PROC ;ENTE DISPLAY '/N' ON THE SCREENPUSH AXPUSH DXMOV AX,OFFSET ENTMOV DX,AXMOV AH,09HINT 21HPOP DXPOP AXRETENTE ENDPGET PROC ;PROC GET READ A TWO BIT DIGITAL FROM USCERPUSH AX ;;DX HAS ADDRESSPUSH DXMOV DX,OFFSET DATAMOV AH,0AH ;GET A LINE OF NUMBERINT 21H;CALL ENTEPOP DXPOP AXRETGET ENDPEXDTB PROC ;PROC EXCHANGE SIGNED DIGITAL TO BINARYPUSH AXPUSH BXPUSH CXPUSH DX ;USE DX TO STORE ANS;ANS[STA] HAS RESULT XOR DX,DXXOR CX,CXMOV BX,OFFSET DATAINC BX ;DS:DX+1 IS THE NUMBER OF INPUTED CHAR MOV CL,[BX] ;cl HAS LENGTHXOR CH,CHINC BX ;NOW BX COME TO FIRST CHAR INPUTEDMOV AL,[BX]CMP AL,'-' ;TO CHECK IF IT IS SIGNJNZ POST ;WITHOUT '-',THAT WILL BE POSTIVEMOV WORD PTR[SIG], 0001H ;SET SIG 0001H IF NEGETIVE JMP SIGNEDPOST:MOV SIG,WORD PTR 0000H ;SET POSTIVECMP AL,'+' ;IF IT HAS '+',IGNORE ITJNE PASSSIGNED:INC BXSUB CX,01HJMP STLOP ;PASS THE SIGN + -PASS: ;DIRECTLY TO NUMBERSCMP AL,'0' ;IF IT IS NUMBERJL NOTHINGCMP AL,'9'JG NOTHINGMOV DL,ALSUB DL,'0'CMP CL,1JE POSTYSUB CX,01HSTLOP:MAINLOOP:MOV AL,[BX]SUB AL,'0'JS NOTHING ;JUMP IF AL-'0'< 0 , ILLEAGLE INPUT CMP AL,09H ;JUMP IF AL-'9'> 0 ,JG NOTHINGMOV DH,DL ;SHIFT DL TO TIMES 10SHL DH,01H ;SHIFT 2 TIMES 4SHL DH,01H ;DL=DL*4+DL=5*DLADD DL,DHSHL DL,01H ;DL=5*DL*2=10*DLADD DL,ALINC BXLOOP MAINLOOPTEST SIG,0001HJZ POSTY ;JUMP TO AVOID -DXNEG DLPOSTY:MOV BX,OFFSET ANSADD BX,STAMOV AL,DLCBWMOV [BX],AXJMP DONENOTHING: ;IF NOT NUMBER , RETURN 0MOV DX,OFFSET EORRMOV AH,09HINT 21HMOV BX,OFFSET ANSADD BX,STAMOV [BX],WORD PTR 0001HDONE:CALL ENTEPOP CXPOP BXPOP AXRETEXDTB ENDPEXBTD PROC ;PROC EXCHANGE BINARY NUMBER IN BX TO DIGITAL PUSH AXPUSH BXPUSH CXPUSH DXCALL ENTE ;DISPLAY '/N'TEST BX,8000HJZ POSTVMOV DL,'-'MOV AH,02HINT 21HNEG BX ;EXCHANGE TO POSTIVEPOSTV:MOV CX,1111HPUSH CXMOV AX,BXCWDMOV BX,10MLOOP:DIV BX ;DIV 10PUSH DX ;PUSH BX MOD 10CWDADD AX,00HJNZ MLOOPDSLOOP: ;DISPLAY NUMPOP DXCMP DX,1111HJE FINISHADD DL,'0'MOV AH,02HINT 21HJMP DSLOOPFINISH:;CALL ENTEPOP DXPOP CXPOP BXPOP AXRETEXBTD ENDPSART:MOV DX,OFFSET PRITMOV AH,09HINT 21HMOV DX,OFFSET RNMMOV AH,09INT 21HMOV CX,05HMOV WORD PTR[STA],0000HGETLOOP:CALL GET ;读入符号数CALL EXDTB ;转为二进制ADD WORD PTR[STA],0002H;存入数组ans LOOP GETLOOPMOV WORD PTR[CIS],00HARRAGE: ;排序MOV CX,05HSUB CX,0001HMOV BX,OFFSET ANSADD BX,CXADD BX,CXLOOP1:MOV TMP,CXPUSH BXLOOP2:MOV AX,WORD PTR[BX]SUB BX,0002HMOV DX,WORD PTR[BX]CMP AX,DXJNS BIGGERINC WORD PTR[CIS]MOV WORD PTR[BX],AXMOV 02H[BX],DXBIGGER:SUB WORD PTR[TMP],0001H JNZ LOOP2POP BXLOOP LOOP1WRITE: ;输出排好序的数MOV DX,OFFSET FINSHMOV AH,09HINT 21HMOV CX,05MOV WORD PTR[STA],0000HMOV BX,OFFSET ANSLOOPWR:PUSH BXADD BX,STAMOV DX,[BX]MOV BX,DXCALL EXBTDPOP BXADD WORD PTR[STA],0002HLOOP LOOPWRCALL ENTEMOV DX,OFFSET CISHUMOV AH,09HINT 21HMOV BX,[CIS]CALL EXBTDCALL ENTEMOV DX,OFFSET EXITMOV AH,09HINT 21HCALL GETMOV AX,4C00HINT 21HCODES ENDSEND START问题及调试:主要问题是数据的转化,当我们用C写程序时,直接可以用%开头的格式命令进行特定类型的数据输入输出,但是用汇编时就没有那么好办了,输入的时候要识别数据,输出也要转化数据。

MCS-51单片机指令系统与汇编语言程序设计

MCS-51单片机指令系统与汇编语言程序设计
JBC bit, rel ; 若(bit)=1,则转移(PC)← (PC)+3+rel, 且(bit )←0, 否则顺序执行
docin/sundae_meng
P73 例2.58
ORG 0100H
MOV DPTR,#DATA LOOP2: MOV R1,A
MOV R0,#30H
INC R1
MOV R1,#40H LOOP: MOVX A,DPTR
START:
ORG 1000H MOV DPTR,#TABLE MOV A,20H ANL A,#0FH MOVC A,@A+DPTR MOV 21H,A
docin/sundae_meng
TABLE:
MOV A,20H ANL A,#0F0H
SWAP A MOVC A,@A+DPTR MOV 22H, A SJMP $ DB 30H,31H,32H,33H,34H
docin/sundae_meng
ORG 1000H
START: MOV A, 40H
; 将X送入A中
JZ COMP
; 若A为0,转至COMP处
JNB ACC.7, POST ; 若A第7位不为1(X为正数),则程序转到
POST处,否则(X为负数)程序往下执行
MOV A, #0FFH ; 将1(补码)送入A中
docin/sundae_meng
2.4.1 汇编语言程序设计的步骤
汇编语言程序设计:根据任务要求,采用汇编语言编制程序的过程称为汇编 语言程序设计。 汇编语言程序设计的步骤: (1)拟订设计任务书 (2)建立数学模型 (3)确定算法 (4)分配内存单元,编制程序流程图 (5)编制源程序
进一步合理分配存储器单元和了解I/O接口地址;按功能设计程序,明确 各程序之间的相互关系;用注释行说明程序,便于阅读和修改调试和修改。 (6)上机调试 (7)程序优化

51汇编实现比较三个数的大小,并排序.doc

51汇编实现比较三个数的大小,并排序.doc

51汇编实现比较三个数的大小,并排序.doc例题1:比较三个无符号数的大小,按照从大到小的顺序排列关键的语句是:无符号数,因此所用语句是JAE实现跳转:此外比较两个操作数所用的是CMP,交换两个操作数的是XCHG 书上的代码:代码1:这样写法比较占用寄存器,但是寄存器之间交换数值比较快代码2:这样的写法只用了AL,但是寄存器与存储器操作数指教的操作比较慢例题2:写一个实现一位十六进制的数转换为对应的ASCII码的程序;程序功能,实现16进制数值转换成对应的ASCII码;原理:但十六进制数值为0到9的时候,对应的ASCII=x+30H ;当十六进制为10到15的时候,对应的ASCII=x+37H这里关键的语句是JA,大于9的话,转移之后便是程序跳转指令:JMP,但标号很多的时候,可以用LAB1,LAB2,LAB3这种类型的标号例题3:写一个程序实现ASCII转换成对应的十六进制利用地址表实现多向分支当要根据某个变量的值,进行多种不同的处理时,就会产生了多向分支,多向分支在高级语言中常常用switch实现,在汇编语言中是使用地址表实现的DSEGSEGMENT……………………COMTABDWCOMA,COMB,COMC,COMDDWCOME,COMF,COMG,COMHDSEGENDS……………………计算如果地址表内的地址,之后调用路口地址表即可之后跳转指令用这个JMPCOMTAB[BX]循环程序设计:例题1:用计数法控制循环本例程中所用的关键指令为LOOP,LOOP指令使用的方法是在初始化CX的初值,每次执行一次LOOP,CX寄存器会减一此外,还用了SI这个源地址指针,因为定义的变量时字,所以SI在循环的时候,调用了两次INC,在得到校验和的时候,重新设置了数据段寄存器,以便于保存校验和。

例题2:不用乘法指令实行乘法运算假设乘法时234*125,不用乘法指令,可以有移位和累加两种方法方法一:累加,可以看成是125个234相加,因此循环的时候,循环次数是CX=125,这里用的指令时XOR,自己和自己异或等于0,还有JCXZ这条指令,JCXZ表示但cx寄存器为0的时候跳转。

汇编破难案例

汇编破难案例

汇编破难案例全文共四篇示例,供读者参考第一篇示例:汇编破难案例随着信息技术的发展,计算机程序设计的能力和范围得到了极大的提升。

在计算机编程领域中,汇编语言一直被认为是一门重要的编程语言,它直接反映了计算机底层的硬件结构和运行原理,具有高效、灵活的特点。

由于其语法复杂、难以理解和学习的特点,汇编破难一直是学习者面临的挑战之一。

在实际的编程实践中,我们经常会遇到一些困难和挑战,其中包括在处理一些复杂的问题时需要使用汇编语言来解决。

在这篇文章中,我将分享一些关于汇编破难的案例,通过这些案例展示汇编语言是如何帮助我们解决问题的,以及如何应对汇编语言编程中的一些困难。

案例一:最大公约数在计算机编程中,寻找两个数的最大公约数是一个经典的问题。

虽然在高级编程语言中可以很容易地实现这一功能,但是在汇编语言中实现这个功能可能需要花费更多的时间和精力。

为了解决这个问题,我们需要使用一种高效的算法来计算两个数的最大公约数。

一个常见的求最大公约数的算法是辗转相除法,其基本思想是利用两个数的除法余数的周期性规律,不断地缩小问题规模,直到两个数可以整除,得到最终的最大公约数。

在汇编语言中,我们可以通过编写一段适当的循环代码来实现这个算法,进而完成最大公约数的计算。

以下是一个简单的用汇编语言实现最大公约数的示例代码:```assembly.datanum1 dd 36num2 dd 24result dd 0通过这段代码,我们可以看到如何利用汇编语言的基本指令和逻辑控制结构来实现最大公约数的计算。

尽管这段代码看起来比较简单,但是实际上需要对汇编语言的指令和逻辑有一定的了解,才能够正确地理解和编写这段代码。

这个案例展示了在面对一些复杂的算法和问题时,汇编语言可以提供一种高效的解决方案。

案例二:图像处理另一个常见的汇编破难案例是图像处理。

在现代计算机图形学中,图像处理是一个非常重要的领域,涉及到图像的加载、处理、显示等多个方面。

IBM-PC汇编语言程序设计课后习题答案

IBM-PC汇编语言程序设计课后习题答案

第五章试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。

答:程序段如下:BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用INT 21HCMP AL, ‘a’ ;输入字符<‘a’吗JB STOPCMP AL, ‘z’ ;输入字符>‘z’吗JA STOPSUB AL, 20H ;转换为大写字母,用AND AL, 1101 1111B也可MOV DL, AL ;显示一个字符的DOS调用MOV AH, 2INT 21HJMP BEGINSTOP: RET编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。

答:程序段如下:BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用INT 21HCMP AL, ‘a’ ;输入字符<‘a’吗JB STOPCMP AL, ‘z’ ;输入字符>‘z’吗DEC AL ;得到前导字符MOV DL, AL ;准备显示三个字符MOV CX, 3DISPLAY: MOV AH, 2 ;显示一个字符的DOS调用INT 21HINC DLLOOP DISPLAYSTOP: RET将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL和DL中。

答:程序段如下:DSEG SEGMENTSTORE DB 4 DUP ()DSEG ENDS┇BEGIN: MOV CL, 4 ;右移四次MOV CH, 4 ;循环四次LEA BX, STOREA10: MOV DX, AXAND DX, 0FH ;取AX的低四位MOV [BX], DL ;低四位存入STORE中INC BXSHR AX, CL ;右移四次JNZ A10 ;循环四次完了码B10: MOV DL, STORE ;四组数分别放在AL、BL、CL和DL中MOV CL, STORE+1MOV BL, STORE+2MOV AL, STORE+3STOP: RET试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示‘MATCH’,若不相同则显示‘NO MATCH’。

汇编语言及编程实例(电子教案)

汇编语言及编程实例(电子教案)

汇编语言及编程实例(电子教案)汇编语言程序设计2005第四章汇编语言程序设计回顾:8086的内部结构、寄存器功能和工作过程,指令格式、寻址方式和功能。

本讲重点:了解汇编的概念及其方法,掌握汇编程序的基本格式,常用运算符的使用方法,汇编的步骤。

4.1汇编语言的基本元素一、汇编语言的语句格式由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。

每个语句由1~4个部分组成,其格式是:[标号]指令助记符[操作数][;注解]其中用方括号括起来的部分,可以有也可以没有。

每部分之间用空格(至少一个)分开,一行最多可有132个字符。

1.标识符给指令或某一存储单元地址所起的名字。

可由下列字符组成:字母:A~z;数字:0~9;特殊字符:、·、@、一、$数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。

标识符最长为31个字符。

当标识符后跟冒号时,表示是标号。

它代表该行指令的起始地址;当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。

2.指令助记符表示不同操作的指令,可以是8086的指令助记符,也可以是伪指令。

3.操作数指令执行的对象。

依指令的要求,可能有一个、两个或者没有,例如:RET;无操作数COUNT:INCC某;一个操作数如果是伪指令,则可能有多个操作数,例如:COSTDB3,4,5,6,7;5个操作数MOVA某,[BP+4];第二个操作数为表达式4.注解该项可有可无,是为源程序所加的注解,用于提高程序的可读性。

二、汇编语言的运算符1.算术运算符、逻辑运算符和关系运算符-1-汇编语言程序设计2005算术运算符可以应用于数字操作数,结果也是数字。

而应用于存储器操作数时,只有+、-运算符有意义。

2.取值运算符SEG、OFFSET、TYPE、SIZE和LENGTH·SEG和OFFSET分别给出一个变量或标号的段地址和偏移量。

例如,定义:SLOTDW25则:MOVA某,SLOT;从SLOT地址中取一个字送入A某MOVA某,SEGSLOT;将SLOT所在段的段地址送入A某MOVA某,OFFSETSLOT;将SLOT所在段的段内偏移地址送A某·TYPE操作符返回一个表示存储器操作数类型的数值。

(七)汇编功能

(七)汇编功能

今天我们的目标程序是 MyUninstaller 1.34 版。

这是一个非常小的程序卸载工具,VC6编写,大小只有6 1K。

我拿到的这个是上次闪电狼兄弟给我的,附带在里面的简体中文语言文件是由六芒星制作的。

这个程序有个毛病:就是在列出的可卸载程序上双击查看属性时,弹出的属性窗口的字体非常难看,应该就是系统字体(SYSTEM_FONT):我们今天的目标就是利用 OllyDBG 的汇编功能把上面显示的字体改成我们常见的9号(小五)宋体。

首先我们用 OllyDBG 载入程序,按 CTR+N 组合键查找一下有哪些 API 函数,只发现一个和设置字体相关的CreateFontIndirectA。

现在我们按鼠标右键,选择“在每个参考上设置断点”,关掉名称对话框,F9运行,程序已经运行起来了。

我们在程序的列表框中随便找一项双击一下,很不幸,那个字体难看的界面又出现了,OllyDBG 没有任何动作。

可见创建这个窗口的时候根本没调用 CreateFontIndirectA,问题现在就变得有点复杂了。

先点确定把这个字体难看的对话框关闭,现在我们从另一个方面考虑:既然没有调用设置字体的函数,那我们来看看这个窗口是如何创建的,跟踪窗口创建过程可能会找到一些对我们有用的信息。

现在我们再回到我们调试程序的领空,按 CTR+N 看一下,发现 CreateWindowExA 这个 API 函数比较可疑。

我们在 CreateWindowExA 函数的每个参考上设上断点,在 MyUninstaller 的列表框中再随便找一项双击一下,被 OllyDBG 断下:00408F5E |. FF15 98B24000 |CALL DWORD PTR DS:[] ; \断在这里上下翻看一下代码:00408F3B |. 50 |PUSH EAX ; |hInst00408F3C |. 8B45 C0 |MOV EAX,DWORD PTR SS:[EBP-40] ; |00408F3F |. 6A 00 |PUSH 0 ; |hMenu = NULL00408F41 |. 03C6 |ADD EAX,ESI ; |00408F43 |. FF75 08 |PUSH DWORD PTR SS:[EBP+8] ; |hParent00408F46 |. FF75 D0 |PUSH DWORD PTR SS:[EBP-30] ; |Height00408F49 |. 57 |PUSH EDI ; |Width00408F4A |. 50 |PUSH EAX ; |Y00408F4B |. FF75 BC |PUSH DWORD PTR SS:[EBP-44] ; |X00408F4E |. FF75 EC |PUSH DWORD PTR SS:[EBP-14] ; |Style00408F51 |. 68 80DE4000 |PUSH myuninst.0040DE80 ; |WindowName = "" 00408F56 |. 68 DCD94000 |PUSH myuninst.0040D9DC ; |Class = "STATIC" 00408F5B |. FF75 D4 |PUSH DWORD PTR SS:[EBP-2C] ; |ExtStyle00408F5E |. FF15 98B24000 |CALL DWORD PTR DS:[] ; \断在这里00408F64 | 6A 00 |PUSH 0 ; 第一处要修改的地方00408F66 | 8945 F4 |MOV DWORD PTR SS:[EBP-C],EAX00408F69 |. E8 A098FFFF |CALL00408F6E |. 50 |PUSH EAX ; |hInst00408F6F |. 8B45 DC |MOV EAX,DWORD PTR SS:[EBP-24] ; |00408F72 |. 6A 00 |PUSH 0 ; |hMenu = NULL00408F74 |. 03F0 |ADD ESI,EAX ; |00408F76 |. FF75 08 |PUSH DWORD PTR SS:[EBP+8] ; |hParent00408F79 |. FF75 CC |PUSH DWORD PTR SS:[EBP-34] ; |Height00408F7C |. 53 |PUSH EBX ; |Width00408F7D |. 56 |PUSH ESI ; |Y00408F7E |. FF75 D8 |PUSH DWORD PTR SS:[EBP-28] ; |X00408F81 |. FF75 E8 |PUSH DWORD PTR SS:[EBP-18] ; |Style00408F84 |. 68 80DE4000 |PUSH myuninst.0040DE80 ; |WindowName = "" 00408F89 |. 68 D4D94000 |PUSH myuninst.0040D9D4 ; |Class = "EDIT" 00408F8E |. FF75 B8 |PUSH DWORD PTR SS:[EBP-48] ; |ExtStyle00408F91 |. FF15 98B24000 |CALL DWORD PTR DS:[] ; \CreateWindowExA00408F97 | 8945 F0 |MOV DWORD PTR SS:[EBP-10],EAX ; 第二处要修改的地方00408F9A | 8B45 F8 |MOV EAX,DWORD PTR SS:[EBP-8]00408F9D |. FF30 |PUSH DWORD PTR DS:[EAX] ; /00408F9F |. 8D85 B0FEFFFF |LEA EAX,DWORD PTR SS:[EBP-150] ; |00408FA5 |. 68 D0D94000 |PUSH myuninst.0040D9D0 ; |format = "%s:" 00408FAA |. 50 |PUSH EAX ; |s00408FAB |. FF15 90B14000 |CALL DWORD PTR DS:[] ; \sprintf00408FB1 |. 8B35 84B24000 |MOV ESI,DWORD PTR DS:[] ; USER32.SetWindowTextA00408FB7 |. 83C4 0C |ADD ESP,0C00408FBA |. 8D85 B0FEFFFF |LEA EAX,DWORD PTR SS:[EBP-150]00408FC0 |. 50 |PUSH EAX ; /Text00408FC1 |. FF75 F4 |PUSH DWORD PTR SS:[EBP-C] ; |hWnd00408FC4 |. FFD6 |CALL ESI ; \SetWindowTextA00408FC6 |. 8D85 ACFAFFFF |LEA EAX,DWORD PTR SS:[EBP-554]00408FCC |. 50 |PUSH EAX ; /Arg300408FCD |. FF75 FC |PUSH DWORD PTR SS:[EBP-4] ; |Arg200408FD0 |. FF35 00EF4000 |PUSH DWORD PTR DS:[40EF00] ; |Arg1 = 00BEADCC 00408FD6 |. E8 1884FFFF |CALL ; \sub_4013F300408FDB |. 83C4 0C |ADD ESP,0C00408FDE |. 50 |PUSH EAX00408FDF |. FF75 F0 |PUSH DWORD PTR SS:[EBP-10]00408FE2 |. FFD6 |CALL ESI00408FE4 |. FF45 FC |INC DWORD PTR SS:[EBP-4]00408FE7 |. 8345 F8 14 |ADD DWORD PTR SS:[EBP-8],1400408FEB |. 837D FC 0F |CMP DWORD PTR SS:[EBP-4],0F00408FEF |.^ 0F8C 32FFFFFF \JL00408FF5 |. 5F POP EDI00408FF6 |. 5E POP ESI00408FF7 |. 5B POP EBX00408FF8 |. C9 LEAVE00408FF9 \. C3 RETN我想上面的代码我不需多做解释,OllyDBG 自动给出的注释已经够清楚的了。

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

课程实验报告
课程名称:微机原理与汇编语言
实验项目名称:数组排序程序设计
专业班级:08511
姓名:
学号:
指导教师:
完成时间:2009 年10 月13 日
计算机科学与工程系
实验题目:数组排序程序设计
实验目的及要求:
1 掌握汇编语言中数组的使用方法。

2 掌握汇编语言中双重循环的编程技巧。

所需实验环境:
硬件环境:目前8086汇编语言程序一般多在IBMPC/XT及其兼容机上运行,因此要求及其具有一些基本配置就可以了,汇编语言对机器硬件环境没有特殊要求。

软件环境:指支持汇编语言程序运行和帮助建立汇编语言程序的一些软件,主要包括:DOS操作系统,编辑程序,行编辑程序,汇编程序,连接程序,调试程序。

实验内容、过程及结果:
一、实验内容
1 在内存中有一个含有若干无符号字节数据的数组。

2 要求编写程序将其从小到大排序,排序后仍放回原位置。

二、编写思路
1 选择一种合适的排序算法。

数组排序的方法有直接插入法、冒泡法和选择方法等。

2 确定操作过程中使用的数据指针。

3 确定双重循环程序的结构
具体算法思想如下:假设数据串起始地址为BUF,BUF单元定义为空单元,从BUF+1至BUF+N单元共有n个字节数据。

这n个数据可表示为BUF[1]…BUF[2]…BUF[n],假设BUF[1]…BUF[2]…BUF[n]为有序序列,取出BUF[i],为它在前i-1个元素中找到一个合适的位置,并将它插入到这个位置。

寻找合适位置的方法是从i-1个元素开始依次比较,若BUF[i-1]> BUF[i], BUF[i-1]向高地址方向移动,然后继续向低地址方向寻找。

为了便于控制循环结束,利用BUF[0]作为“哨兵”。

三、实验过程
1)从菜单中找到运行,键入cmd进入DOS界面
2)键入edit,进入编辑环境
3)程序代码如下:
DATA SEGMET
BUF DB ?,15,-21,36,0,-9,8,76 CN EQU $-BUF
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE START:MOV AX,DATA
MOV DS,AX
MOV CX,CN-2
MOV SI,2
LP:PUSH SI
MOV BL,BUF[SI]
MOV BUF,BL
LPI:DEC I
MOV AL,BUF[SI]
CMP AL,BL
JIE NEXT
MOV BUF[SI+1],AL
JMP LP1
NEXT:MOV BUF[SI+1],BL
POP SI
INC SI
LOOP LP
MOV AH,4CH
INT 21H
CODE ENDS
END START
编译源文件如下:
图1
连接文件如下:
图2
执行文件如下:
图3
实验总结、收获及体会:





见实验成绩:指导教师:
年月日。

相关文档
最新文档