汇编 数组排列

合集下载

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 自动给出的注释已经够清楚的了。

8086汇编实现冒泡排序、直接插入排序、折半查找

8086汇编实现冒泡排序、直接插入排序、折半查找

(2)直接插入法 直接插入排序:将一个数据插入到一个已排好序的数据中,主要步骤如下:
① 查找应该插入的位置,这个过程免不了要比较数据的大小; ② 找到位置后,需将这个位置以及其后的数据都向后移动一位,空出此位置,等待插入 ③ 插入数据。
其 C 语言版的代码如下:
for(int i=2;i<=100;i++)
DSEG SEGMENT SCORE DB 31H,02H,15H,4H,5H,6H,7H,8H,9H,10H,90 DUP(05H) MAX DB ? MIN DB ?
DSEG ENDS CSEG SEGMENT
ASSUME DS:DSEG,CS:CSEG START: MOV AX,DSEG
MOV DS,AX
;相当于 i
L2: MOV AL,[BX+DI] ; L2 为内循环,(DI)为循环变量,相当于 j
CMP AH,AL
JAE L3
MOV DH,AH
;AH<Al,交换两个数
MOV AH,AL
MOV AL,DH
MOV [BX+DI],AL ;将交换后的数存入存储器
MOV [BX+SI],AH ;这两步很重要
L4: MOV DL,[BX+DI] ;从内存中取出 a[j],给(DL)
CMP DH,DL
;比较 a[0]和 a[j]
JAE L5
;a[0]<a[j],向后移
MOV [BX+DI+1],DL ;存入内存,实现真正的后移
DEC DI
;j--
JMP L4
L5: MOV [BX+DI+1],DH ;a[0]>=a[j],a[0]—>a[j+1],实现直接插入

8086汇编语言学习(六)8086处理结构化数据(模拟高级语言结构体、数组)

8086汇编语言学习(六)8086处理结构化数据(模拟高级语言结构体、数组)

8086汇编语⾔学习(六)8086处理结构化数据(模拟⾼级语⾔结构体、数组)⼀、8086汇编定义数据 要处理结构化数据,必须先定义数据。

8086汇编作为⼀门编程语⾔,定义数据的⽅式⽐起复杂的⾼级语⾔要简单不少。

汇编语⾔贴近机器底层,所处理的数据逻辑上都可以视为⼆进制数据,按照对不同⼤⼩内存单元的处理,分为三种:db、dw、dd。

1.db db 即define byte,定义⼀个字节变量。

例如 db 1h,代表着db指令后的值占⽤⼀个字节的内存空间 1h=>01h。

特别的,使⽤db可以⽐较简单的定义字符串数据,例如db "ABC",代表着定义A、B、C三个连续的字符。

2.dw db 即define word,定义⼀个字变量。

例如 dw 1h,代表着dw指令后的值占⽤⼀个字/两个字节的内存空间 1h=>0001h。

3.dd dd 即define doubleword,定义⼀个双字变量。

例如 dd 1h,代表着dw指令后的值占⽤两个字/四个字节的内存空间 1h=>0000 0001h。

在连续定义数据时,可以通过逗号进⾏缩写。

例如 db 1h,2h,3h等价与db 1h;db 2h;db 3h。

同时上述三种⽅式都可以与dup关键字(duplicate)使⽤。

例如,定义3个值为1h的字形数据,可以写为dw 3 dup(1h),其等价于dw1h,1h,1h。

在定义复数个相同的数据时,可以简化程序,增强可读性。

db、dw、dd、dup都属于8086汇编的伪指令,由汇编器在编译时进⾏处理,并没有对应的机器指令。

⼆、8086汇编处理结构化数据 之前介绍了8086各种不同⽅式的内存寻址⽅式,下⾯介绍8086如何利⽤这些多样的寻址⽅式来处理结构化的数据。

举⼀个简单的例⼦,假设存在⼀个结构化的数据(公司),拥有五个属性。

