最新中南大学试题.docx

上传人:b****6 文档编号:5672514 上传时间:2022-12-31 格式:DOCX 页数:17 大小:25.95KB
下载 相关 举报
最新中南大学试题.docx_第1页
第1页 / 共17页
最新中南大学试题.docx_第2页
第2页 / 共17页
最新中南大学试题.docx_第3页
第3页 / 共17页
最新中南大学试题.docx_第4页
第4页 / 共17页
最新中南大学试题.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

最新中南大学试题.docx

《最新中南大学试题.docx》由会员分享,可在线阅读,更多相关《最新中南大学试题.docx(17页珍藏版)》请在冰豆网上搜索。

最新中南大学试题.docx

最新中南大学试题

;用汇编语言实现实现冒泡排序,并将排序后的数输出

DATASSEGMENT

Adw3108562236143313

N=$-A;计算数字所占的字节数

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

MOVSI,0;SI遍历数字;前一个数的地址

MOVCX,N/2-1;设置循环次数,M(M=N/2)个数需要,循环M-1次

CALLBUBBLE;调用BUBBLE将原来的数排序

;输出排序后的数

MOVCX,N/2;循环M次输出排序后的M个数

MOVSI,0;SI遍历排序后的数

MOVDI,0;用DI记录数字的位数

MOVBP,N+5;BP用于遍历存储的转化后的字符的位置

SHOW:

PUSHCX;循环次数入栈

MOVDX,0;由于将要进行16位除需要置高16位为0

MOVAX,[SI];低16位为排序后的数

CALLDTOC;调用DTOC将十进制数转换为字符串

CALLSHOW_STR;调用SHOW_STR将一个数转化得到的字符串输出

ADDSI,2;下一个数

POPCX;循环次数出栈栈

LOOPSHOW

MOVAH,4CH

INT21H

;冒泡排序

BUBBLEPROC

L1:

PUSHCX;将循环次数入栈

LEASI,A;SI遍历DATAS数据段的数字

L2:

MOVAX,A[SI];将前一个数存于AX

CMPAX,A[SI+2];比较前后两个数

JBENEXT;如果前一个数小于或等于后一个数则继续本轮的比较

XCHGAX,A[SI+2];否则,交换前后两个数的位置

MOVA[SI],AX

NEXT:

ADDSI,2;下一个数

LOOPL2;注意内层循环的次数已经确定了

POPCX;将循环次数出栈

LOOPL1;下一轮比较

RET

BUBBLEENDP

;将十进制数转换为字符串并储存起来

DTOCPROC

S:

MOVCX,10;将除数10,放入CX中

CALLDIVDW;调用DIVDW程序

ADDCL,30H;把数字转换为ASCII码,这样就能显示了

MOVDS:

[BP],CL;把ASCII码放到内存中

INCDI;用DI记录循环的次数

PUSHAX;将低16位入栈

ADDAX,DX;将高位与低位相加,接着判断是否已经除尽

JZBACK;除尽后返回调用处

POPAX;将低16位出栈

DECBP;逆序存放转化后的字符,便于主程序调用SHOW_STR

JMPS

BACK:

POPAX;为了得到正确的IP值,需要出栈一次

RET

DTOCENDP

;子程序定义开始,功能是分离被除数的各个位的数字

;公式:

X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N

DIVDWPROC

PUSHAX;低16位入栈

MOVAX,DX;将高16位写入AX,

MOVDX,0;将高16位置零

DIVCX;将新的数除10,

MOVBX,AX;将商int(H/N)转移到BX,默认余数rem(H/N)在DX

POPAX;将低16位出栈,

DIVCX;将[rem(H/N)*65536+L]除10,默认余数在DX

MOVCX,DX;将余数转移到CX

MOVDX,BX;将商int(H/N)转移到dx,相当于int(H/N)*65536

RET;子程序定义结束

DIVDWENDP

;实现字符串的输出

SHOW_STRPROC

S2:

MOVAH,2;输出数字转化后的字符串

