文档库 最新最全的文档下载
当前位置:文档库 › 1冒泡排序的ARM汇编程序

1冒泡排序的ARM汇编程序

1冒泡排序的ARM汇编程序
1冒泡排序的ARM汇编程序

1冒泡排序的ARM汇编程序ORG 09B0H

QUE:MOV R3,#50H QUE1:MOV A,R3 MOV R0,A

MOV R7,#0AH

CLR 00H

MOV A,@R0

Q12:INC R0

MOV R2,A

CLR C

MOV 22H,@R0

CJNE A,22H,Q13 SETB C

Q13:MOV A,R2

JC Q11

SETB 00H

XCH A,@R0

DEC R0

XCH A,@R0

INC R0

Q11:MOV A,@R0 DJNZ R7,Q12

JB 00H,QUE1

SJMP $

END

2 ARM汇编希尔排序法对10个带符号数进行排序Code:

void shell(int src[],int l,int r){

int ih;

r++;

for(ih=1;ih<(r-l)/9;ih=ih*3+1);

//eax,ih

//ebx,il

//ecx,ir

//edx,cmps

_asm{

push eax

push ebx

push ecx

push edx

push esi

push edi;貌似这堆进栈用处不大哎

mov edi,src

mov eax,dword ptr [ih]

LIH:

cmp eax,0

jna EXIH

mov ebx,eax

dec ebx

LLH:

cmp ebx,dword ptr [r]

jnb EXLLH

mov ecx,ebx

mov edx,dword ptr [edi+ecx*4]

LCMP:

mov esi,eax

dec esi

cmp ecx,esi

jna EXCMP

push ecx

sub ecx,eax

cmp edx,dword ptr [edi+ecx*4] pop ecx

jnb EXCMP

push ebx

push ecx

sub ecx,eax

mov ebx,dword ptr [edi+ecx*4] pop ecx

mov dword ptr [edi+ecx*4],ebx pop ebx

sub ecx,eax

jmp LCMP

EXCMP:

mov dword ptr [edi+ecx*4],edx inc ebx

jmp LLH

EXLLH:

push ecx

mov ecx,3

push edx

cdq

idiv ecx

pop edx

pop ecx

jmp LIH

EXIH:

pop edi

pop esi

pop edx

pop ecx

pop ebx

pop eax

}

}

351单片机C语言对流水灯编程,用定时中断做

#include

define uchar unsigned char

uchar m=0,i=0;