公司属性: 公司名称: BLZ 总裁名称: Deckard Cain 公司排名: 15 年收⼊(亿元): 50 产品: WOW 需求是,在内存中定义该数据并且对其中的部分属性进⾏修改,将公司排名修改为10,年收⼊修改为80,产品名称修改为OWO。

数组排序的几种方法

数组排序的几种方法

数组排序的几种方法1. 冒泡排序:冒泡排序是一种基础的排序方法,通过比较相邻元素大小来交换位置,逐步将大的元素往后移动。

具体实现方法:从数组首位置开始,遍历每个元素,每次比较相邻两个元素的大小,若前面的大于后面的,交换它们的位置。

依次进行,最终得到一个升序/降序的数组。

由于冒泡排序需要不断的比较和交换,时间复杂度为O(n^2),不适合大规模数据的排序。

2. 快速排序:快速排序是一种效率比较高的排序算法,它采用分而治之的思想,通过选定一个中间值将数据分为左右两部分,对左右两部分再进行递归排序。

具体实现方法:选定一个中间值pivot,将小于pivot的数放到左边,大于pivot的数放到右边。

然后再对左右两边分别递归进行排序,直到整个数组有序为止。

快速排序的时间复杂度为O(nlogn),但是最坏情况下时间复杂度会退化到O(n^2),因此需要合理地选定pivot来确保算法效率。

3. 插入排序:插入排序是一种简单的排序方法,它采用类似于扑克牌的排序思想,将数组中的元素逐个比较并插入到已排好序的数组中。

具体实现方法:从第二个元素开始,将每个元素与前面的元素逐个比较,找到它应该插入的位置。

将原位置之后的元素依次往后移,最后再将该元素插入到应该插入的位置中。

插入排序的时间复杂度为O(n^2),但是对于已经基本有序的数组,插入排序效率较高。

4. 归并排序:归并排序是一种分而治之的排序算法,它采用递归分解数组并且分别对每个子数组进行排序,最终将排好序的子数组合并成为一个有序数组。

具体实现方法:将数组分成两等份,对每个子数组分别递归进行排序,最后将两个有序子数组合并成为一个有序数组。

归并排序的时间复杂度为O(nlogn),不受初始状态的影响,因此在实际应用中较为常用。

以上就是几种常见的数组排序方法。

在实际应用时,需要结合具体情况选定合适的算法以提高效率。

汇编语言程序设计教程(第二版)习题参考答案

汇编语言程序设计教程(第二版)习题参考答案

汇编语言程序设计教程(第二版)习题参考答案第1章计算机基础知识1.计算机的应用分哪几个方面,请举例说明书中未提到的领域的计算机应用。

科学计算、数据处理、计算机控制、计算机辅助设计、人工智能、企业管理、家用电器、网络应用。

书中未提及的如:远程教育、住宅小区控制、飞行系统控制与管理等。

2.简述计算机的发展过程,请查阅相关资料,列出微机的发展过程。

电子管、晶体管、集成电路、大规模集成电路以IBM为例,微机的发展:4004、8008、8080、8086/8088、80286、80386、80486、Pentium 系列3.计算机的字长是怎么定义的,试举例说明。

计算机能同时处理二进制信息的位宽定义为计算机的字长。

如8086能同时进行16位二进制数据的运算、存储和传输等操作,该机器的字长为16位。

4.汇编语言中的基本数据类型有哪些?数值型数据和非数值型数据。

非数值数据如字符、字符串、逻辑值等。

(1)7BCH=011110111100B=1980D(2)562Q=101110010B=370D(3)90D=01011010B=5AH(4)1110100.111B=164.7Q=74.EH30H~39H 41H~5AH 61H~7AH9.在汇编语言中,如何表示二进制、八进制、十进制和十六进制的数值?用相应进制的数值加上进制标记即可。

