下面是一份 x86-64 汇编代码段,可以实现将 RDX 和 RAX 中的 128 位数据逻辑左移一位(即将高位移到低位,低位填 0)的功能。代码中使用了 64 位寄存器 RDI 来存储左移 *** 作的结果。
; 将 RDX 和 RAX 中的 128 位数据逻辑左移一位,结果存放在 RDI 中
; 参数:无
; 返回值:无
section text
global _start
_start:
; 将 RAX 的最高位保存到 CF 标志位中
shr rax, 63
; 将 RDX 的最高位保存到 RAX 的最低位,并将 RAX 的最高位保存到 CF 标志位中
rcl rdx, 1
; 将 RAX 的最低位保存到 RDX 的最高位
rcr rax, 1
; 将 RDI 中的数据清零
xor rdi, rdi
; 将 RDX 和 RAX 中的数据合并,存储到 RDI 中
or rdi, rdx
or rdi, rax
; 程序结束
mov eax, 1
xor ebx, ebx
int 0x80
代码中使用了 shr(算术右移)和 rcl(循环左移)指令将 RAX 和 RDX 中的数据逻辑左移一位,并将结果存储到 RDI 中。其中,shr rax, 63 的作用是将 RAX 中的最高位保存到 CF 标志位中;rcl rdx, 1 的作用是将 RDX 中的最高位保存到 RAX 的最低位,并将 RAX 的最高位保存到 CF 标志位中;rcr rax, 1 的作用是将 RAX 的最低位保存到 RDX 的最高位。最后,使用 or 指令将 RDX 和 RAX 中的数据合并,并存储到 RDI 中。
需要注意的是,在本示例中,假设 RAX 和 RDX 中的数据都是无符号整数。如果数据是带符号的,需要考虑符号扩展的问题。此外,代码中也没有进行错误处理,如果输入的数据不符合要求,程序可能会出现异常行为。
附录1:晶振为12M的音乐频率表
音符 频率(Hz) 简谱码(T值)
低1DO 262 63628 TH0=F7H TL0=24H
#1DO# 277 63731 TH0=F8H TL0=F3H
低2RE 294 63835 TH0=F9H TL0=5BH
#2RE# 311 63928 TH0=F9H TL0=B8H
低3M 330 64021 TH0=FAH TL0=15H
低4FA 349 64103 TH0=FAH TL0=67H
#4FA# 370 64185 TH0=FAH TL0=B9H
低5SO 392 64260 TH0=FBH TL0=04H
#5SO# 415 64331 TH0=FBH TL0=4BH
低6LA 440 64400 TH0=FBH TL0=90H
#6 466 64463 TH0=FBH TL0=CFH
低7SI 494 64524 TH0=FCH TL0=0CH
中1DO 523 64580 TH0=FCH TL0=44H
#1DO# 554 64633 TH0=FCH TL0=79H
中2RE 587 64684 TH0=FCH TL0=ACH
#2RE# 622 64732 TH0=FCH TL0=DCH
中3M 659 64777 TH0=FDH TL0=09H
中4FA 698 64820 TH0=FDH TL0=34H
#4FA# 740 64860 TH0=FDH TL0=5CH
中5SO 784 64898 TH0=FDH TL0=82H
#5SO# 831 64934 TH0=FDH TL0=A6H
中6LA 880 64968 TH0=FDH TL0=C8H
#6 932 64994 TH0=FDH TL0=E2H
中7SI 988 65030 TH0=FEH TL0=06H
高1DO 1046 65058 TH0=FEH TL0=22H
#1DO# 1109 65085 TH0=FEH TL0=3DH
高2RE 1175 65110 TH0=FEH TL0=56H
#2RE# 1245 65134 TH0=FEH TL0=6EH
高3M 1318 65157 TH0=FEH TL0=85H
高4FA 1397 65178 TH0=FEH TL0=9AH
#4FA# 1480 65198 TH0=FEH TL0=AEH
高5SO 1568 65217 TH0=FEH TL0=C1H
#5SO# 1661 65235 TH0=FEH TL0=D3H
高6LA 1760 65252 TH0=FEH TL0=E4H
#6 1865 65268 TH0=FEH TL0=F4H
高7SI 1967 65283 TH0=FFH TL0=03H
休止符用TH0=FFH ,TL0=FFH表示
附录2:LCD相关资料
两行液晶显示的地址:(均为十六位计数)
0 1 2 3 4 5 6 7 8 9 A B C D E F
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
命令格式要求,设置地址指针的时候第8位为1,后边为地址,即AC0~AC6,就是对应上表的地址。
附录3:实验程序:
RS BIT P20 ;定义液晶显示端口标号
RW BIT P21
E BIT P22
;
T0TH EQU 24H ;T0两个暂存变量
T0TL EQU 23H
ORG 0000H
LJMP INITION
ORG 000BH
LJMP T0INT
ORG 0100H
;
;液晶初始化
INITION:
MOV SP,#70H
MOV P0,#01H ;清屏
CALL ENABLE
MOV P0,#38H ;8位,2行显示
CALL ENABLE
MOV P0,#0CH ;屏显on,关光标
CALL ENABLE
MOV P0,#06H ;计数地址加1,自动右移
CALL ENABLE
;
;开机提示
;
MOV P0,#80H
CALL ENABLE
MOV DPTR,#TABLE0 ;写数据的第一行
CALL WRITE1
MOV P0,#00010000B ;光标左移两位
CALL ENABLE
MOV P0,#00010000B
CALL ENABLE
CALL DEL0
LJMP MAIN
;写指令
ENABLE:
CLR RS
CLR RW
SETB E
CALL DEL0
CLR E
RET
;写数据
WRITE1:
MOV R1,#00H ;查表程序,从表头到表尾
A1:
MOV A,R1
MOVC A,@A+DPTR
CALL WRITE2
INC R1
CJNE A,#00H,A1 ;未到字符串末尾继续
RET
WRITE2:
MOV P0,A ;直接将数据写入液晶屏
SETB RS
CLR RW
SETB E
CALL DEL0
CLR E
RET
DEL0:MOV R4,#020H
C0:MOV R5,#020H
C1: DJNZ R5,C1
DJNZ R4,C0
RET
;
TABLE0:DB 'WELCOM HERE',00H
;内存初始化
INITIAL:
MOV R3,#08H
MOV R0,#30H
M1:
MOV @R0,#00H
INC R0
DJNZ R3,M1
RET
;选择按键播放八个音调
MAIN: MOV SP,#80H ;初始化堆栈
MOV TMOD,#11H ;定时器0工作方式0,定时器1工作方式0
SETB EA
SETB ET0 ;计数器0允许
SETB ET1 ;计数器1允许
START: SETB P37 ;关蜂鸣器
CLR TR0 ;定时器不允许
SCAN: ;键盘扫描
MOV A,P1
CJNE A,#0FFH,SU_KEY ;判断键盘按下,跳到SU_KEY,若未按,继续扫描
NOP
LJMP SCAN
SU_KEY:
SU_KEY1:
JB P10,SU_KEY2 ;如果不是第1个键按下,转
MOV DPH,#0FCH
MOV DPL,#44H
SJMP PLAY
SU_KEY2:
JB P11,SU_KEY3 ;如果不是第2个键按下,转
MOV DPH,#0FCH
MOV DPL,#0ACH
SJMP PLAY
SU_KEY3:
JB P12,SU_KEY4 ;如果不是第3个键按下,转
MOV DPH,#0FDH
MOV DPL,#09H
SJMP PLAY
SU_KEY4:
JB P13,SU_KEY5 ;如果不是第4个键按下,转
MOV DPH,#0FDH
MOV DPL,#34H
SJMP PLAY
SU_KEY5:
JB P14,SU_KEY6 ;如果不是第5个键按下,转
MOV DPH,#0FDH
MOV DPL,#82H
SJMP PLAY
SU_KEY6:
JB P15,SU_KEY7 ;如果不是第6个键按下,转
MOV DPH,#0FDH
MOV DPL,#0C8H
SJMP PLAY
SU_KEY7:
JB P16,SU_KEY8 ;如果不是第7个键按下,转
MOV DPH,#0FEH
MOV DPL,#06H
SJMP PLAY
SU_KEY8:
JB P17,KEY1 ;如果不是第8个键按下,转
MOV DPH,#0FEH
MOV DPL,#22H
SJMP PLAY
PLAY:
MOV T0TH,DPH ;存高位字符
MOV T0TL,DPL ;存低位字符
MOV TH0,T0TH
MOV TL0,T0TL
SETB TR0 ;启动定时器0
MOV R2,#01B ;1/4拍
DJNZ R2,PLAY
LCALL DELAY
SJMP JUDGE
JUDGE:
JB P24,START ;按键未按下,则继续扫描,否则,开始放音乐
;选择按键播放音乐
KEY1:
JB P25,KEY2 ;第一个键(P25)按下,放音音乐1
MOV R2,#00H
LCALL MODD ;歌曲号显示
MOV DPTR,#MU_TAB1
AJMP MUSIC
KEY2:
JB P26,KEY3 ;第二个键(P26)按下,放音乐2
MOV R2,#01H
LCALL MODD ;歌曲号显示
MOV DPTR,#MU_TAB2
AJMP MUSIC
KEY3:
JB P27, NEXT_2 ;第三个键(P27)按下,放音乐3
MOV R2,#02H
LCALL MODD ;歌曲号显示
MOV DPTR,#MU_TAB3
AJMP MUSIC
NEXT_2: LJMP START ;返回
MUSIC:
MOV TMOD,#01H
MOV IE,#82H ;允许T0中断
MOV R7,#00H
LOOP:
CLR A
MOVC A,@A+DPTR ;查表取代码
MOV R1,A ;定时器高八位存R1
INC DPTR
PUSH DPH ;保护现场
PUSH DPL
GECI1:
JB P25,GECI2 ;第一个键(P25)按下,显示歌词1
MOV DPTR,#GE1
AJMP GECI
GECI2:
JB P26,GECI3 ;第二个键(P26)按下,显示歌词2
MOV DPTR,#GE2
AJMP GECI
GECI3:
JB P27, TIAOCHU ;第三个键(P27)按下,显示歌词3
MOV DPTR,#GE3
AJMP GECI
TIAOCHU:LJMP START
GECI:
LCALL QINGCHU
MOV P0,#0C0H ;显示的位置
CALL ENABLE
XIANSHI1: MOV A,R7 ;查表取音乐汉语拼音显示
MOVC A,@A+DPTR
CALL WRITE2
INC R7
CJNE A,#00H,XIANSHI1
MOV P0,#00010000B ;将光标左移一位
CALL ENABLE
MOV P0,#00010000B ;将光标左移一位
CALL ENABLE
POP DPL
POP DPH
CLR A
MOVC A,@A+DPTR
MOV R0,A ;定时器低八位存R0
ORL A,R1
JZ NEXT0 ;相或结果全0为休止符
MOV A,R0
ANL A,R1
CJNE A,#0FFH,NEXT ;相与结果为0FFH表示乐曲结束
MOV P0,#01H ;清屏
CALL ENABLE
LJMP INITION ;从头开始演奏
NEXT: MOV T0TH,R1 ;装定时初值
MOV TH0,T0TH
MOV T0TL,R0
MOV TL0,T0TL
SETB TR0 ;启动定时器
SJMP NEXT1
NEXT0: CLR TR0 ;关闭定时器
NEXT1: CLR A
INC DPTR
MOVC A,@A+DPTR ;查延时常数
MOV R2,A
LOOP1:
ACALL D200
DJNZ R2,LOOP1 ;控制延时次数
INC DPTR
AJMP LOOP
D200: MOV R3,#81H ;延时程序
D200B: MOV A,#0FFH
D200A: DEC A
JNZ D200A
DEC R3
CJNE R3,#00H,D200B
RET
QINGCHU:MOV A,#00100000B
MOV P0,#0C0H ;将第二行的第一位置0
LCALL ENABLE
LCALL WRITE2
MOV A,#00100000B ;将第二行的第二位置0
MOV P0,#0C1H
LCALL ENABLE
LCALL WRITE2
MOV A,#00100000B ;将第二行的第三位置0
MOV P0,#0C2H
LCALL ENABLE
LCALL WRITE2
MOV A,#00100000B ;将第二行的第四位置0
MOV P0,#0C3H
LCALL ENABLE
LCALL WRITE2
MOV A,#00100000B ;将第二行的第五位置0
MOV P0,#0C4H
LCALL ENABLE
LCALL WRITE2
MOV A,#00100000B ;将第二行的第六位置0
MOV P0,#0C5H
LCALL ENABLE
LCALL WRITE2
MOV A,#00100000B ;将第二行的第七位置0
MOV P0,#0C6H
LCALL ENABLE
LCALL WRITE2 ;将第二行的第三位置0
;以上等价程序如下
;GECI:MOV R3,#00H ;控制循环次数
;QINGCHU:
;MOV A,#00100000B ;置空格
;PUSH A
;MOV R4,#0C0H ;地址
;MOV A,R4
;MOV P0,A
;POP A
;INC R4
;DEC R3 ;控制循环次数
;CJNE R3,#00H,QINGCHU ;计满十次则执行转移
;
;定时器0中断子程序,定时音乐
;
T0INT: ;中断服务子程序
MOV TH0,T0TH
MOV TL0,T0TL
CPL P37 ;反相输出,演示音乐
RETI
;
;显示
;
MODD:
MOV P0,#8EH
LCALL ENABLE
MOV A,R2
MOV DPTR,#TABLE2
MOVC A,@A+DPTR
LCALL WRITE2
RET
TABLE2:DB 31H,32H,33H
GE1: db 'xin',00h,'nian',00h,'hao',00h,'ya',00h,'xin',00h,'nian',00h,'hao',00h,'ya',00h
db 'zhu',00h,'fu',00h,'da',00h,'jia',00h,'xin',00h,'nian',00h,'hao',00h
GE2: DB 'liang',00H,'zhi',00H,'lao',00H,'hu',00H,'liang',00H,'zhi',00H,'lao',00H,'hu',00H,'pao',00H,'de',00H,'kuai',00H
DB 'pao',00H,'de',00H,'kuai',00H,'yi',00H,'zhi',00H,'mei',00H,'you',00H,'yan',00H,'jing',00H,'yi',00H,'zhi',00H
DB 'mei',00H,'you',00H,'er',00h,'duo',00h,'zhen',00h,'qi',00h,'guai',00h,'zhen',00h,'qi',00h,'guai',00h
GE3: DB 'wo',00h,'ai',00h,'bei',00h,'jing',00h,'tian',00h,'an',00h,'men',00h,'tian',00h,'an',00h
;延时子程序
DELAY:MOV 30H,#100 ;延长时间等待,键盘消抖
D1:MOV R5,#200
D2:DJNZ R5,D2
DJNZ 30H,D1
RET
;新年好
MU_TAB1: DB 0FEH,25H,04H,0FEH,25H,04H
DB 0FEH,25H,06H,0FDH,80H,06H
DB 0FEH,84H,04H,0FEH,84H,04H
DB 0FEH,84H,06H,0FEH,25H,06H
DB 0FEH,25H,04H,0FEH,84H,04H
DB 0FEH,0C0H,04H,0FEH,84H,04H
DB 0FEH,98H,04H,0FEH,84H,04H
DB 0FEH,57H,06H
DB 0FFH,0FFH
;两只老虎
MU_TAB2: DB 0FCH,44H,06H,0FCH,0ACH,06H,0FDH,09H,06H,0FCH,44H,06H
DB 0FCH,44H,06H,0FCH,0ACH,06H,0FDH,09H,06H,0FCH,44H,06H
DB 0FDH,09H,06H,0FDH,34H,06H,0FDH,0A6H,06H
DB 0FDH,09H,06H,0FDH,34H,06H,0FDH,0A6H,06H
DB 0FBH,04H,04H,0FDH,0C8H,04H,0FBH,04H,04H,0FDH,34H,04H
DB 0FDH,09H,04H,0FCH,44H,04H,0FBH,04H,04H,0FDH,0C8H,04H
DB 0FBH,04H,04H,0FDH,34H,04H,0FDH,09H,04H,0FCH,44H,04H
DB 0FCH,44H,06H,0FDH,0A6H,06H,0FCH,44H,06H
DB 0FCH,44H,06H,0FDH,0A6H,06H,0FCH,44H,06H
DB 0FFH,0FFH
;我爱北京天安门
MU_TAB3: DB 0FDH,82H,06H,0FEH,22H,04H,0FDH,82H,04H,0FDH,34H,04H
DB 0FDH,09H,04H,0FCH,0ACH,04H,0FCH,44H,06H
DB 0FFH,0FFH,0FFH,0FFH
END
xxxx0是个十六进制数,最后一位是0的话转换为十进制定会被16整除, 不信你试试,这是因为前四位分别是16的倍数,最后一位是0,加起来还是16的倍数。
堆栈是一种形象的说法,sp指针指向某一地址,成为栈底,数据从栈底开始向上保存,取出的时候按照后进先出的原则,实际是一种保护数据的方式,在微机原理中很重要。
在微指令的控制字段中,每一位代表一个微命令,在设计微指令时,是否发出某个微命令,只要将控制字段中相应位置成"1"或"0",这样就可打开或关闭某个控制门,这就是直接控制法
在63节中所讲的就是这种方法但在某些复杂的计算机中,微命令甚至可多达三四百个,这使微指令字长达到难以接受的地步,并要求机器有大容量控制存储器,为了改进设计出现了以下各种编译法
641 微指令的编译法(编码译码方法)(2)
2字段直接编译法
在计算机中的各个控制门,在任一微周期内,不可能同时被打开,而且大部分是关闭的(相应的控制位为"0")所谓微周期,指的是一条微指令所需的执行时间如果有若干个(一组)微命令,在每次选择使用它们的微周期内,只有一个微命令起作用,那么这若干个微命令是互斥的
例如,向主存储器发出的读命令和写命令是互斥的;又如在ALU部件中,送往ALU两个输入端的数据来源往往不是唯一的,而每个输入端在任一微周期中只能输入一个数据,因此控制该输人门的微命令是互斥的
选出互斥的微命令,并将这些微命令编成一组,成为微指令字的一个字段,用二进制编码来表示, 就是字段直接编译法
641 微指令的编译法(编码译码方法)(3)
例如,将7个互斥的微命令编成一组,用三位二进制码分别表示每个微命令,那么在微指令中,该字段就从7位减成3位,缩短了微指令长度而在微指令寄存器的输出端,为该字段增加一个译码器,该译码器的输出即为原来的微命令
641 微指令的编译法(编码译码方法)(4)
字段长度与所能表示的微命令数的关系如下:
字段长度 微命令数
2位 2~3
3位 4~7
4位 8~15
一般每个字段要留出一个代码,表示本段不发出任何微命令,因此当字段长度为3位时,最多只能表示7个互斥的微命令,通常代码000表示不发微命令
641 微指令的编译法(编码译码方法)(5)
3字段间接编译法
字段间接编译法是在字段直接编译法的基础上,进一步缩短微指令字长的一种编译法
如果在字段直接编译法中,还规定一个字段的某些微命令,要兼由另一字段中的某些微命令来解释,称为字段间接编译法
本方法进一步减少了指令长度,但很可能会削弱微指令的并行控制能力,因此通常只作为直接编译法的一种辅助手段
641 微指令的编译法(编码译码方法)(6)
字段A(3位)的微命令还受字段B控制,当字段B发出b1微命令时,字段A发出a1,1,a1,2,…,a1,7中的一个微命令;而当字段B发出b2微命令时,字段A发出a2,1,a2,2,…,a2,7中的一个微命令,仅当A为000时例外,此时什么控制命令都不产生
641 微指令的编译法(编码译码方法)(7)
4常数源字段E
在微指令中,一般设有一个常数源字段E就如指令中的直接 *** 作数一样E字段一般仅有几位,用来给某些部件发送常数,故有时称为发射字段
该常数有时作为 *** 作数送入ALU运算;有时作为计算器初值,用来控制微程序的循环次数等
642 微程序流的控制 (1)
当前正在执行的微指令,称为现行微指令,现行微指令所在的控制存储器单元的地址称现行微地址,现行微指令执行完毕后,下一条要执行的微指令称为后继微指令,后继微指令所在的控存单元地址称为后继微地址
所谓微程序流的控制是指当前微指令执行完毕后,怎样控制产生后继微指令的微地址
与程序设计相似,在微程序设计中除了顺序执行微程序外还存在转移功能和微循环程和微子程序等,这将影响下址的形成
下面介绍几种常见的产生后继微指令地址的方法
642 微程序流的控制 (2)
(1)以增量方式产生后继微地址
在顺序执行微指令时,后继微地址由现行微地址加上一个增量(通常为1)形成的;而在非顺序执行时则要产生一个转移微地址
机器加电后执行的第一条微指令地址(微程序入口)来自专门的硬件电路,控制实现取令 *** 作,然后由指令 *** 作码产生后继微地址接下去,若顺序执行微指令,则将现行微地址主微程序计数器( PC中)+1产生后继微地址;若遇到转移类微指令,则由 PC与形成转移微地址的逻辑电路组合成后继微地址
642 微程序流的控制 (3)
642 微程序流的控制 (4)
(2)增量与下址字段结合产生后继微地址
将微指令的下址字段分成两部分:转移控制字段BCF和转移地址字段BAF,当微程序实现转移时,将BAF送 PC,否则顺序执行下一条微指令( PC+1)
执行微程序条件转移时,决定转移与否的硬件条件有好几种例如,"运算结果为零","溢出","已完成指定的循环次数"等
我们假设有八种转移情况,定义了八个微命令(BCF取3位),在图中设置计数器CT用来控制循环次数如在执行乘(或除)法指令时,经常采用循环执行"加,移位"(或减,移位)的方法,指令开始执行时,在CT中置循环次数)每执行一次循环,计数器减1,当计数器为零时结束循环又考虑到执行微子程序时,要保留返回微地址,因此图中设置了一个返回寄存器RR
以上就是关于程序设计题,编写微机汇编程序段实现下列题目要求功能,要求有必要的注 释全部的内容,包括:程序设计题,编写微机汇编程序段实现下列题目要求功能,要求有必要的注 释、微机原理实验箱的电子琴设计,利用8254,8255、求助 微机原理课程设计 程序解释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)