MOVDL,DS:

[BP]

INT21H

INCBP;顺序输出

DECDI;数字的位数减一

JZOK;字符串输出完了就结束

JMPS2;否则继续输出

OK:

MOVAH,2;输出空格

MOVDL,0

INT21H

RET

SHOW_STRENDP

CODESENDS

ENDSTART

 

第一个累加和的源码:

  AREATEXT,CODE,READWRITE  

  ENTRY  

  MOVR0,#100 ;循环数目  

  MOVR1,#0    ;初始化数据  

LOOP  

  ADDR1,R1,R0 ;将数据进行相加,获得最后的数据  

  SUBSR0,R0,#1;循环数据R0减去1  

  CMPR0,#0    ;将R0与0比较看循环是否结束  

  BNELOOP    ;判断循环是否结束,接受则进行下面的步骤   

  LDRR2,=RESULT  

  STRR1,[R2]  

RESULT  

  DCD0  

STOP  

  BSTOP 

第二个排序的源码附上:

  ;排列算法:

先将所有的数据与第一个进行比较,最后取出最小的数据放到第一个内存单元中  

  ;然后再从第二个内存单元开始进行比较,将第二小的数据放到第二个内存单元中,  

  ;以此内推则能将十个数据进行排列。

  

  AREATEXT,CODE,READWRITE  

  ENTRY  

  LDRR0,=DATA   ;获得DATA数据的起始地址  

  MOVR1,R0    

  MOVR5,#9      ;开始的循环数目是10次,所以应该从9开始  

  MOVR6,R5  

COMPARE  

  ADDR0,R0,#4   ;将R0所存储的地址+4表示为下一个要比较的数的地址   

  SUBR6,R6,#1 ;循环1次减1  

  LDRR2,[R1] ;将放在寄存器中的数据取出进行大小比较  

  LDRR3,[R0]  

  CMPR3,R2  

  MOVCCR7,R2 ;如果后面的地址的数值比前一个小则交换他们的数据  

  MOVCCR2,R3  

  MOVCCR3,R7  

  STRR2,[R1] ;将数据存储到相应的内存单元中  

  STRR3,[R0]  

  CMPR6,#0      ;看每次的循环是否结束  

  BNECOMPARE  

  ADDR1,R1,#4   ;每次循环结束以后将初始的指向的内存地址后移一个单元  

  MOVR0,R1      ;重新初始化上个循环中的寄存器中保存的地址  

  SUBR5,R5,#1   ;每次循环以后上面在以后的循环中的次数都会减1  

  MOVR6,R5  

  CMPR5,#0  ;判断所有的循环是否结束  

  BNECOMPARE  

DATA  

  DCD9,4,6,7,8,1,3,2,0,5  

STOP  

  BSTOP 

 

 

;

;      ARM汇编编程-实现双层for循环

;

 

       AREA     Block,     CODE                  ; 声明代码段

       ENTRY

 

       ;      for(i=0;i<10;i++)

       ;             for(j=i+1;j<=10;j++)

       ;                    z+=1

      

START

       MOVR1,#0         ;i=0

       MOVR0,#0         ;Z

      

LOOP

       CMPR1,#10               ;i<10

       BEQSTOP

      

       ADDR2,R1,#1           ;j=i+1

LOOP1  

       CMPR2,#10+1                  ;j<=10

       ADDNER0,R0,#1      ;z+=1

       ADDNER2,R2,#1      ;j++

       BNELOOP1

       ADDR1,R1,#1           ;  i++

       BLOOP

      

STOP

       MOVR0,#0x18

       LDRR1,=0x20026

       SWI0x123456      

       END

      

      

 

;

;      数据块拷贝,利用LDR/STR指令

;

 

numEQU      10

 

       AREA     BlockData,      DATA            ; 声明数据段

src   DCD      0,1,2,3,4,5,6,7,8,9                  ; 定义十个数

dst   SPACE    10*4

 

       AREA     Block,     CODE                  ; 声明代码段

       ENTRY

 