二进制用B,如10101010B八进制用Q,如437Q。

十进制用D或不用,如54D,或54。

十六进制用H,如27A8H10.完成下列二进制数的加减运算。

(1)10101010 + 11110000 (2)11001100 + 01010100=110011010 =100100000(3)11011010 - 01010010 (4)11101110 - 01001101=10001000 =1010000111.完成下列十六进制数的加减运算。

(1)0FEA9 - 8888=7621H (2)0FFFF - 1234=EDCBH(3)0EAC0 + 0028=EAE8H (4)3ABC + 1678=5134H12.完成下列BCD码的运算。

微机原理与汇编语言程序设计实验一

微机原理与汇编语言程序设计实验一

实验一汇编语言上机环境及基本操作一、实验目的及要求1.学习及掌握汇编语言源程序的书写格式和要求,明确程序中各段的功能和相互之间的关系。

2.学会使用EDIT、MASM、LINK、DEBUG等软件工具。

3.熟练掌握在计算机上建立、汇编、连接、调试及运行程序的方法。

二、实验内容1.汇编语言源程序的建立本例中给出的程序是要求从内存中存放的10个无符号字节整数数组中找出最小数,将其值保存在AL寄存器中。

设定源程序的文件名为ABC。

DATA SEGMENTBUF DB 23H,16H,08H,20H,64H,8AH,91H,35H,2BH,7FHCN EQU $-BUFDATA ENDSSTACK SEGMENT STACK ’STACK’STA DB 10 DUP(?)TOP EQU $-STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: PUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV BX,OFFSET BUFMOV CX,CNDEC CXMOV AL,[BX]INC BXLP: CMP AL,[BX]JBE NEXTMOV AL,[BX]NEXT: INC BXDEC CXJNZ LPMOV AH,4CHINT 21HCODE ENDSEND START键入以下命令:C:\>EDIT ABC.ASM此时屏幕的显示状态如图1所示。

图1 用EDIT编辑ABC.AS M程序窗口程序输入完毕后一定要将源程序文件存入盘中,以便进行汇编及连接,也可以再次调出源程序进行修改。

2.将源程序文件汇编成目标程序文件一般情况下,MASM汇编程序的主要功能有以下3点:(1)检查源程序中存在的语法错误,并给出错误信息。

(2)源程序经汇编后没有错误,则产生目标程序文件,扩展名为.OBJ。

(3)若程序中使用了宏指令,则汇编程序将展开宏指令。

汇编语言编程的基本方法

汇编语言编程的基本方法

操作说明
dst=Xmem<<16 dst2=dst2+T*Ymem
ST src, Yme ‖LD Xmem, dst
Ymem=src>>(16-ASM) dst=Xmem<<16
ST src, Ymem ‖MAC[R] Xmem, dst
Ymem=src>>(16-ASM) dst=dst+T*Xmem
低32 位减
DST B,@z3
;z3z2=w3w2+x3x2+C-y3y2-C’
高32
由于没有长字带进(借)位加/减法指令,所以上述程序中只能用16位位带减进
(借)位指令ADDC和SUBB。
20
8. 32位乘法运算
例5-12 编写计算W64=X32*Y32的程序段。 32位乘法算式如下:
x1 x0
18
7.64位加法和减法运算
例5-11 编写计算Z64=W64+X64-Y64的程序段。 这里的W、X、Y和结果Z都是64位数,它们都由两个32位的长字组成。利用长
字指令可以完成64位数的加/减法。
w3 w2
w1 w0 (W64)
+ x3 x2 C x1 x0 (X64) 低32位相加产生进位C
- y3 y2 C’ y1 y0 (Y64) 低32位相减产生借位C’
9
4.双操作数乘法
用间接寻址方式获得操作数,且

辅助寄存器只用AR2~AR5;

占用程序空间小;
运行速度快。
20
例5-8 编制求解 y aixi 的程序。 i1
利用双操作数指令可以节省机器周期。迭代次数越
多,节省的机器周期数也越多。本例中,在每次循环