void main() { TMOD|=0x01; //定时器0工作方式为1

TH0=(65536-50000)/256; //装初值

TL0=(65536-50000)%256; EA=1; //开总中断 ET0=1; //开定时器中断 TR0=1; //开启定时器

while(1); //等待中断

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256; m++ ;

if(m==5) //12M晶振定时5*50MS=250MS

{

m=0;

P1=~(0X01<

//P1接8个LED

if(++i==8) i=0;

}

}

4单片机编程C语言和汇编都可以。外部中断int0口控制p2.3口得报警器。中断信号是开关量,就是行程开关。

本程序晶振为:12MHZ,报警输出频率为:100HZ

ORG 0000H LJMP MAIN ORG 0003H ;INT0中断入口

LJMP XC_INT0

ORG 000BH ;T0中断入口

LJMP BJ_T0

ORG 0030H MAIN:

MOV TMOD,#01H

MOV TH0,#0ECH ;定时初值,定时值为5ms

MOV TL0,#78H

SETB EA

SETB EX0

SETB ET0

CLR IT0

SJMP $ ;

===int0外部中断子程序===

XC_INT0:PUSH ACC

PUSH PSW

SETB TR0

POP PSW

POP ACC

RETI ;

===报警频率产生T0中断===

BJ_T0:

CPL p2.3

MOV TH0,#0ECH

MOV TL0,#78H

RETI

5单片机外部中断的编程

设计单片机程序,基于T0用定时中断设计秒表,秒计数结果在数码管显示,用外部中断INT0(边沿触发方式)对秒计数结果进行清零,用P3.0对秒计数进行启动和停止控制。T0定时中断50毫秒,进行20次中断得到1秒的定时,秒计数结果送P1口进行LED显示,将外部中断设置成边沿触发方式。

/***********************************************/

#include

sbit shiwei=P2^0;//定义接口

sbit gewei=P2^1;

/*********************************************/

unsigned char code table[]={//数码显示表

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f};

/*******************************************/

void msdelay()//5 ms 延时

{

int x,y;

for(x=(65536-15)%256;x;x--)

{

for(y=(65536-15)/256;y;y--);

}

}

/***************************************/

/**************************************/

void init()//初始化

{

TMOD=0x11;

PX0=1;

TH0=(65535-50)/256;

TL0=(65535-50)%256;

TH1=(65535-100)/256;

TL1=(65535-100)%256;

EX0=1;

ET0=1;

ET1=1;

EA=1;

TR1=1;

}

/*****************************************/ unsigned char passtime=0;//全局变量unsigned char timecount=0;

/*****************************************/

main()

{

unsigned char count;

count=0;

init();

while(P3^0!=1);

msdelay();

if(P3^0==1)//确定开始或者结束

{count++;

if(count%2)

{TR0=1;}

else

{TR0=0;}

}

}

void clear() interrupt 0//清零

{

TR0=0;

timecount=0;

passtime=0;

}

void timer() interrupt 2//50ms 定时

{

timecount++;

if(timecount==20)

{

timecount=0;

passtime++;//50*20=1s

}

TH0=(65535-50)/256;

TL0=(65535-50)%256;

TR0=1;

}

void displaytimer() interrupt 2//用于数码管的两位显示,十位和各位

{

TH1=(65535-100)/256;

TL1=(65535-100)%256;

shiwei=0;//动态显示,其中P2.0=0十位选通P2.1=各位选通gewei=1;

P0=table[passtime/10];//十位

msdelay();

msdelay();

msdelay();

shiwei=1;

gewei=0;

P0=table[passtime%10];//各位

msdelay();

msdelay();

msdelay();

TR1=1;

}

6. 80c51单片机很简单的中断编程

试编写一段对中断系统初始化的程序,使之允许INRO(上面有一横),INT1(上面有一横),T0,串行口中断,且使T0中断为高优先级。

ORG 0000H

LJMP START

ORG 0003H

LJMP _X0_INT

ORG 000BH

LJMP _T0_INT

ORG 0013H

LJMP _X1_INT

ORG 001BH

LJMP _T1_INT

ORG 0023H

LJMP _S_INT

START:

MOV IE, #10010111B

MOV IP, #00000010B

..........

_X0_INT:

..........

RETI

..........

..........

END

7.利用外部输入中断设计一个应用系统,实时显示P3.3引脚上出现的负跳变脉冲的个数。 用51单片机

ORG 0000H

AJMP START

ORG 0013H

AJMP INT1

ORG 0100H

START: SETB EA ;

总中断允许 SETB IT1 ;外部中断1允许

MOV R0,#00H

HERE:

SJMP HERE I

NT1:

INC R0

RETI

END

8.已知89C51单片机的晶振频率为6MHz,T1扩展为第三外部终端源,用T0定时。试编程实现T1扩展为第三外部终端源功能(每次中断就取反P1.2引脚)且由P1.0和P1.1引脚分别输出周期为3ms和600us的方波。(用中断编程,T1用模式2、T0用模式1;写出定时计数初值计算过程,程序的首地址从0000H开始,注释每条语句)

外部中断信号接到P3.3口,为INT0中断,程序如下

#include sbit X0=P1^0; //用X0表示

P1.0 sbit X1=P1^1; //用X0表示P1.1

sbit X2=P1^2; //用X0表示P1.2

void main(void)

{

P1=0x00; //将P1口初始化位高电平,如果没有这句,初始化为低电平,这里可根据需要选择

EA=1; //中断允许

IT1=1; //触发方式为下降沿触发

EX1=1; //外部中断允许

while(1); //这里可以随便写你需要的主程序,我用了个死循环,目的是等待中断

}

void counter1(void) interrupt 2 //INT1中断

{

EX1=0; //禁止外部中断

ET0=1; //计时器中断0允许 ET1=1; //计时器中断1允许

TMOD=0x21; //T1用模式2、T0用模式1

IP=0x0a; //T1、T0为高优先级

X2=~X2; //每次中断就取反P1.2引脚

X1=1; //P1.1输出低电平0.3ms

X0=1; //P1.0输出低电平1.5ms

TH0=0xfd; //T0用模式1,16位计时器,在1.5ms后执行时间中断0

TL0=0x12;

TH1=0x6a; //T1用模式2,8位计时器,在0.3ms执行时间中断1

TL1=0x6a;

TR1=1; //启动计时器T1

TR0=1; //启动计时器T0

while(X0==1); //等待中断响应完成

EX1=1; //允许外部中断

}

void counter2(void) interrupt 1 //定时器0中断

{

X0=0;

}

void counter3(void) interrupt 3 //定时器1中断

{

X1=0;

}

9. 基于单片机的交通信号灯模拟控制系统设计 设计内容及要求: 1、硬件设计 单片机主电路、交通灯接口电路、LED数码管显示电路,键盘控制电路。 2、软件设计 系统流程图、各功能程序 设计环境: Protel99SE 、W A VE仿真环境、H51/L仿真器、单片机多功能实验箱 实现目标: (1)正常情况下交叉路口的轮流通行(主道3个LED 红、黄、绿控制直行,支道3个LED红、黄、绿,切换时间自行设定); (2)特殊情况控制通行方式控制,用按键开关K1控制主道通行,支道禁行,K2控制支道通行,主道禁行,特殊情况控制通行放行。 (3)有紧急情况时用按键开关K0控制两道均为红灯; (4)4位LED数码管能够显示双直行方向绿灯和红灯的等待时间。

2位LED数码管显示程序:P0口接数码管段,P2口接数码管位。P3口接键盘,P1口接发光二极管

ORG 0000H

LJMP MAIN

ORG 0003H

LJMP INT0P

ORG 000BH

LJMP T0INT

ORG 0013H

LJMP INT1P

ORG 001BH

LJMP CTC1

ORG 0100H

MAIN: LCALL CSHIH ;初始化

LOOP: LCALL TONGX ;通行路口

LCALL H_BCD2 ;计算(1位HEX转换为2位BCD码)

LCALL YIMA ;译码

LCALL LED4W ;显示

CLR 00H

JNB 00H,$

DJNZ R6,LOOP

MOV R6,#100

JNB 10H,LOOP1 ;启动特殊功能K0

JB 10H,$

LOOP1: JNB 11H,LOOP2 ;启动特殊功能K1 JB 11H,$

NOP

LOOP2: JNB 12H,LOOP3 ;启动特殊功能K2 JB 12H,$

NOP

LOOP3: DJNZ TIME,LOOP

SETB 02H

SJMP LOOP

TONGX: JB 01H,DONGX

JB 02H,HUANG1

MOV P1,#21H

SJMP TX_OUT

HUANG1: MOV P1,#22H

MOV TIME,#1

DJNZ R5,TX_OUT

MOV R5,200

CLR 02H

CPL 01H

MOV TIME,#15

SJMP TX_OUT

DONGX: JB 02H,HUANG2

MOV P1,#0CH

SJMP TX_OUT

HUANG2: MOV P1,#14H

MOV TIME,#1

DJNZ R5,TX_OUT

MOV R5,200

CLR 02H

CPL 01H

MOV TIME,#15

TX_OUT: RET

LED4W: MOV A,XWEI

MOV B,#3

MUL AB

MOV DPTR,#LED4T

JMP @A+DPTR

LED4T: LJMP LD4W1

LJMP LD4W2

LJMP LD4W3

LJMP LD4W4

LD4W1: MOV LEDD,MLED1

MOV LEDW,#1

INC XWEI

SJMP LED4WE

LD4W2: MOV LEDD,MLED2

MOV LEDW,#2

INC XWEI

SJMP LED4WE

LD4W3: MOV LEDD,MLED3

MOV LEDW,#4

INC XWEI

SJMP LED4WE

LD4W4: MOV LEDD,MLED4

MOV LEDW,#8

MOV XWEI,#0

LED4WE: RET

YIMA: MOV R0,#BLED1 ;四位LED

MOV R1,#MLED1

MOV R7,#2

MOV DPTR,#YIMTAB

YIMA1: MOV A,@R0

MOVC A,@A+DPTR

MOV @R1,A

INC R0

INC R1

DJNZ R7,YIMA1

RET

YIMTAB: DB 3FH,06H,5BH,4FH,66H ;0,1,2,3,4 DB 6DH,7DH,07H,7FH,6FH ;5,6,7,8,9 CSHIH: MOV TIME,#15

MOV XWEI,#0

MOV LEDD,#0

MOV LEDW,#0

MOV R6,#100 ;1秒延时

MOV R5,#200 ;2秒延时

MOV P1,#21H

MOV 20H,#0

MOV 22H,#0

MOV TMOD,#61H ;T0方式1

MOV TTH0,#0D8H ;10ms

MOV TTL0,#0F0H

MOV TL0,TTL0

MOV TH0,TTH0

MOV TL1,#0FFH

MOV TH1,#0FFH

MOV IE,#8FH

SETB TR0

SETB TR1

MOV BLED1,#0

MOV BLED2,#0

MOV MLED3,#0

MOV MLED4,#0

RET

H_BCD2: MOV A,TIME

MOV B,#10

DIV AB

MOV BLED2,A

MOV BLED1,B

MOV MLED3,#0

MOV MLED4,#0

RET T0INT: MOV TL0,TTL0 MOV TH0,TTH0

SETB 00H

RETI

INT0P: CPL 10H

SETB P1.2

CLR P1.1

CLR P1.0

SETB P1.5

CLR P1.4

CLR P1.3

RETI I

NT1P: CPL 11H

CLR P1.2

CLR P1.1

SETB P1.0

SETB P1.5

CLR P1.4

CLR P1.3

RETI

CTC1: CPL 12H

MOV P1,#0CH

RETI

BIAOZ

DA TA 20H ;标志:.0定时到。

XWEI DATA 60H ;显示位,4位:0~3 TTL0 DATA 61H

TTH0 DATA 62H

TIME DATA 66H ;倒计时时间

BLED1 DATA 74H ;显示数据BCD BLED2 DATA 75H

BLED3 DATA 76H

BLED4 DATA 77H

MLED1 DATA 78H ;显示数据译码

MLED2 DATA 79H

MLED3 DATA 7AH

MLED4 DATA 7BH

LEDD EQU P0 ;数码管段 LEDW EQU P2 ;数码管位 END

ARM经典汇编程序

1冒泡排序的ARM汇编程序ORG 09B0H QUE:MOV R3,#50H QUE1:MOV A,R3 MOV R0,A MOV R7,#0AH CLR 00H MOV A,@R0 Q12:INC R0 MOV R2,A CLR C MOV 22H,@R0 CJNE A,22H,Q13 SETB C Q13:MOV A,R2 JC Q11 SETB 00H XCH A,@R0 DEC R0 XCH A,@R0 INC R0 Q11:MOV A,@R0 DJNZ R7,Q12 JB 00H,QUE1 SJMP $ END

2 ARM汇编希尔排序法对10个带符号数进行排序Code: void shell(int src[],int l,int r){ int ih; r++; for(ih=1;ih<(r-l)/9;ih=ih*3+1); //eax,ih //ebx,il //ecx,ir //edx,cmps _asm{ push eax push ebx push ecx push edx push esi push edi;貌似这堆进栈用处不大哎 mov edi,src mov eax,dword ptr [ih] LIH: cmp eax,0 jna EXIH mov ebx,eax dec ebx LLH: cmp ebx,dword ptr [r] jnb EXLLH mov ecx,ebx mov edx,dword ptr [edi+ecx*4]

LCMP: mov esi,eax dec esi cmp ecx,esi jna EXCMP push ecx sub ecx,eax cmp edx,dword ptr [edi+ecx*4] pop ecx jnb EXCMP push ebx push ecx sub ecx,eax mov ebx,dword ptr [edi+ecx*4] pop ecx mov dword ptr [edi+ecx*4],ebx pop ebx sub ecx,eax jmp LCMP EXCMP: mov dword ptr [edi+ecx*4],edx inc ebx jmp LLH EXLLH: push ecx mov ecx,3 push edx cdq

汇编语言实现十个数的排序

DATAS SEGMENT DATA0 DB'Please input a numbers (0-65535):','$' DATA1 DB' over flow input again:','$' DATA2 DB'The num you have put is:',0ah,0dh,'$' DATA3 DB'After exchange the num is:',0ah,0dh,'$' DATA4 DB' ','$' DATA DW 10 DUP(?) DATAS ENDS STACKS SEGMENT DW 256 DUP(?);此处输入堆栈段代码STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DA TAS,SS:STACKS ;/****************************************/ ;-----------程序开始------------ START: MOV AX,DA TAS MOV DS,AX MOV SI,0 MOV CX,10 ;----------循环输入------------ L: CALL INPUT ADD SI,2 CALL NEWLINE LOOP L MOV DX,OFFSET DATA2 MOV AH,9 INT 21H ;-------输入后显示---------- MOV CX,10 MOV DI,0 AGAIN: CALL PRINT CALL SPACE ADD DI,2 LOOP AGAIN ;----------排序-------------

MOV CX,9 MOV DI,0 LOOP0: CALL SORT ADD DI,2 LOOP LOOP0 CALL NEWLINE MOV DX,OFFSET DATA3 MOV AH,9 INT 21H ;----------交换后显示------------- MOV CX,10 MOV DI,0 AGAIN0: CALL PRINT CALL SPACE ADD DI,2 LOOP AGAIN0 ;----------返回系统-------------- EXIT: MOV AH,4CH INT 21H ;/**************************************/ ;------------输入函数-------- INPUT PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX ;----------提示信息---------- MOV DX,OFFSET DATA0 MOV AH,9 INT 21H MOV BX,0 ;BX存放十进制数 CLC MOV DX,0

ARM汇编总结

转载自:https://www.wendangku.net/doc/8613087171.html,/xiwangsll123@126/blog/static/168698140201092242738669/今天的任务是研究嵌入式汇编程序,最重要的是明白如何让一个操作系统在ARM开发板运行起来,需要进行哪些底层操作:任务的第一步是,首先熟悉汇编程序的编写,同时明白操作系统底层操作实现原理。今天有一个心得就是,对一个大项目进行总结分析时,首先要针对各个难点各个击破,然后再系统的总结(有条理的总结)。首先,针对汇编语言中出现的重难点知识进行以下总结: 1. LDR R1,=COUNT意思是将COUNT变量的地址放到R1中 LDR R1,COUNT意思是将COUNT变量地址里面的内容赋给R1 2. Load-Store结构——这个应该是RISC设计中比较有特点的一部分。在RISC中,CPU并不会对内存中的数据进行操作,所有的计算都要求在寄存器中完成。而寄存器和内存的通信则由单独的指令来完成。而在CSIC中,CPU是可以直接对内存进行操作的,这也是一个比较特别的地方。所以,在ARM中,cpu只能通过寄存器来对内存的数据访问和更改。 LDR Rd,(地址) STR Rd,(地址) LDMIA Rn!,reglist STMIA Rn!,reglist 注意上面LDR/STR和LDMIA/STMIA的区别,LDR/STR命令使用时,寄存器在前,地址在后。而在LDMIA/STMIA使用时,地址在前,寄存器在后。这就决定了LDR和LDM同为加载命令,但操作顺序是不同的,同理STR/STM。但有一点他们是相同的,即加载LDR/LDM

的意思是把内存的数据(即上面的地址)加载到寄存器;存储STR/STM的意思是把寄存器的内容存储到内存(即上面的地址)。这样比较之后也就全明白了,只需明白那部分是寄存器,那部分是地址(内存),然后区别是加载还是存储,就可以知道操作方向。 3. LDM/STM IA/IB,DA,DB数据块传输 FD/ED,EA/FA堆栈操作 LDMIA Rn!,reglist STMIA Rn!,reglist 其中Rn加载/存储的起始地址寄存器,Rn必须为R0~R7 Reglist加载/存储的起始寄存器列表,寄存器必须为R0~R7 4. 在汇编程序中!的使用,意思是回写,比如: ldr r1,[sp,#S_PSR] ldr lr,[sp,#S_PC]!其中!用来控制基址变址寻址的的最终新地址是否进行回写操作 此条语句的意思是执行ldr之后sp被回写成sp+#S_PC基址变址寻址的新地址 5.

微机原理-实验一-汇编语言-冒泡排序

微机原理实验报告 班级:XXXXX 姓名:XXXX 学号:20XXXX XXXXX大学 信息科学与技术学院 信息工程系

实验一汇编语言程序设计-(具体题目) 一、实验目的(根据实际情况修改): 1、熟悉MASM编译环境,了解程序的汇编方法; 2、熟悉常用汇编指令,学习汇编程序设计方法; 3、学习汇编语言的调试过程,通过调试过程认识CPU执行程序的方式; 4、了解冒泡法原理,学习多重循环的编程方法。 二、实验内容: 编写程序,用冒泡法实现将数据段内9,8,7,6,5,4,3,2,1按照由小到大的顺序重新排列。 三、程序流程图和程序代码 1、流程图 2、代码与注释(代码不能和指导书完全一样,写出注释,写出寄存器尤其是DS的值)

data segment buf1 db 8,7,6,5,4,3,2,1 data ends code segment assume cs:code,ds:data start: mov ax,data //传送数据段data mov ds,ax mov dx,7 //dx放外循环7次 L3: mov cx,dx //cx放内循环7次 lea si,buf1 //将db里的数据传送到si L2: mov al,[si] cmp al,[si+1] //比较[si]与[si+1] jb L1 //[si]<[si+1],跳转到L1 xchg al,[si+1] //[si]>[si+1],两两交换 mov [si],al L1: inc si //si减1 loop L2 //循环L2 dec dx //外循环减1,没减到0则跳转到L3 jnz L3 //入内循环,计数初值 mov ah,4ch int 21h code ends end start 四、调试过程及遇到的问题 1、程序执行截图

ARM实验汇编代码.

AREA Example1,CODE,READONLY ENTRY CODE32 START MOV R0,#15 MOV R1,#8 ADDS R0,R0,R1 B START END Test2.s X EQU 11 Y EQU 8 BIT23 EQU (1<<23 AREA Example3,CODE,READONLY ENTRY CODE32 START Y MOV R0,#X MOR R1,#Y ADD R3,R0,R1 MOV R8,R3

MVN R0,#0XA0000007 SUB R5,R0,R8,LSL #3 MOV R0,#Y ADD R0,R0,R0,LSL #2 MOV R0,R0,LSR #1 MOV R1,#X MOV R1,R1,LSL #1 CMP R0,R1 LDRHI R2,=0XFFFF0000 ANDHI R5,R5,R2 ORRLS R5,R5,#0X000000FF TST R5,#BIT32 BICNE R5,R5,#0X00000040 B START END //*******Test3.s******************** X EQU 11 Y EQU 8 BIT23 EQU (1<<23

AREA Example3,CODE,READONLY ENTRY CODE32 START MOV R0,#X MOV R1,#Y ADD R3,R0,R1 MOV R8,R3 MVN R0,#0XA0000007 SUB R5,R0,R8,LSL #3 MOV R0,#Y ADD R0,R0,R0,LSL #2 MOV R0,R0,LSR #1 MOV R1,#X MOV R1,R1,LSL #1 CMP R0,R1 LDRHI R2,=0XFFFF0000 ANDHI R5,R5,R2 ORRLS R5,R5,#0X000000FF TST R5,#BIT23

用汇编语言冒泡排序经典程序

data segment A dw 03h, 0dh, 08h, 1dh, 20h, 0fdh ;两个字节保存一个值,对应十进制的3,13,8,29,32,253 data ends code segment main proc far assume cs:code, ds:data start: push ds sub ax, ax ;ax寄存器清零 push ax mov ax, data mov ds, ax mov cx, 7 dec cx ;减1指令 loop1: ;cx=cx-1若cx!=0则继续循环 mov di, cx ;把CX寄存器的值传送到以DS寄存器(默认是DS寄存器)的内容为段值有效地址为DI 的存储单元中 mov bx, 0 loop2: mov ax, a[bx] ;把第bx个数传给ax寄存器 cmp ax, a[bx+2] ;比较第bx个数和第bx+2个数????? jle continue ;jle:小于等于则跳转,否则执行下句 xchg ax, a[bx+2] ;否则两比较数交换位置 mov a[bx], ax continue: add bx, 2 loop loop2 mov cx, di loop loop1 mov cx, 7 mov bx, 0 next: mov ax, [bx] push cx call show pop cx mov ah, 2

mov dl, ' ' int 21h add bx, 2 loop next ret main endp show: ; 显示ax里的值 mov cx, 10 cmp ax, 0 jle done div cl ;除法:被除数在DX,AX中,除数在cl中 push ax xor ah, ah ;xor实现两个操作数按位‘异或’运算,结果送至目的操作数中 call show pop dx mov dl, dh or dl, 30h ;或运算 mov ah, 2 int 21h done: ret code ends end start

ARM汇编程序设计

cmp r0,#5 bcs aaa add r0,r0,#1 aaa nop cmp r0,#5 addcc r0,r0,#1 bl指令完成两个功能:将子程序的返回地址保存在LR即R14同时将PC的值改为目标子程序的第一条指令的地址。 Start: Mov r0,#10 Mov r1,#3 Bl doadd Mov r1,r1,r0 Doadd Add r0,r0,r1 Mov pc,lr .end 用汇编程序实现IF语句的功能: Mov r0,#15 Mov r1,#12 Cmp r0,r1

Movhi r2,#100 Movls r2,#50 用汇编程序实现FOR循环的功能:Mov r0,#0 Mov r1,#10 Mov r2,#0 L1: cmp r0,r1 Bhs l2 Add r2,r2,#1 Add r0,r0,#1 B l1 L2: .end 用汇编语言实现WHILE循环While(x<=y) X=x*2; mov r0,#1 mov r1,#20 b l2 l1: mov r0,r0, lsl #1 l2: cmp r0,r1 bls l1 end

用汇编语言实现计算算术功能:n equ 100 .global _start -start: .arm arm_code: Ldr sp,=0x40003f00 Adr r0,thumbcode+1 Bx r0 .ltorg .thumb Thumb_code: Ldr r0,=n Bl sum_n B thumb_code Sum_n: Push {r1-r7,lr} Movs r2,r0 Beq sum_end Cmp r2,#1 Beq sum_end Mov r1,#1

浅述ARM汇编的立即数

浅述ARM汇编的立即数 大多数的数据处理指令和部分状态寄存器访问指令用到立即数,在ARM 中不是所有数都能用作立即数; 一条典型的ARM 汇编语法格式: {cond}{S} ,,其中opcode: 指令助记符,如ADD、SUB、MOV 等;cond: 条 件码助记符,如EQ(0000)、NE(0001)、AL(1110)等;S:如果指令有S 后缀, 则该指令的操作会影响CPSR 的值;Rd:目标寄存器;Rn: 包含第一个源操作 数的寄存器;shifter_operand: 表示第二个源操作数,可以为立即数。 一条典型的ARM 汇编编码格式: 操作数的语法格式:#其中,=immed_8 循环右移(2*rotate_imm) immediate: 立即数immed_8 : 8 位的常数rotate_imm: 4 位的循环右移值 意思是每个立即数都是由一个8 位的常循环右移偶数位得到。 ROR 循环右移:即将操作数循环按指定的数量向右循环移位,左边用右边 移出的位来填充; 例如:有效的立即数:0x104、0xff0immediate : 0x104// 0001 0000 0100 immed_8 : 0x81// 0100 0001 左边补0: 0x00000081// 0000 0000 0000 0000 0000 0000 1000 0001rotate_imm: 15 // 循环右移(2*15)位// 0000 0000 0000 0000 0000 0001 0000 0100// 0x0000 0104 immediate : 0xff0 // 1111 1111 0000 immed_8: 0xff// 1111 1111 左边补0: 0x000000ff// 0000 0000 0000 0000 0000 0000 1111 1111rotate_imm: 14// 循环右移(2*14)位// 0000 0000 0000 0000 0000 1111 1111 0000 // 0x0000 0ff0 无效的立即数不能通过上面的构造方法得到:

微机原理实验报告冒泡排序

一、实验目的 (1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。 (2)理解并掌握各种指令的功能,编写完整的汇编源程序。 (3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。 二、实验内容及要求 (1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。 (2)实验要求: ①编制程序,对这组数进行排序并输出原数据及排序后的数据; ②利用DEBUG调试工具,用D0命令,查瞧排序前后内存数据的变化; ③去掉最大值与最小值,求出其余值的平均值,输出最大值、最小值与平均值; ④用压栈PUSH与出栈POP指令,将平均值按位逐个输出; ⑤将平均值转化为二进制串,并将这组二进制串输出; ⑥所有数据输出前要用字符串的输出指令进行输出提示,所有数据结果能清晰显示。 三、程序流程图Array (1)主程序:MAIN

(2)

就是 NAME BUBBLE_SORT DATA SEGMENT ARRAY DW 5 DUP(?) ;输入数据的存储单元 COUNT DW 5 TWO DW 2 FLAG1 DW 0 ;判断符号标志 FLAG2 DB 0 ;判断首位就是否为零的标志FAULT DW -1 ;判断出错标志 CR DB 0DH,0AH,'$' STR1 DB 'Please input five numbers seperated with space and finished with Enter:','$' STR2 DB 'The original numbers:','$' STR3 DB 'The sorted numbers:','$' STR4 DB 'The Min:','$' STR5 DB 'The Max:','$' STR6 DB 'The Average:','$' STR7 DB 'The binary system of the average :','$' STR8 DB 'Input error!Please input again!''$' DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA,ES:DATA START: PUSH DS AND AX,0 PUSH AX MOV AX,DATA MOV DS,AX LEA DX,STR1 MOV AH,09H ;9号DOS功能调用,提示输入数据 INT 21H CALL CRLF ;回车换行 REIN: CALL INPUT ;调用INPUT子程序,输入原始数据CMP AX,FAULT ;判断就是否出错, JE REIN ;出错则重新输入

ARM 汇编 LDR STR MOV

ARM 汇编LDR STR MOV ARM 是RISC 结构,数据从内存到CPU 之间的移动只能通过L/S 指令来 完成,也就是ldr/str 指令。比如想把数据从内存中某处读取到寄存器中,只能 使用ldr 比如:ldr r0, 0x12345678 就是把0x12345678 这个地址中的值存放到r0 中。而mov 不能干这个活,mov 只能在寄存器之间移动数据,或者把立即数移 动到寄存器中,这个和x86 这种CISC 架构的芯片区别最大的地方。x86 中没 有ldr 这种指令,因为x86 的mov 指令可以将数据从内存中移动到寄存器中。 另外还有一个就是ldr 伪指令,虽然ldr 伪指令和ARM 的ldr 指令很像,但是 作用不太一样。ldr 伪指令可以在立即数前加上=,以表示把一个地址写到某寄 存器中,比如:ldr r0, =0x12345678 这样,就把0x12345678 这个地址写到r0 中了。所以,ldr 伪指令和mov 是比较相似的。只不过mov 指令限制了立即数的 长度为8 位,也就是不能超过512。而ldr 伪指令没有这个限制。如果使用ldr 伪指令时,后面跟的立即数没有超过8 位,那么在实际汇编的时候该ldr 伪指 令是被转换为mov 指令的。RISC 架构 MOV 指令只能在寄存器之间移动数据,或者把立即数移到寄存器中 LDR :加载指令(将数据从内存中移到寄存器)将数据从内存中移动到寄 存器中 比如:ldr r0,0x12345678 就是把0x12345678 这个地址中的值存放到r0 中。ldr 伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:ldr r0, =0x12345678 这样,就把0x12345678 这个地址写到r0 中了。所以,ldr 伪指令和mov 是比较相似的。只不过mov 指令限制了立即数的长度为8 位, 也就是不能超过512。而ldr 伪指令没有这个限制。如果使用ldr 伪指令时,后 面跟的立即数没有超过8 位,那么在实际汇编的时候该ldr 伪指令是被转换为

微机原理实验报告-冒泡排序

一、实验目的 (1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。 (2)理解并掌握各种指令的功能,编写完整的汇编源程序。 (3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。 二、实验内容及要求 (1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。(2)实验要求: ①编制程序,对这组数进行排序并输出原数据及排序后的数据; ②利用DEBUG调试工具,用D0命令,查看排序前后内存数据的变化; ③去掉最大值和最小值,求出其余值的平均值,输出最大值、最小值和平均值; ④用压栈PUSH和出栈POP指令,将平均值按位逐个输出; ⑤将平均值转化为二进制串,并将这组二进制串输出; ⑥所有数据输出前要用字符串的输出指令进行输出提示,所有数据结果能清晰显示。 三、程序流程图Array(1)主程序:MAIN 否

(2)冒泡排序子程序: SORT 是 否 是 否 是

四、程序清单 NAME BUBBLE_SORT DATA SEGMENT ARRAY DW 5 DUP(?) ;输入数据的存储单元 COUNT DW 5 TWO DW 2 FLAG1 DW 0 ;判断符号标志 FLAG2 DB 0 ;判断首位是否为零的标志 FAULT DW -1 ;判断出错标志 CR DB 0DH,0AH,'$' STR1 DB 'Please input five numbers seperated with space and finished with Enter:','$' STR2 DB 'The original numbers:','$' STR3 DB 'The sorted numbers:','$' STR4 DB 'The Min:','$' STR5 DB 'The Max:','$' STR6 DB 'The Average:','$' STR7 DB 'The binary system of the average :','$' STR8 DB 'Input error!Please input again!''$' DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA,ES:DATA START: PUSH DS AND AX,0 PUSH AX MOV AX,DATA MOV DS,AX LEA DX,STR1 MOV AH,09H ;9号DOS功能调用,提示输入数据 INT 21H CALL CRLF ;回车换行 REIN: CALL INPUT ;调用INPUT子程序,输入原始数据 CMP AX,FAULT ;判断是否出错, JE REIN ;出错则重新输入 LEA DX,STR2 MOV AH,09H ;9号DOS功能调用,提示输出原始数据 INT 21H CALL OUTPUT ;调用OUTPUT子程序,输出原始数据 CALL SORT ;调用SORT子程序,进行冒泡排序 LEA DX,STR3 MOV AH,09H ;9号DOS功能调用,提示输出排序后的数据 INT 21H CALL OUTPUT ;调用OUTPUT子程序,输出排序后的数据

arm汇编之冒泡排序

arm汇编之冒泡排序 开始在ADS里面写程序后,发现自己之前对于X86汇编的学习完全归还给了我的老师门。最直接的便是要写一个从小到大的冒泡排序。冒泡排序的思想我想就不用赘述了。以前c语言遍的应该很多了。算法不成问题,可是数据结构知道是数组,可是数组在arm汇编里面该在怎么定义了? 其实,还真感觉又要从零开始了。X86的汇编已经完全归还给了我敬爱的微机原理老师。 网上看到了一个广为流传的冒泡排序,既然写不出来,那就先学习它的精髓,说不定还能为我所用了。 代码详细的看了看。具体翻译如下(arm汇编指令不太熟悉,就当时温习吧): AREA Sort,CODE,READONLY :首先用AREA伪代码加上CODE,表明下面引出的将是一个代码段(于此相对的还有数据段DATA),ENTRY 和END成对出现,说明他们之间的代码是程序的主体 ENTRY:表示代码的开始 Start MOV r4,#0 :将0赋值给r4 LDR r6,=src :在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同样的,当src变量代表一个数组时,需要r0寄存器指向src则需要这样赋值:LDR r0,=src 当格式是 LDR r0,[r2],则第二个参数表示寄存器,我的理解是[]符号表示取内容,r2本身表示一个寄存器地址,取内容候将其存取r0这个寄存器中跳转 到LDR R0,[R1]将存储器地址为R1的字数据读入寄存器R0 LDR R0,[R1,#8]将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1,此句是将数据src的首地址赋值给R6 ADD r6,r6,#len:R6为数组的最后一个数组元素的地址。数组这时是连续分配的。 Outer LDR r1,=src:将src地址即数组元素首地址赋值给R1 Inner LDR r2,[r1] :将存储器地址为r1的字数据读入r2 LDR r3,[r1,#4]:将存储器地址为R1+4的字数据读入R3 CMP r2,r3 :比较R2,R3 STRGT r3,[r1]:若(有符号数)大于,则将R3中的字数据写入以R1为地址的存储器中

基于8086用汇编语言实现的十个有符号数的排序(冒泡排序算法,输入为补码,从小到大)

提示:在做实验时,我们要自己将代码区和数据区分开,因为8086上没有软件帮我们完成这个任务。 MOV R0,#218 //之所以选择208这个大点的地址,是因为避免将数据写到了代码区LOOP1:IN //将数据读入A ADD A,#128 //将补码转换为其对应的移码,因为补码本身参与加减不能比较出大 //小,而移码就是将其真值在数轴上平移了2的n次方MOV @R0,A MOV A,R0 sub a,#1 SUB A,#208 //判断有没有输入完10个数 JZ LOOP2 //输入完数据,跳转 ADD A,#208 MOV R0,A JMP LOOP1//没有输入完,就跳回接着输入 LOOP2:MOV R0,#9 //9轮循环比较就可以排完序 MOV R1,#209 MOV R2,#210 LOOP4:MOV A,@R2 SUBC A,@R1 JC LOOP3 //若210地址指向的单元中的数比209地址指向的单元中的小,则交 //换 LOOP5:MOV A,R2 ADD A,#1 SUBC A,#219 //判断此轮有没有比较完 JZ LOOP6 //若比较完,就跳到LOOP6,否则继续比较 ADD A,#219 MOV R2,A JMP LOOP4 LOOP3:MOV A,@R1 MOV 208,A MOV A,@R2 MOV @R1,A MOV A,208 MOV @R2,A JMP LOOP5 //交换完了就跳回 LOOP6: MOV A,R1 ADD A,#1 MOV R1,A ADD A,#1 MOV R2,A //让R2始终指向的是R1下一个单元 MOV A,R0 SUB A,#1 JZ LOOP7 //判断9轮比较有没有完成,若完成,跳LOOP7,否则,继续比 //较

微机原理实验报告-冒泡排序

WORD格式 一、实验目的 (1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。 (2)理解并掌握各种指令的功能,编写完整的汇编源程序。 (3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。 二、实验内容及要求 (1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。(2)实验要求: ①编制程序,对这组数进行排序并输出原数据及排序后的数据; ②利用DEBUG调试工具,用D0命令,查看排序前后内存数据的变化; ③去掉最大值和最小值,求出其余值的平均值,输出最大值、最小值和平均值; ④用压栈PUSH和出栈POP指令,将平均值按位逐个输出; ⑤将平均值转化为二进制串,并将这组二进制串输出; ⑥所有数据输出前要用字符串的输出指令进行输出提示,所有数据结果能清晰显示。 三、程序流程图 开 始(1)主程序:MAIN 初始化 键盘输入数据 调用INPUT子程序 显示输入错误 否 输入是否正确 是 显示原始数据 调用OUTPUT子程序

WORD格式 显示冒泡排序后的数据 调用SORT子程序 调用OUTPUT子程序 显示最小值Min 显示One子程序 显示最大值Max 调用One子程序 显示其余数平均值Average 调用One子程序 显示平均值二进制串Binary 调用One子程序 结束

(2)冒泡排序子程序:SORT COUNT1----外循环次数 进入COUNT2----内循环次数 i----数组下标 初始化 COUNT1=N-1 COUNT2=COUNT1 SI=0 否 Ai≥i A+1 是 Ai与A i+1两数交换 SI=SI+2 COUNT2=COUNT2-1 否 COUNT2=0? 是 COUNT1=COUNT1-1 否 COUNT2=0? 是 返回

汇编语言实现冒泡排序(一)

;用汇编语言实现实现冒泡排序,并将排序后的数输出 DATAS SEGMENT A dw 100,344,3435,43433,3438,343,134,80,8,1000,65535,54,45 N=$-A ;计算数字所占的字节数 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START:MOV AX,DATAS MOV DS,AX MOV SI,0 ;SI遍历数字;前一个数的地址 MOV CX,N/2-1 ;设置循环次数,M(M=N/2)个数需要,循环M-1次 CALL BUBBLE ;调用BUBBLE将原来的数排序 ;输出排序后的数 MOV CX,N/2 ;循环M次输出排序后的M个数 MOV SI,0 ;SI遍历排序后的数 MOV DI,0 ;用DI记录数字的位数 MOV BP,N+5 ;BP用于遍历存储的转化后的字符的位置 SHOW: PUSH CX ;循环次数入栈 MOV DX,0 ;由于将要进行16位除需要置高16位为0 MOV AX,[SI] ;低16位为排序后的数 CALL DTOC ;调用DTOC将十进制数转换为字符串 CALL SHOW_STR ;调用SHOW_STR将一个数转化得到的字符串输出ADD SI,2 ;下一个数 POP CX ;循环次数出栈栈 LOOP SHOW MOV AH,4CH INT 21H ;冒泡排序 BUBBLE PROC L1: PUSH CX ;将循环次数入栈 LEA SI,A ;SI遍历DATAS数据段的数字 L2: MOV AX,A[SI] ;将前一个数存于AX CMP AX,A[SI+2] ;比较前后两个数 JBE NEXT ;如果前一个数小于或等于后一个数则继续本轮的比较XCHG AX,A[SI+2] ;否则,交换前后两个数的位置 MOV A[SI],AX NEXT:ADD SI,2 ;下一个数 LOOP L2 ;注意内层循环的次数已经确定了 POP CX ;将循环次数出栈 LOOP L1 ;下一轮比较 RET BUBBLE ENDP

汇编课程设计排序

汇编语言实验报告 学院名称:计算机科学与技术学院题目:汇编语言实现数组排序 专业班级:信息安全111 姓名:王丹 学号:1108060090 指导老师:王晓鹏

一、课程设计的性质和目的: 通过课程设计,进行程设计方法和技能的基本训练,巩固在课堂上学到的有关软件程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。 二、课程设计的要求: 1、遵循模块化、结构化的程序设计方法。 2、要求程序必须正确。 3、程序简明易懂,多运用输入输出提示,有出错信息及必要的注释。 4、要求程序结构合理,语句使用得当。 5、适当追求编程技巧和程序运行效率。 三、主要仪器设备及软件: PC机、MASM汇编软件。 四、课程设计题目及要求: 题目:汇编数组排序(选用冒泡排序算法) 五、课题分析及设计思路: 冒泡排序: 依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2 个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两

个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。 冒泡排序可分为正向和逆向两种排序.通过主程序对子程序的调用来 完成输入输出,排序,循环,转化等功能。 六、程序主要流程图:

汇编语言程序例题

【例】试编写一程序计算以下表达式的值。 w=(v-(x*y+z-540))/x 式中x、y、z、v均为有符号字数据。 设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图所示。 DATA SEGMENT X DW 200 Y DW 100 Z DW 3000 V DW 10000 W DW 2 DUP() DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK START:MOV AX,DATA MOV DS,AX ;DATA→AX MOV AX,X IMUL Y ;(X)*(Y)→DX:AX MOV CX,AX

MOV BX,DX ;(DX:AX)→(BX:CX) MOV AX,Z CWD ;(Z)符号扩展 ADD CX,AX ADC BX,DX ;(BX:CX)+(DX:AX)→(BX:CX) SUB CX,540 SBB BX,0 ;(BX:CX)-540→(BX:CX) MOV AX,V CWD ;(V)符号扩展 SUB AX,CX SBB DX,BX ;(DX:AX)-(BX:CX)→(DX:AX) IDIV X ;(DX:AX)/X MOV W,AX ;商→W MOV W+2,DX ;余数DX→W+2 MOV AH,4CH INT 21H CODE ENDS ;退出DOS 状态 END START 【例】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT TAB DB 80,85,86,71,79,96 DB 83,56,32,66,78,84 NO DB 10 ENGLIST DB DATA ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE BEGIN:MOV AX,DATA MOV DS ,AX LEA BX,TAB MOV AL,NO DEL AL XLAT T AB MOV ENGLISH,AL MOV AH,4CH INT 21H CODE ENDS END BEGIN

史上最牛最完整的汇编语言冒泡排序程序

;题目:编制一个完整的汇编语言程序,从键盘上读入若干个(可以超过十个)十进制数(正数),排序后在屏幕上输出。 ;采用冒泡法排序,综合运用子程序和宏汇编,使程序模块化。 ;程序代码M_DIRECT MACRO STRING ;定义一个宏,调用09 号 DoS功能在屏幕上显示一个字符串 MoV DX,oFFSET AH,O9 21H STRING MoV INT ENDM DATA SEGMENT DIR1 DB 'count of numbers to sort:$ ' ;提示输入要排序的数据的个数 DIR2 DB 'please input sorting numbers:$ '; 提示输入要排序的数据 DIR3 DB 'sorting result:$ ' ;在屏幕上提示排好续的数据 DIR4 DB '*************************$ ' DIR5 DB 'please choose u(up)ord(down):$ ' DIR6 DB 'input error$ ' CoUNT = 1OO WTEMP DW ? ARRAY DW CoUNT DUP(?) ;用来保存输入的数据 CRLF DB 13,1O, '$ ' ;实现回车换行的功能,13→ODH,回车;10→OAH,换行 LEN DW ;保存实际输入的数据的个数 DATA ENDS CoDE SEGMENT MAIN PRoC FAR ASSUME CS:CoDE,DS:DATA START: PUSH DS SUB AX,AX PUSH ;置AX 为O AX

MOV AX,DATA ;将数据段的地址送到DX 中 MOV DS,AX READ: M_DIRECT DIR1 ; 宏调用,在屏幕上提示输入要输入的数据的个数 CALL P_GETNEW ;调用子程序P-GETNEW输入要输入的数据的个 数 MOV CX,AX MOV LEN,AX LEA BX,ARRAY MOV AH,09 ; 调用09 号功能,实现回车换行 LEA DX,CRLF INT 21H ;屏幕提示输入要排序的数据 M_DIRECT DIR2 GETNUMBER: CALL P_GETNEW ; 输入数据并保存到ARRA 丫中 MOV [BX],AX ADD BX ,2 LOOP GETNUMBER CX,LEN SORT: ; 排序程序部分 MOV DEC CX MOV AH,09H LEA DX,CRLF INT 21H M_DIRECT DIR5 COMPARE:MOV AH,01H INT 21H CMP AL, 'U' ;判断是升序排序还是降序排序 JZ

几道简单ARM汇编代码题

26.用ARM汇编代码实现以下C程序段(不要求程序格式,只需写出主要语句)。if (x>64) x=0; else y=0; 27.用ARM汇编语言完成一个C语言嵌入汇编方式实现字符串(数组)拷贝的功能(要求有基本的程序格式)。 29.用ARM汇编代码实现以下C程序段(不要求程序格式,只需写出主要语句)。if (x<100) x=1; else y=1; 25.有如下C语言代码段,请结合ARM处理器硬件特性,比较以下代码中fact1和fact2两个函数的性能, 并说明理由。 int fact1(int limit) { for (i=1;i

ENTRY ; 程序入口 start LDR r1, =srcstr ; 初始串的指针 LDR r0, =dststr ; 结果串的指针 BL strcopy ; 调用子程序执行复制 stop MOV r0, #0x18 ; 执行中止 LDR r1, =0x20026 ; SWI 0x123456 ; strcopy LDRB r2, [r1],#1 ; 加载并且更新源串指针 STRB r2, [r0],#1 ; 存储且更新目的串指针; CMP r2, #0 ; 是否为0 BNE strcopy ; MOV pc,lr ; AREA Strings, DATA, READWRITE srcstr DCB "First string - source",0 dststr DCB "Second string - destination",0 END 29. 和26题差不多啊。 MOV R0,#X MOV R1,#100 CMP R0,R1 MOVLS RO,#1 MOVHI R2,#1 25. 这题两个函数功能一样,处理器特性我就不说了,任何一本介绍ARM的书都有讲解。在效率方面第一个好些,因为i=1和i=limit中 i=1中,只要读i的地址,然后把2传递即可 i=limit中,既要读i的地址,也要读limit的地址,然后再传值很明显第一个效率高。 我的这个回答是看过一本程序员面试宝典中的程序效率问题启发的,应该不会错的。呵呵…… 希望我的回答对你有所收获。祝你进步!

相关文档
相关文档 最新文档