START

       LDR       R1,=src                      

       LDRR2,=dst

       MOVR3,#num

      

LOOP

       LDRR0,[R1],#4

       STRR0,[R2],#4

       SUBSR3,R3,#1

       BNELOOP

      

STOP

       MOVR0,#0x18

       LDRR1,=0x20026

       SWI0x123456      

       END

 

 

汇编语言程序示例

 

;例五:

利用跳转表实现程序跳转

;项目名:

Example5.mcp,文件名:

Example5.s

———————————————————————————————————————

              AREA     Jump,      CODE,   READONLY

num EQU       2

              ENTRY 

             

start

              MOV      R0,  #0

              MOV      R1,  #3

              MOV      R2, #2

              BL          arithfunc

              B            .

             

arithfunc

              CMP       R0,  #num

              MOVHS  PC,  LR

              ADR       R3,  JumpTable

              LDR       PC,  [R3,R0,LSL#2]

 

JumpTable

              DCD      DoAdd

              DCD      DoSub

 

DoAdd

              ADD      R0,  R1,  R2

              MOV      PC,  LR

             

DoSub

              SUB R0,  R1,  R2

              MOV      PC,  LR

             

              END

 

3、  存储器从0x400000开始的100个单元中存放着ASCII码,编写程序,将其所有的小写字母转换成大写字母,对其它的ASCII码不做变换。

       解:

              MOV             R0,#0x400000

              MOV             R1,#0

LP

              LDRB            R2,[R0,R1]

              CMP              R2,#0x61

              BLO              NEXT

              CMP              R2,#0x7B    ;0x61---0x7A为小写字母的ASC

              SUBLO   R2, R2,#0x20

              STRBLO R2,[R0,R1]

NEXT

              ADD             R1, R1,#1

              CMP              R1,#100

              BNE              LP

8、  编写一简单ARM汇编程序段,实现1+2+…+100的运算。

       解:

              MOV             R2,#100

              MOV             R1,#0

LOOP

              ADD             R1,R1,R2  ;R1中为累加和

              SUBS             R2,R2,#1  ;R2控制循环

              BNE              LOOP

4、  编写程序,比较存储器中0x400000和0x400004两无符号字数据的大小,并且将比较结果存于0x400008的字中,若两数相等其结果记为0,若前者大于后者其结果记为1,若前者小于后者其结果记为-1。

       解:

              MOV             R0,#0x400000

              LDR              R1,[R0]        ;取第1个数

              LDR              R2,[R0,#4]      ;取第2个数

              CMP              R1,R2          ;两个数相比较

              MOVHI  R1,#1          ;R1大

              MOVLO R1,#-1        ;R1小

              MOVEQ R1,#0          ;两个数相等

              STR        R1,[R0,#8]

7、  编写一程序,存储器中从0x400200开始有一个64位数。

(1)将取反,再存回原处;

(2)求其补码,存放到0x400208处。

       解:

              LDR              R0,=0x400200

              LDR              R2,=0xFFFFFFFF

              LDR              R1,[R0]        ;取低32位数

             EOR              R1,R1,R2         ;取反

              STR        R1,[R0]        ;存低32位反码

             ADDS            R1,R1,#1         ;又加1为求补

              STR        R1,[R0,#8]      ;存低32位补码

              LDR              R1,[R0,#4]      ;取高32位数

             EOR              R1,R1,R2         ;取反

              STR        R1,[R0,#4]      ;存高32位反码

             ADC              R1,R1,#0         ;高32位求补

              STR        R1,[R0,#12]     ;存高32位补码

 

Example7Example7.OC

例七:

汇编语言与C/C++的混和编程

项目名:

Example7.mcp

文件名:

Example7_asm.s

文件名:

Example7_c.c

———————————————————————————————————————

;Example7_asm.s

AREA     Asm_C,   CODE,   READONLY

              ENTRY

             

              LDR              SP,=0x4000

              IMPORT __main

              BL          __main

              B            .

              END

 

———————————————————————————————————————

#include

intmain()

{

       printf("Helloworld\n");

       return0;

}

 

中南大学考试试卷(答案)

2012--2013学年2学期时间100分钟

2013年6月4日嵌入式系统

课程32学时2.0学分

考试形式:

开卷

专业年级:

测控10级总分100分,占总评成绩70%注:

此页不作答题纸,请将答案写在答题纸上

一.填空题(每空1分,共20分)

1.嵌入性、专用性与计算机系统是嵌入式系统的3个基本要素。

2.ARM7微处理器采用冯.诺依曼总线架构;ARM9微处理器采用哈佛总线架构。

3.ARM有三种含义,分别是公司名称、一类处理器的通称与技术名称。

4.在RISC中,完成数据在寄存器和外部存储器之间的传输采用独立的load与store指令。

5.ARM核有两个指令集,分别是ARM、THUMB。

6.ARM公司提供的专门用于ARM相关应用开发和调试的综合性软件为:

ADS1.2。

7.ARM微处理器的工作状态一般有两种,两种状态之间的切换采用BX指令。

8.当程序状态寄存器的内容为0xA030时,说明处理器运行THUMB状态和用户模式下。

9.ARM核中的R14(或LR)寄存器,常用作保存子程序的返回地址。

10.汇编语言的源程序主要由指令、伪指令、语句标号与注释等四部分组成。

二.简答题(56分,每小题7分)

1.简述嵌入式系统的概念、组成及特点。

答:

嵌入式系统是以应用为中心,以计算机技术为基础,采用可裁减软硬件,适用于对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。

一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成。

其特点有1)嵌入式系统通常是面向特定应用的2)嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物3)嵌入式系统的硬件和软件都必须高效率地设计,量体裁衣、去除冗余4)嵌入式系统和具体应用有机地结合在一起,它的升级换代也是和具体产品同步进行5)为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中6)嵌入式系统本身不具有自主开发能力。

2.S3C2440A中的中断控制器可以从多个中断源接收中断请求,简述中断控制器请求的FIQ及IRQ中断机制。

 

3.试说明看门狗Watchdog的作用和原理?

答:

在嵌入式应用中,CPU必须可靠工作,即使因为某种原因进入了一个错误状态,系统也应该可以自动恢复。

看门狗的用途就是使微控制器在进入错误状态后的一定时间内复位。

其工作原理是在系统正常工作时,用户程序每隔一段时间执行喂狗动作,如果系统出错,喂狗时隔超过看门狗溢出时间,那么看门狗将会产生复位信号,使系统复位。

4.简要说明一下ARM的异常的响应和返回的过程。

答:

A.异常的进入:

(1)将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。

(2)将CPSR复制到相应的SPSR中。

(3)根据异常类型,强制设置CPSR的运行模式位。

(4)强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序。

也可以设置中断禁止位来阻止其他无法处理的异常嵌套。

B.异常的返回:

(1)将链接寄存器LR的值减去相应的偏移量后送到PC中。

(2)将SPSR复制回CPSR中。

(3)如果进入时设置了中断禁止位,那么清除该标志。

5.在C语言与汇编程序混合编程中,子程序调用的ATPCS规定了哪些基本规则。

简要说明寄存器使用规则。

答:

基本规则有三个方面内容,分别是寄存器的使用规则及其相应的名字,数据栈的使用规则,参数传递规则。

A寄存器的使用规则:

(1)子程序通过寄存器R0~R3来传递参数。

这时寄存器可以记作:

A0~A3,被调用的子程序在返回前无需恢复寄存器R0~R3的内容。

(2)在子程序中,使用R4~R11来保存局部变量,这时寄存器R4~R11可以记作:

V1~V8。

如果在子程序中使用到V1~V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作。

在THUMB程序中,通常只能使用寄存器R4~R7来保存局部变量。

(3)寄存器R12用作子程序间scratch寄存器,记作ip;在子程序的连接代码段中经常会有这种

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1