大学计算机专业-汇编语言

大学计算机专业-汇编语言
CALL指令用于调用子程序,并将返回地址压入堆栈中。
RET指令用于从子程序返回,并从堆栈中弹出返回地 址。
04 汇编语言程序结构
程序的基本结构
汇编语言程序由指令和数据组成,指令告诉计算机做什么,数据则是被处理的对 象。
程序的基本结构包括程序头、程序体和程序尾。程序头包含程序的标识符、版本 号等信息;程序体是程序的主体,包含程序的逻辑实现;程序尾包含程序的结束 标识符。
02
汇编语言的特点是具有高度的可移植性和可读性,同时能够直
接控制计算机硬件。
汇编语言通常用于编写系统软件、驱动程序、嵌入式系统等需
03
要高效控制硬件的程序。
汇编语言的历史和发展
1
汇编语言的历史可以追溯到计算机发展的初期, 当时人们使用助记符来编写机器指令。
2
随着计算机技术的不断发展,汇编语言也在不断 演变和完善,出现了许多不同的汇编器、汇编语 法和指令集。
01
03
汇编语言通常比高级语言执行速度更快,因为其指令 直接对应硬件操作。但高级语言由于其抽象性,使得
编程更加方便和高效。
04
汇编语言的可移植性较差,因为不同的计算机架构有 不同的汇编语言。而高级语言通常更容易在不同的平 台上移植和运行。
THANKS FOR WATCHING
感谢您的观看
汇编语言和高级语言都遵循一定的语法规则,通过编程语 言的指令来控制计算机执行任务。
汇编语言和高级语言都需要经过编译或解释才能被计算机 执行。
与高级语言的主要区别
汇编语言的指令是直接对应计算机硬件操作的,而高 级语言则是一层抽象,通过编译器或解释器转换成机
器指令。
输标02入题
汇编语言的语法相对简单,但需要程序员对计算机硬 件有较深的理解。高级语言的语法相对复杂,但提供 了更丰富的抽象和表达能力。

汇编语言综合实验 --- 学生成绩排序(单链表实现)

汇编语言综合实验 --- 学生成绩排序(单链表实现)
②按学生的总成绩由高到低进行排序建立链表。
这一部分任务是按学生总成绩由高到低进行排序。采用单链表方式,给数据元素的链指针LINK字段装填数据,使LINK字段指向它的后继数据元素。步骤如下:
Ⅰ.初始时,数组元素的每个LINK字段值为0,表示数组元素没有被选中。扫描数组元素的SUM字段,从中找到第一个最大的数,将这个数组元素设置为链表的头,保存这个数组元素的位移量,并将其LINK字段设置为1,标记这个数组元素已被选中但尚未装填链指针。
重复上述步骤直到该结构体类型数组中的最后一个节点LINK字段置为1,该节点即为单链表的链尾。
③遍历单链表,即对学生成绩信息按总成绩由高到低输出。
首先将单链表的头指针赋值给BX,依次循环COUNT(学生人数)次输出每一个数组元素的值,每次输出结束后,将BX的值加上TYPE S_ARRAY(即加16字节),BX指向下一个数组元素的首地址。
②建立单链表,即完成对学生成绩信息的降序排列。
首先从所有数组元素中找出总成绩最大的一项,将该数组元素作为单链表的头指针,保存在DX中,同时将LINK字段赋值为1;
其次,从LINK字段为0的数组元素中找到总成绩最大的一项,将该数组元素的偏移地址作为前一节点的LINK字段值,同时将该节点的LINK字段值置为1;
图1-1程序主界面:
图1-2程序二级菜单界面:
2.排序功能的实现:
图1-2输入学生成绩界面:
图1-4按总分排序输出学生成绩信息:
3.设计思路:
(1)数据定义:
一个数据元素(一个学生的数据项)应该为一个结构类型,定义如下:
STUDENT STRUC;定义学生结构体
LINK DW 0;单链表指针,指向下一个节点偏移地址
Ⅰ.将链表的头元素的位移量送到BX寄存器。

汇编语言输入10个数排序并输出的实现

汇编语言输入10个数排序并输出的实现

汇编语⾔输⼊10个数排序并输出的实现⼀:题⽬描述在键盘输⼊任意10个数1. 按从⼩到⼤排序后,在计算机屏幕上先输出来。

要有结果提⽰(字符串显⽰)。

2. 将10个数做累加,结果在计算机屏幕显⽰累加和。

⼆:伪指令的定义1.数据段ATAS SEGMENTstring_1 DB 'Please input a numbers(0-65536):','$'string_2 DB 'ERROR: OVERFLOW! Please input again:','$'string_3 DB 'The array you have input is:',0ah,0dh,'$'string_4 DB 'After Sort the num is:',0ah,0dh,'$'string_5 DB ' ','$'DATA DW 10 DUP(?)massege DB 'The sum of the array is: ',0ah,0DH,'$'DATAS ENDS说明:string_1输⼊范围提⽰string_2输⼊错误提⽰string_3输出原数组提⽰string_4输出排序后数组提⽰string_5空格符DATA缓冲区数组2.堆栈段STACKS SEGMENTDW 256 dup(?)STACKS ENDS3.代码段CODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS三:模块分解与实现1. DOS输⼊10个数字输⼊10个⽆符号数存⼊缓冲区,并且保证 num&lt;65536num &lt; 65536num<65536为何输⼊范围是65536呢⼀个字的最⼤表⽰范围是 FFFFFFFFFFFF 其在⼗进制的表⽰下为 65535HEX FFFFDEC65535BIN1111 1111 1111 11111.1 输⼊函数⼦程序;---------输⼊函数(单数字输⼊)------------Input PROC Nearpush AXpush BXpush CXpush DX;---------输⼊提⽰--------------MOV BX, 0CLCMOV DX, 0;----------输⼊数字--------------Lp_0:MOV AH, 1INT 21HCMP AL, 20H ;回车JE L_CRLF;----- x belong to [0,9] ----------SUB AL, 30H ; ASCII -> intJL L_ERRORCMP AL, 9JG L_ERROR;------- string -> int -----------MOV AH, 0 ;将 AL扩展成 AXXCHG AX, BX ;保护 AX值MOV CX, 10MUL CX ; bx *= 10ADD AX , BXJC L_ERROR ; OVERFLOW处理XCHG AX, BXJMP Lp_0L_ERROR:MOV DX, 0MOV BX, 0CALL CRLF ; 换⾏CALL ERROR ; 输出错误提⽰JMP Lp_0L_CRLF: ; 以换⾏作为⼀个数的结束标志MOV DX, 0MOV DATA[SI], BX ;解析函数功能:本质类似于⾼精度计算,将读⼊的⼀个串转成数字存储在DATA数组中分成三⼤部分⼀:输⼊提⽰⼆:错误判断及提⽰三:转化为数字L_ERROR 错误处理L_CRLF 结束处理我们来举⼀个123412341234 的例⼦Register1234AX1234BX0112123CX10101010AX+(BX∗CX)AX + (BX * CX)AX+(BX∗CX)最后将结果存储在DATA数组⾥2.实现冒泡排序冒泡排序作为⼀个简单的排序算法,时间复杂度 O(n2)O(n^2)O(n2) 需要两层循环,为了提⾼代码的可读性,我们将内层的循环写成⼀个⼦程序每次调⽤内层循环很简单,每次从头⽐到尾,遇到⽐它⼩的交换就可以了。

数组按大小排序汇编语句

数组按大小排序汇编语句

数组按大小排序汇编语句在汇编语言中,对数组按照大小排序可以使用冒泡排序算法。

下面是一个使用汇编语言编写的对数组按大小排序的示例程序:```section .dataarray db 9, 2, 7, 4, 5 ; 数组存储在.data节中array_size equ ($ - array) ; 计算数组大小temp db 0 ; 用于交换数组元素的临时变量section .textglobal _start_start:; 初始化循环计数器mov ecx, array_size - 1outer_loop:; 初始内循环计数器mov ebx, 0inner_loop:; 比较array[ebx]和array[ebx+1]的大小mov al, [array + ebx]cmp al, [array + ebx + 1]; 如果array[ebx] > array[ebx+1],交换它们jle skip_swapmov dl, [array + ebx + 1]mov [array + ebx + 1], almov [array + ebx], dlskip_swap:; 更新内循环计数器inc ebxcmp ebx, ecxjl inner_loop; 如果已经没有需要交换的元素,排序完成dec ecxjz done; 继续下一轮外循环jmp outer_loopdone:; 排序完成,程序退出mov eax, 1xor ebx, ebxint 0x80```这个示例程序使用冒泡排序算法对数组进行排序。

首先,它初始化两个循环计数器,外循环计数器 `ecx` 控制外层循环,内循环计数器 `ebx` 控制内层循环。

然后,它在内循环中比较相邻的两个元素,并根据需要交换它们的位置。

内循环执行完后,它检查是否还有需要交换的元素。

如果没有需要交换的元素,排序完成;否则,它继续进行下一轮外循环。

最后,排序完成后,程序通过系统调用退出。

汇编语言的对比教学法

汇编语言的对比教学法

汇编语言的对比教学法摘要:将汇编语言与C语言、数据结构等课程之间的知识点进行对比教学,可以帮助学生更好地掌握汇编语言,提高学生学习汇编语言的信心。

文章给出了一些具体的教学实例,包括逻辑运算指令、堆栈指令、数组访问和程序结构教学等。

教学实践验证了教学方法的有效性。

关键词:汇编语言;对比教学;C语言;数据结构1 研究背景众所周知,汇编语言是从机器的角度出发的,与贴近人们思维的高级语言相差较大,学生刚接触时一般都觉得比较难。

即使专门开设汇编语言课程,要学生较好地掌握也非易事。

而电气信息类专业,如自动化、信息工程等专业都将微机原理作为专业课,在此之前一般不专门开设汇编语言课程,作为微机原理课程的一部分,汇编语言只占十几个课时,无论是老师讲授还是学生学习都更有难度。

但是这部分内容作为基础,是学生较早接触的。

根据经验,如果汇编部分掌握得不好,学生有可能会对整个课程的学习失去信心。

因此在教学过程中,应该尽可能采取一些方法帮助学生尽快适应汇编语言的思维方式和编程风格。

笔者所在的学校,C语言是所有工科专业的公共课,学生一般都比较重视;自动化等专业还开设了计算机软件技术基础这门课,内容涉及数据结构、操作系统等。

在汇编语言的教学中,我们尝试与这两门课程的一些知识点进行关联和比较,对比教学方法做了一些探讨。

2 对比教学探讨2.1 逻辑运算C语言中有逻辑运算符和位运算符之分,与汇编语言逻辑运算对应的是C语言的位运算符,对应关系如表1所示。

而C语言中的逻辑运算符为:与(&&),或(||),非(!),用于对包含关系运算符的表达式进行合并或取非。

对于使用逻辑运算符的表达式,返回0表示“假”,返回1表示“真”。

在教学过程中需要提醒学生注意它们的区别和对应关系。

2.2 栈运算在讲入栈、出栈指令时,学生已经在计算机软件技术基础或数据结构课程中学习了栈这种结构,对于栈的“先进后出”的特点应该已经掌握了。

但是两门课程在细节上还是有区别的,见表2。

  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
实验总结、收获及体会:





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

相关文档
最新文档