第3ç« ARMæŒ‡ä»¤é›†å¯»å€æ–¹å¼ ARMæŒ‡ä»¤é›†å¯»å€æ–¹å¼å¯åˆ†ä¸º4大类: æ•°æ®å¤„ç†æŒ‡ä»¤å¯»å€ã€Load/Store指令的寻å€ã€æ‰¹é‡Load/Store指令的寻å€å’Œåå¤„ç†æŒ‡ä»¤å¯»å€ã€‚ 3.1ARMæŒ‡ä»¤çš„ç¼–ç æ ¼å¼ 1. ä¸€èˆ¬ç¼–ç æ ¼å¼ æ¯æ¡ARMæŒ‡ä»¤å æœ‰4å—节,其指令长度为32ä½ã€‚典型的ARMæŒ‡ä»¤ç¼–ç æ ¼å¼å¦‚下。 å…¶ä¸ï¼š cond(bitï¼»31:28]): 指令执行的æ¡ä»¶ç 。 type(bitï¼»27:26]): 指令类型ç ï¼Œæ ¹æ®å…¶ç¼–ç çš„ä¸åŒï¼Œæ‰€ä»£è¡¨å„类型如表31所示。 表31æŒ‡ä»¤ç±»åž‹ç æè¿° type(bitï¼»27:26])æè¿° 00æ•°æ®å¤„ç†æŒ‡ä»¤åŠæ‚ç±»Load/Store指令 01Load/Store指令 10批é‡Load/Store指令åŠåˆ†æ”¯æŒ‡ä»¤ 11åå¤„ç†æŒ‡ä»¤ä¸Žè½¯ä¸æ–指令 I(bitï¼»25]): 第二æ“ä½œæ•°ç±»åž‹æ ‡å¿—ç 。在数æ®å¤„ç†æŒ‡ä»¤é‡ŒI=1时表示第二æ“ä½œæ•°æ˜¯ç«‹å³æ•°ï¼ŒI=0时表示第二æ“作数是寄å˜å™¨æˆ–寄å˜å™¨ç§»ä½å½¢å¼ã€‚ opcode(bitï¼»24:21]): 指令æ“作ç 。 S(bitï¼»20]): 决定指令的æ“作结果是å¦å½±å“CPSR。 Rn(bitï¼»19:16]): 包å«ç¬¬ä¸€ä¸ªæ“作数的寄å˜å™¨ç¼–ç 。 Rd(bitï¼»15:12]): ç›®æ ‡å¯„å˜å™¨ç¼–ç 。 operand2(bitï¼»11:0]): 指令第二个æ“作数。 ARMæ±‡ç¼–æŒ‡ä»¤è¯æ³•æ ¼å¼ï¼š <opcode>{<cond>}{S}<Rd>,<Rn>,<operand2> 2. 指令æ¡ä»¶ç æ¡ä»¶ç cond(bitï¼»31:28])在指令ä¸å…±å 4ä½ï¼Œå…¶ç»„åˆå½¢å¼å…±æœ‰16ç§ï¼Œå¦‚表32所示。 表32æ¡ä»¶ç æ¡ä»¶ç æ¡ä»¶ç 助记符æè¿°PSRä¸çš„æ ‡å¿—ä½ 0000EQ相ç‰Z=1 0001NEä¸ç›¸ç‰Z=0 0010CS/HSæ— ç¬¦å·å¤§äºŽæˆ–ç‰äºŽC=1 0011CC/LOæ— ç¬¦å·å°äºŽC=0 0100MIè´Ÿæ•°N=1 0101PLéžè´Ÿæ•°N=0 0110VS上溢出V=1 0111VC没有上溢出V=0 1000HIæ— ç¬¦å·æ•°å¤§äºŽC=1且Z=0 1001LSæ— ç¬¦å·å°äºŽæˆ–ç‰äºŽC=0或Z=1 1010GEæœ‰ç¬¦å·æ•°å¤§äºŽæˆ–ç‰äºŽN=1且V=1或N=0且V=0 1011LTæœ‰ç¬¦å·æ•°å°äºŽN=1且V=0或N=0且V=1 1100GTæœ‰ç¬¦å·æ•°å¤§äºŽZ=0且N=V 1101LEæœ‰ç¬¦å·æ•°å°äºŽæˆ–ç‰äºŽZ=1或N!=V 1110ALæ— æ¡ä»¶æ‰§è¡Œ 3.2æ•°æ®å¤„ç†æŒ‡ä»¤å¯»å€æ–¹å¼ 1. æ•°æ®å¤„ç†æŒ‡ä»¤ç¬¬äºŒæ“ä½œæ•°çš„æž„æˆæ–¹å¼ æ•°æ®å¤„ç†æŒ‡ä»¤ç¬¬äºŒæ“作数operand2çš„æž„æˆæœ‰å¦‚下3ç§æ ¼å¼ã€‚ 1) ç«‹å³æ•°æ–¹å¼ æ¯ä¸ªç«‹å³æ•°ç”±ä¸€ä¸ª8ä½çš„常数进行32ä½å¾ªçޝå³ç§»å¶æ•°ä½å¾—到,其ä¸å¾ªçޝå³ç§»çš„使•°ç”±ä¸€ä¸ª4ä½äºŒè¿›åˆ¶çš„两å€è¡¨ç¤ºï¼Œå³ <immediate>=immed_8进行32ä½å¾ªçޝå³ç§»(2*rotate_4ï¼‰ä½ åˆæ³•çš„ç«‹å³æ•°ï¼Œä¾‹å¦‚: 0xff,0x104。ä¸åˆæ³•çš„ç«‹å³æ•°ï¼Œä¾‹å¦‚: 0x101,0x102。 规则: å½“ç«‹å³æ•°å€¼åœ¨0~0xff范围时,令immed_8=immediate,rotate_4=0ï¼› 在其他情况下,汇编编译器选择使rotate_4数值最å°çš„ç¼–ç æ–¹å¼ã€‚ 2) 寄å˜å™¨æ–¹å¼ æ“作数å³ä¸ºå¯„å˜å™¨çš„æ•°å€¼ï¼Œä¾‹å¦‚: MOV R3,R2 ADD R0,R1,R2 3) 寄å˜å™¨ç§»ä½æ–¹å¼ æ“作数为寄å˜å™¨çš„æ•°å€¼åšç›¸åº”的移ä½è€Œå¾—到。在ARM指令ä¸ç§»ä½æ“作包括逻辑左移ã€é€»è¾‘å³ç§»ã€ç®—术左移ã€ç®—术å³ç§»ã€å¾ªçޝå³ç§»å’Œå¸¦æ‰©å±•的循环å³ç§»ï¼Œè¿™äº›æ“作的功能如图31所示。 图31ç§»ä½æ“ä½œåŠŸèƒ½ç¤ºæ„ LSL逻辑左移: 空出的最低有效ä½ç”¨0å¡«å……ï¼› LSR逻辑å³ç§»ï¼š 空出的最高有效ä½ç”¨0å¡«å……ï¼› ASL算术左移: åŒLSLï¼› ASR算术å³ç§»ï¼š 空出的最高有效ä½ç”¨â€œç¬¦å·ä½â€å¡«å……ï¼› ROR循环å³ç§»ï¼š 移出的最低有效ä½ä¾æ¬¡å¡«å…¥ç©ºå‡ºçš„æœ€é«˜æœ‰æ•ˆä½ï¼› RRX带扩展的循环å³ç§»ï¼š 将寄å˜å™¨å†…容循环å³ç§»1ä½ï¼Œç©ºä½ç”¨åŽŸæ¥çš„Cæ ‡å¿—ä½å¡«å……,移出的最低有效ä½å¡«å…¥Cæ ‡å¿—ä½ã€‚ 2. 具体寻å€ç±»åž‹ æ•°æ®å¤„ç†æŒ‡ä»¤å¯»å€æ–¹å¼å…·ä½“å¯åˆ†ä¸º5ç§ç±»åž‹ï¼Œä¸‹é¢åˆ†åˆ«åР以介ç»ã€‚ 1) 第二æ“ä½œæ•°ä¸ºç«‹å³æ•° æ±‡ç¼–è¯æ³•æ ¼å¼ï¼š #<immediate> æŒ‡ä»¤ç¼–ç æ ¼å¼å¦‚下: å…¶ä¸ï¼Œç”±ä¸€ä¸ª8ä½çš„常数immed_8进行32ä½å¾ªçޝå³ç§»rotate_4çš„2å€ä½å¾—åˆ°çš„ç«‹å³æ•°immediate作为数æ®å¤„ç†æŒ‡ä»¤çš„第二æ“作数。例如: MOV R0,#0xFC0; R0<—0xFC0 2) 第二æ“作数为寄å˜å™¨ æ±‡ç¼–è¯æ³•æ ¼å¼ï¼š <Rm> æŒ‡ä»¤ç¼–ç æ ¼å¼å¦‚下: 例如: ADD R0,R1,R2; R0<—R1+R2 3) 第二æ“作数为寄å˜å™¨ç§»ä½æ–¹å¼ï¼Œä¸”ç§»ä½çš„使•°ä¸ºä¸€ä¸ª5ä½çš„ç«‹å³æ•° æ±‡ç¼–è¯æ³•æ ¼å¼ï¼š <Rm>,<shift> #<shift_imm> æŒ‡ä»¤ç¼–ç æ ¼å¼å¦‚下: å…¶ä¸ï¼š shift_amountè¡¨ç¤ºç§»ä½æ•°é‡ï¼› shift表示移ä½ç±»åž‹ç¼–ç ,bitï¼»5]用H表示,bitï¼»6]用S表示,其æè¿°å¦‚表33所示。 表33shiftç¼–ç æè¿° SHæè¿° 00逻辑左移LSL 01逻辑å³ç§»LSR 10算术å³ç§»ASR 11循环å³ç§»ROR 指令的æ“作数<operand2>为寄å˜å™¨Rm的数值按æŸç§ç§»ä½æ–¹å¼ç§»åЍshift_amountä½ï¼Œè¿™é‡Œshift_amount的范围是0~31,当shift_amount=0时,移ä½ä½æ•°ä¸º32ï¼Œåˆ™ç§»ä½æ•°èŒƒå›´ä¸º1~32。例如: MOV R0,R0,LSL #n ; R0<—R0 * (2n) (n= 0~31) 4) 第二æ“作数为寄å˜å™¨ç§»ä½æ–¹å¼ï¼Œä¸”ç§»ä½æ•°å€¼æ”¾åœ¨å¯„å˜å™¨ä¸ æ±‡ç¼–è¯æ³•æ ¼å¼ï¼š <Rm>,<shift> <Rs> æŒ‡ä»¤ç¼–ç æ ¼å¼å¦‚下: å…¶ä¸ï¼š 寄å˜å™¨Rsä¸å˜æ”¾ç€è¦ç§»ä½çš„æ•°é‡ï¼› shift表示移ä½ç±»åž‹ç¼–ç ,其æè¿°å¦‚表33所示。 指令的æ“作数<operand2>为寄å˜å™¨Rm的数值进行移ä½å¾—到。移ä½çš„æ•°ç”±Rs的低8ä½bitï¼»7:0]决定。 注æ„事项: 当R15用作Rnã€Rmã€Rdã€Rsä¸çš„任一个时,指令会产生ä¸å¯é¢„知的结果。 5) 第二æ“作数为寄å˜å™¨è¿›è¡ŒRRXç§»ä½å¾—到 æ±‡ç¼–è¯æ³•æ ¼å¼ï¼š <Rm>,RRX æŒ‡ä»¤ç¼–ç æ ¼å¼å¦‚下: 指令的æ“作数<operand2>为寄å˜å™¨Rmä¸çš„æ•°å€¼è¿›è¡Œå¸¦æ‰©å±•的循环å³ç§»ä¸€ä½ï¼Œå¹¶ç”¨CPSRä¸çš„Cæ¡ä»¶æ ‡å¿—ä½å¡«è¡¥ç©ºå‡ºçš„ä½ï¼ŒCPSRä¸çš„Cæ¡ä»¶æ ‡å¿—ä½åˆ™ç”¨ç§»å‡ºçš„ä½ä»£æ›¿ã€‚ 3.3Load/StoreæŒ‡ä»¤å¯»å€ Load/Store指令是对内å˜è¿›è¡Œå˜å‚¨/åŠ è½½æ•°æ®æ“ä½œçš„æŒ‡ä»¤ï¼Œæ ¹æ®è®¿é—®çš„æ•°æ®æ ¼å¼çš„ä¸åŒï¼Œå°†è¿™ç±»æŒ‡ä»¤çš„寻å€åˆ†ä¸ºå—ã€æ— 符å·å—节的Load/Store指令寻å€å’ŒåŠå—ã€æœ‰ç¬¦å·å—节的Load/Store指令寻å€ä¸¤å¤§ç±»ã€‚ 3.3.1地å€è®¡ç®—方法 1. 寄å˜å™¨é—´æŽ¥å¯»å€ 寄å˜å™¨é—´æŽ¥å¯»å€å°±æ˜¯ä»¥å¯„å˜å™¨ä¸çš„值作为æ“作数的地å€ï¼Œè€Œæ“ä½œæ•°æœ¬èº«å˜æ”¾åœ¨å˜å‚¨å™¨ä¸ã€‚例如以下指令: LDRR0,[R1]; R0 â†ï¼»R1ï¼½ STRR0,[R1]; ï¼»R1]↠R0 åœ¨ç¬¬ä¸€æ¡æŒ‡ä»¤ä¸ï¼Œä»¥å¯„å˜å™¨R1的值作为æ“作数的地å€ï¼Œåœ¨å˜å‚¨å™¨ä¸å–得一个æ“作数åŽå°†å…¶é€å…¥R0ä¸ã€‚ ç¬¬äºŒæ¡æŒ‡ä»¤å°†R0çš„å€¼ä¼ é€åˆ°ä»¥R1的值为地å€çš„å˜å‚¨å™¨ä¸ã€‚ 2. 基å€åŠ å˜å€å¯»å€ 基å€åŠ å˜å€å¯»å€å°±æ˜¯å°†å¯„å˜å™¨(该寄å˜å™¨ä¸€èˆ¬ç§°ä½œåŸºå€å¯„å˜å™¨ï¼‰çš„内容与指令ä¸ç»™å‡ºçš„地å€åç§»é‡ç›¸åŠ ï¼Œä»Žè€Œå¾—åˆ°ä¸€ä¸ªæ“作数的有效地å€ã€‚å˜å€å¯»å€æ–¹å¼å¸¸ç”¨äºŽè®¿é—®æŸåŸºåœ°å€é™„近的地å€å•元。 æ ¹æ®è®¿é—®å˜å‚¨å•元和基å€å¯„å˜å™¨æ›´æ–°çš„å…ˆåŽé¡ºåºå¯ä»¥å°†åŸºå€åŠ å˜å€å¯»å€åˆ†ä¸ºä»¥ä¸‹ä¸¤ç§ã€‚ (1) å‰å˜å€æ³•: 基å€å¯„å˜å™¨ä¸çš„值和地å€åç§»é‡å…ˆåšåŠ å‡è¿ç®—,生æˆçš„æ“ä½œæ•°ä½œä¸ºå†…å˜è®¿é—®çš„地å€ã€‚ (2) åŽå˜å€æ³•: 将基å€å¯„å˜å™¨ä¸çš„值直接作为内å˜è®¿é—®çš„地å€è¿›è¡Œæ“作,内å˜è®¿é—®å®Œæ¯•åŽåŸºå€å¯„å˜å™¨ä¸çš„值和地å€åç§»é‡åšåŠ å‡è¿ç®—,并更新基å€å¯„å˜å™¨ã€‚ 采用å˜å€å¯»å€æ–¹å¼çš„æŒ‡ä»¤å¸¸è§æœ‰ä»¥ä¸‹å‡ ç§å½¢å¼ï¼š LDR R0, ï¼»R1 ,# 4ï¼½ ï¼› R0 â†ï¼»R1+4ï¼½ LDR R0, ï¼»R1 ,# 4ï¼½ ï¼ï¼› R0 â†ï¼»R1+4]且R1â†R1+4 LDR R0, ï¼»R1ï¼½ ,# 4 ï¼› R0 â†ï¼»R1]且R1â†R1+4 LDR R0, ï¼»R1 , R2ï¼½ ï¼› R0 â†ï¼»R1+R2ï¼½ åœ¨ç¬¬ä¸€æ¡æŒ‡ä»¤ä¸ï¼Œå°†å¯„å˜å™¨R1çš„å†…å®¹åŠ ä¸Š4å½¢æˆæ“作数的有效地å€ï¼Œä»Žè€Œå–å¾—æ“作数å˜å…¥å¯„å˜å™¨R0ä¸ã€‚ åœ¨ç¬¬äºŒæ¡æŒ‡ä»¤ä¸ï¼Œå°†å¯„å˜å™¨R1çš„å†…å®¹åŠ ä¸Š4å½¢æˆæ“作数的有效地å€ï¼Œä»Žè€Œå–å¾—æ“作数å˜å…¥å¯„å˜å™¨R0ä¸ï¼› ç„¶åŽï¼ŒR1的内容自增4(也就是R1çš„å†…å®¹åŠ 4åŽå†™å›žåˆ°R1ä¸ï¼‰ã€‚ åœ¨ç¬¬ä¸‰æ¡æŒ‡ä»¤ä¸ï¼Œä»¥å¯„å˜å™¨R1的内容作为æ“作数的有效地å€ï¼Œä»Žè€Œå–å¾—æ“作数å˜å…¥å¯„å˜å™¨R0ä¸ï¼› ç„¶åŽï¼ŒR1的内容自增4。 åœ¨ç¬¬å››æ¡æŒ‡ä»¤ä¸ï¼Œå°†å¯„å˜å™¨R1çš„å†…å®¹åŠ ä¸Šå¯„å˜å™¨R2çš„å†…å®¹å½¢æˆæ“作数的有效地å€ï¼Œä»Žè€Œå–å¾—æ“作数å˜å…¥å¯„å˜å™¨R0ä¸ã€‚ 3.3.2å—ã€æ— 符å·å—èŠ‚å¯»å€ åœ¨Load/Store指令ä¸ï¼Œå—ä¸Žæ— ç¬¦å·å—节æ“ä½œæŒ‡ä»¤ç¼–ç æ ¼å¼å¦‚下: æ±‡ç¼–æŒ‡ä»¤è¯æ³•æ ¼å¼å¦‚下。 åŠ è½½æŒ‡ä»¤ï¼š LDR {<cond>}{B}{T}<Rd>,<addressing_mode> å˜å‚¨æŒ‡ä»¤ï¼š STR {<cond>}{B}{T}<Rd>,<addressing_mode> å…¶ä¸ï¼š cond为指令执行的æ¡ä»¶ï¼ŒRn为基å€å¯„å˜å™¨ï¼ŒRd为æº/ç›®æ ‡å¯„å˜å™¨ï¼Œaddressing_mode为内å˜åœ°å€æž„æˆæ ¼å¼ã€‚ I=1: åç§»é‡ä¸ºå¯„å˜å™¨æˆ–寄å˜å™¨ç§»ä½å½¢å¼ 0: åç§»é‡ä¸º12ä½ç«‹å³æ•° P=1: å‰å˜å€æ“作 0: åŽå˜å€æ“作 U=1: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rnå€¼åŠ ä¸Šåœ°å€åç§»é‡ 0: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rn值å‡åŽ»åœ°å€åç§»é‡ B=1: æŒ‡ä»¤è®¿é—®çš„æ˜¯æ— ç¬¦å·çš„å—èŠ‚æ•°æ® 0: æŒ‡ä»¤è®¿é—®çš„æ˜¯å—æ•°æ® W=1: 执行基å€å¯„å˜å™¨å›žå†™æ“作 0: 䏿‰§è¡ŒåŸºå€å¯„å˜å™¨å›žå†™æ“作 L=1: 执行Loadæ“作 0: 执行Storeæ“作 䏋颿ˆ‘们将é‡ç‚¹è®¨è®ºå†…å˜åœ°å€æž„æˆæ ¼å¼addressing_mode。 æ ¹æ®æŒ‡ä»¤ç¼–ç å’Œæ±‡ç¼–è¯æ³•æ ¼å¼çš„ä¸åŒï¼Œå½’纳起æ¥å…±æœ‰ä»¥ä¸‹3ç§å†…å˜åœ°å€æž„æˆæ ¼å¼ã€‚ 1. addressing_modeä¸çš„åç§»é‡ä¸ºç«‹å³æ•° addressing_modeä¸çš„åç§»é‡ä¸ºç«‹å³æ•°çš„æ±‡ç¼–æŒ‡ä»¤å¯»å€æŒ‰ç¼–ç æ ¼å¼å¯åˆ†ä¸ºä»¥ä¸‹3ç§å½¢å¼ã€‚ å‰å˜å€ä¸å›žå†™å½¢å¼ï¼š ï¼»<Rn>,#+/-<immed_offset>ï¼½ å‰å˜å€å›žå†™å½¢å¼ï¼š ï¼»<Rn>,#+/-<immed_offset>ï¼½ï¼ åŽå˜å€å›žå†™å½¢å¼ï¼š ï¼»<Rn>],#+/-<immed_offset> 其指令编ç 如下: P=1: å‰å˜å€æ“作 0: åŽå˜å€æ“作 U=1: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rnå€¼åŠ ä¸Šåœ°å€åç§»é‡ 0: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rn值å‡åŽ»åœ°å€åç§»é‡ B=1: æŒ‡ä»¤è®¿é—®çš„æ˜¯æ— ç¬¦å·çš„å—èŠ‚æ•°æ® 0: æŒ‡ä»¤è®¿é—®çš„æ˜¯å—æ•°æ® W=1: 执行基å€å¯„å˜å™¨å›žå†™æ“作 0: 䏿‰§è¡ŒåŸºå€å¯„å˜å™¨å›žå†™æ“作 L=1: 执行Loadæ“作 0: 执行Storeæ“作 addressing_modeä¸çš„åç§»é‡ä¸ºç«‹å³æ•°çš„æ±‡ç¼–指令寻å€ç¼–ç å¯¹åº”çš„æ±‡ç¼–è¯æ³•æ ¼å¼ç±»åž‹å¦‚表34所示。下é¢ä»‹ç»å„æ±‡ç¼–è¯æ³•æ ¼å¼ä¸‹çš„地å€è®¡ç®—方法。 1) ï¼»<Rn>,#+/-<immed_offset>ï¼½ 内å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼åŠ ä¸Š/å‡åŽ»immed_offsetï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚ 表34åç§»é‡ä¸ºç«‹å³æ•°çš„æŒ‡ä»¤ç¼–ç 类型 WPæ±‡ç¼–è¯æ³•æ ¼å¼ 01ï¼»<Rn>,#+/-<immed_offset>ï¼½ 10ï¼»<Rn>],#+/-<immed_offset> 11ï¼»<Rn>,#+/-<immed_offset>ï¼½ï¼ 2) ï¼»<Rn>,#+/-<immed_offset>ï¼½ï¼ å†…å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼åŠ ä¸Š/å‡åŽ»immed_offsetï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚当指令执行时,生æˆçš„地å€å€¼å°†å†™å…¥åŸºå€å¯„å˜å™¨ã€‚ 3) ï¼»<Rn>],#+/-<immed_offset> 内å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼ï¼Œå½“å˜å‚¨å™¨æ“作完毕åŽï¼Œå°†åŸºå€å¯„å˜å™¨Rnå€¼åŠ ä¸Š/å‡åŽ»immed_offset,将所得到的值写回到基å€å¯„å˜å™¨Rn(更新基å€å¯„å˜å™¨ï¼‰ï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚ ã€ä¾‹31】指令功能解æžã€‚ LDR R0,[R1,#4ï¼½; R0<—[R1+4ï¼½ LDR R0,[R1,#-4ï¼½; R0<—[R1-4ï¼½ LDR R0,[R1,#4ï¼½ï¼; R0<—[R1+4ï¼½ï¼ŒåŒæ—¶R1=R1+4 LDR R0,[R1],#4; R0<—[R1],R1=R1+4 2. addressing_modeä¸çš„åç§»é‡ä¸ºå¯„å˜å™¨çš„值 addressing_modeä¸çš„åç§»é‡ä¸ºå¯„å˜å™¨çš„æ±‡ç¼–æŒ‡ä»¤å¯»å€æŒ‰ç¼–ç æ ¼å¼å¯åˆ†ä¸ºä»¥ä¸‹3ç§å½¢å¼ã€‚ å‰å˜å€ä¸å›žå†™å½¢å¼ï¼š ï¼»<Rn>,+/-<Rm>ï¼½ å‰å˜å€å›žå†™å½¢å¼ï¼š ï¼»<Rn>,+/-<Rm>ï¼½ï¼ åŽå˜å€å›žå†™å½¢å¼ï¼š ï¼»<Rn>],+/-<Rm> 其指令编ç 如下: P=1: å‰å˜å€æ“作 0: åŽå˜å€æ“作 U=1: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rnå€¼åŠ ä¸Šåœ°å€åç§»é‡ 0: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rn值å‡åŽ»åœ°å€åç§»é‡ B=1: æŒ‡ä»¤è®¿é—®çš„æ˜¯æ— ç¬¦å·çš„å—èŠ‚æ•°æ® 0: æŒ‡ä»¤è®¿é—®çš„æ˜¯å—æ•°æ® W=1: 执行基å€å¯„å˜å™¨å›žå†™æ“作 0: 䏿‰§è¡ŒåŸºå€å¯„å˜å™¨å›žå†™æ“作 L=1: 执行Loadæ“作 0: 执行Storeæ“作 addressing_modeä¸çš„åç§»é‡ä¸ºå¯„å˜å™¨çš„æ±‡ç¼–指令寻å€ç¼–ç å¯¹åº”çš„æ±‡ç¼–è¯æ³•æ ¼å¼ç±»åž‹å¦‚表35所示。下é¢ä»‹ç»å„æ±‡ç¼–è¯æ³•æ ¼å¼ä¸‹çš„地å€è®¡ç®—方法。 表35åç§»é‡ä¸ºå¯„å˜å™¨çš„æŒ‡ä»¤ç¼–ç 类型对应关系 WPæ±‡ç¼–è¯æ³•æ ¼å¼ 01ï¼»<Rn>,+/-<Rm>ï¼½ 10ï¼»<Rn>],+/-<Rm> 11ï¼»<Rn>,+/-<Rm>ï¼½ï¼ 1) ï¼»<Rn>,+/-<Rm>ï¼½ 内å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼åŠ ä¸Š/å‡åŽ»Rmï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚ 2) ï¼»<Rn>,+/-<Rm>ï¼½ï¼ å†…å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼åŠ ä¸Š/å‡åŽ»Rmï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚当指令执行时,生æˆçš„地å€å€¼å°†å†™å…¥åŸºå€å¯„å˜å™¨ã€‚ 3) ï¼»<Rn>],+/-<Rm> 内å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼ï¼Œå½“å˜å‚¨å™¨æ“作完毕åŽï¼Œå°†åŸºå€å¯„å˜å™¨Rnå€¼åŠ ä¸Š/å‡åŽ»Rm,将所得到的值写回到基å€å¯„å˜å™¨Rn(更新基å€å¯„å˜å™¨ï¼‰ï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚ 注æ„事项:  程åºè®¡æ•°å™¨PC(R15)用作索引寄å˜å™¨Rm时,会产生ä¸å¯é¢„知的结果。  当Rn å’Œ Rm为åŒä¸€ä¸ªå¯„å˜å™¨æ—¶ï¼Œä¼šäº§ç”Ÿä¸å¯é¢„知的结果。 ã€ä¾‹32】指令功能解æžã€‚ LDR R0,[R1,R2ï¼½; R0<—[R1+R2ï¼½ LDR R0,[R1,-R2ï¼½; R0<—[R1-R2ï¼½ LDR R0,[R1,R2ï¼½!; R0<—[R1+R2],且 R1=R1+R2 LDR R0,[R1],R2; R0<—[R1], R1=R1+R2 3. addressing_modeä¸çš„åç§»é‡é€šè¿‡å¯„å˜å™¨ç§»ä½å¾—到 addressing_modeä¸çš„åç§»é‡æ˜¯é€šè¿‡å¯„å˜å™¨ç§»ä½æ‰€å¾—åˆ°çš„ï¼Œè¿™ç±»æ±‡ç¼–æŒ‡ä»¤å¯»å€æŒ‰ç¼–ç æ ¼å¼å¯åˆ†ä¸ºä»¥ä¸‹3ç§å½¢å¼ã€‚ å‰å˜å€ä¸å›žå†™å½¢å¼ï¼š ï¼»<Rn>,+/-<Rm>,<shift>#shift_amountï¼½ å‰å˜å€å›žå†™å½¢å¼ï¼š ï¼»<Rn>,+/-<Rm>,<shift>#shift_amountï¼½ï¼ åŽå˜å€å›žå†™å½¢å¼ï¼š ï¼»<Rn>],+/-<Rm>,<shift>#shift_amount å…¶æŒ‡ä»¤ç¼–ç æ ¼å¼å¦‚下: P=1: å‰å˜å€æ“作 0: åŽå˜å€æ“作 U=1: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rnå€¼åŠ ä¸Šåœ°å€åç§»é‡ 0: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rn值å‡åŽ»åœ°å€åç§»é‡ B=1: æŒ‡ä»¤è®¿é—®çš„æ˜¯æ— ç¬¦å·çš„å—èŠ‚æ•°æ® 0: æŒ‡ä»¤è®¿é—®çš„æ˜¯å—æ•°æ® W=1: 执行基å€å¯„å˜å™¨å›žå†™æ“作 0: 䏿‰§è¡ŒåŸºå€å¯„å˜å™¨å›žå†™æ“作 L=1: 执行Loadæ“作 0: 执行Storeæ“作 通过寄å˜å™¨ç§»ä½å¾—到地å€åç§»é‡æŒ‡ä»¤ç¼–ç å¯¹åº”çš„æ±‡ç¼–è¯æ³•æ ¼å¼ç±»åž‹å¦‚表36所示。下é¢ä»‹ç»å„æ±‡ç¼–è¯æ³•æ ¼å¼ä¸‹çš„地å€è®¡ç®—方法。 表36åç§»é‡ä¸ºç§»ä½å¯„å˜å™¨çš„æŒ‡ä»¤ç¼–ç 类型对应关系 WPæ±‡ç¼–è¯æ³•æ ¼å¼ 01ï¼»<Rn>,+/-<Rm>,<shift>#shift_amountï¼½ 10ï¼»<Rn>],+/-<Rm>,<shift>#shift_amount 11ï¼»<Rn>,+/-<Rm>,<shift>#shift_amountï¼½ï¼ 1) ï¼»<Rn>,+/-<Rm>,<shift>#shift_amountï¼½ 内å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼åŠ ä¸Š/å‡åŽ»Rm通过移ä½shift_amountåŽæ‰€å¾—åˆ°çš„æ•°å€¼ï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚ 2) ï¼»<Rn>,+/-<Rm>,<shift>#shift_amountï¼½ï¼ å†…å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼åŠ ä¸Š/å‡åŽ»Rm通过移ä½shift_amountåŽæ‰€å¾—åˆ°çš„æ•°å€¼ï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚当指令执行时,生æˆçš„地å€å€¼å°†å†™å…¥åŸºå€å¯„å˜å™¨ã€‚ 3) ï¼»<Rn>],+/-<Rm>,<shift>#shift_amount 内å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼ï¼Œå½“å˜å‚¨å™¨æ“作完毕åŽï¼Œå°†åŸºå€å¯„å˜å™¨Rnå€¼åŠ ä¸Š/å‡åŽ»Rm通过移ä½shift_amountåŽæ‰€å¾—到的数值,将所得到的值写回到基å€å¯„å˜å™¨Rn(更新基å€å¯„å˜å™¨ï¼‰ï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚ 注æ„事项:  程åºè®¡æ•°å™¨PC(R15)用作索引寄å˜å™¨Rm时,会产生ä¸å¯é¢„知的结果。  当Rn å’Œ Rm为åŒä¸€ä¸ªå¯„å˜å™¨æ—¶ï¼Œä¼šäº§ç”Ÿä¸å¯é¢„知的结果。 ã€ä¾‹33】指令功能解æžã€‚ LDRR0,[R1,R2,LSL #2]; R0<—[R1+R2*4ï¼½ LDRR0,[R1,R2,LSL #2ï¼½ï¼ï¼› R0<—[R1+R2*4]且 R1=R1+R2*4 LDRR0,[R1],R2,LSL #2ï¼› R0<—[R1],R1=R1+R2*4 3.3.3åŠå—ã€æœ‰ç¬¦å·å—èŠ‚å¯»å€ è¿™ç±»æŒ‡ä»¤å¯ç”¨æ¥åŠ è½½æœ‰ç¬¦å·å—节ã€åŠ è½½æœ‰ç¬¦å·åŠå—ã€åŠ è½½/å˜å‚¨æ— 符å·åŠå—。一般称这类指令为“æ‚类的Load/Store指令â€ã€‚ Load/Store指令对åŠå—ã€æœ‰ç¬¦å·å—节æ“ä½œæŒ‡ä»¤ç¼–ç æ ¼å¼å¦‚下。 æ±‡ç¼–æŒ‡ä»¤æ±‡ç¼–è¯æ³•æ ¼å¼å¦‚下。 åŠ è½½æœ‰ç¬¦å·å—节到寄å˜å™¨ï¼š LDR {<cond>}SB <Rd>,<addressing_mode> åŠ è½½æœ‰ç¬¦å·åŠå—到寄å˜å™¨ï¼š LDR {<cond>}SH <Rd>,<addressing_mode> åŠ è½½æ— ç¬¦å·åŠå—到寄å˜å™¨ï¼š LDR {<cond>}H <Rd>,<addressing_mode> å˜å‚¨æ— 符å·åŠå—到内å˜ï¼š STR {<cond>}H <Rd>,<addressing_mode> cond为指令执行的æ¡ä»¶ã€‚ P=1: å‰å˜å€æ“作 0: åŽå˜å€æ“作 U=1: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rnå€¼åŠ ä¸Šåœ°å€åç§»é‡ 0: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rn值å‡åŽ»åœ°å€åç§»é‡ I=1: åç§»é‡ä¸º8ä½ç«‹å³æ•° 0: åç§»é‡ä¸ºå¯„å˜å™¨ W=1: 执行基å€å¯„å˜å™¨å›žå†™æ“作 0: 䏿‰§è¡ŒåŸºå€å¯„å˜å™¨å›žå†™æ“作 L=1: 执行Loadæ“作 0: 执行Storeæ“作 Rn为基å€å¯„å˜å™¨ï¼ŒRd为æº/ç›®æ ‡å¯„å˜å™¨ï¼Œaddressing_mode为内å˜åœ°å€æž„æˆæ ¼å¼ï¼Œå¯¹åº”指令编ç ä¸çš„Sã€Hä½ç¼–ç 将在4.3.2节详细介ç»ã€‚ 䏋颿ˆ‘们将é‡ç‚¹è®¨è®ºå†…å˜åœ°å€æž„æˆæ ¼å¼addressing_modeã€‚æ ¹æ®æŒ‡ä»¤ç¼–ç å’Œæ±‡ç¼–è¯æ³•æ ¼å¼çš„ä¸åŒï¼Œå½’纳起æ¥å…±æœ‰ä»¥ä¸‹ä¸¤ç§å†…å˜åœ°å€æž„æˆæ ¼å¼ã€‚ 1. addressing_modeä¸çš„åç§»é‡ä¸ºç«‹å³æ•° addressing_modeä¸çš„åç§»é‡ä¸ºç«‹å³æ•°çš„æ±‡ç¼–è¯æ³•æ ¼å¼æœ‰ä»¥ä¸‹3ç§ã€‚ å‰å˜å€ä¸å›žå†™å½¢å¼ï¼š ï¼»<Rn>,#+/-<immed_offset8>ï¼½ å‰å˜å€å›žå†™å½¢å¼ï¼š ï¼»<Rn>,#+/-<immed_offset8>ï¼½ï¼ åŽå˜å€å›žå†™å½¢å¼ï¼š ï¼»<Rn>],#+/-<immed_offset8> 其指令编ç 如下: P=1: å‰å˜å€æ“作 0: åŽå˜å€æ“作 U=1: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rnå€¼åŠ ä¸Šåœ°å€åç§»é‡ 0: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rn值å‡åŽ»åœ°å€åç§»é‡ W=1: 执行基å€å¯„å˜å™¨å›žå†™æ“作 0: 䏿‰§è¡ŒåŸºå€å¯„å˜å™¨å›žå†™æ“作 L=1: 执行Loadæ“作 0: 执行Storeæ“作 从指令编ç ä¸å¯ä»¥çœ‹å‡ºï¼Œimmed_offset8是一个8ä½çš„åç§»é‡ï¼Œè¿™ä¸ª8ä½çš„åç§»é‡æ˜¯ç”±ä¸¤ä¸ª4ä½çš„åç§»é‡(offset_Hã€offset_L)构æˆï¼Œå…¶ä¸offset_H为8ä½åç§»é‡çš„bitï¼»7:4ï¼½ä½ï¼Œoffset_L为8ä½åç§»é‡çš„bitï¼»3:0ï¼½ä½ã€‚ åç§»é‡ä¸ºç«‹å³æ•°çš„æŒ‡ä»¤ç¼–ç å¯¹åº”çš„æ±‡ç¼–è¯æ³•æ ¼å¼ç±»åž‹å¦‚表37所示。下é¢ä»‹ç»å„æ±‡ç¼–è¯æ³•æ ¼å¼ä¸‹çš„地å€è®¡ç®—方法。 表37åç§»é‡ä¸ºç«‹å³æ•°çš„æŒ‡ä»¤ç¼–ç 类型 WPæ±‡ç¼–è¯æ³•æ ¼å¼ 01ï¼»<Rn>,#+/-<immed_offset8>ï¼½ 10ï¼»<Rn>],#+/-<immed_offset8> 11ï¼»<Rn>,#+/-<immed_offset8>ï¼½ï¼ 1) ï¼»<Rn>,#+/-<immed_offset8>ï¼½ 内å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼åŠ ä¸Š/å‡åŽ»immed_offset8ï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚ 2) ï¼»<Rn>,#+/-<immed_offset8>ï¼½ï¼ å†…å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼åŠ ä¸Š/å‡åŽ»immed_offset8ï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚当指令执行时,生æˆçš„地å€å€¼å°†å†™å…¥åŸºå€å¯„å˜å™¨ã€‚ 3) ï¼»<Rn>],#+/-<immed_offset8> 内å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼ï¼Œå½“å˜å‚¨å™¨æ“作完毕åŽï¼Œå°†åŸºå€å¯„å˜å™¨Rnå€¼åŠ ä¸Š/å‡åŽ»immed_offset8,将所得到的值写回到基å€å¯„å˜å™¨Rn(更新基å€å¯„å˜å™¨ï¼‰ï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚ 注æ„事项:  程åºè®¡æ•°å™¨PC(R15)用作基å€å¯„å˜å™¨Rn时,会产生ä¸å¯é¢„知的结果。  当S=1且L=0æ—¶ï¼Œè¡¨ç¤ºå¸¦ç¬¦å·æ•°çš„å˜å‚¨æŒ‡ä»¤ï¼Œç›®å‰è¿˜æ²¡æœ‰å®žçްæ¤åŠŸèƒ½çš„ARM指令。 ã€ä¾‹34】指令功能解æžã€‚ LDRSB R0,[R1,#4]; R0<—[R1+4ï¼½å—节å•元,R0æœ‰ç¬¦å·æ‰©å±•为32ä½ LDRH R2,[R1,#-4]; R2<—[R1-4ï¼½åŠå—å•元,R2的高16使¸…é›¶ STRH R0,[R1,#4ï¼½ï¼ï¼› R0低16ä½â€”>ï¼»R1+4ï¼½ï¼ŒåŒæ—¶R1=R1+4 LDRSH R0,[R1],#4ï¼› R0<—[R1ï¼½åŠå—å•元且R0æœ‰ç¬¦å·æ‰©å±•为32ä½ï¼ŒR1=R1+4 2. addressing_modeä¸çš„åç§»é‡ä¸ºå¯„å˜å™¨çš„值 addressing_modeä¸çš„åç§»é‡ä¸ºå¯„å˜å™¨å€¼çš„æ±‡ç¼–è¯æ³•æ ¼å¼æœ‰ä»¥ä¸‹3ç§ã€‚ å‰å˜å€ä¸å›žå†™å½¢å¼ï¼š ï¼»<Rn>,+/-<Rm>ï¼½ å‰å˜å€å›žå†™å½¢å¼ï¼š ï¼»<Rn>,+/-< Rm >ï¼½ï¼ åŽå˜å€å›žå†™å½¢å¼ï¼š ï¼»<Rn>],+/-< Rm > 其指令编ç 如下: P=1: å‰å˜å€æ“作 0: åŽå˜å€æ“作 U=1: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rnå€¼åŠ ä¸Šåœ°å€åç§»é‡ 0: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rn值å‡åŽ»åœ°å€åç§»é‡ W=1: 执行基å€å¯„å˜å™¨å›žå†™æ“作 0: 䏿‰§è¡ŒåŸºå€å¯„å˜å™¨å›žå†™æ“作 L=1: 执行Loadæ“作 0: 执行Storeæ“作 åç§»é‡ä¸ºå¯„å˜å™¨å€¼çš„æŒ‡ä»¤ç¼–ç å¯¹åº”çš„æ±‡ç¼–è¯æ³•æ ¼å¼ç±»åž‹å¦‚表38所示。下é¢ä»‹ç»å„æ±‡ç¼–è¯æ³•æ ¼å¼ä¸‹çš„地å€è®¡ç®—方法。 表38åç§»é‡ä¸ºå¯„å˜å™¨å€¼çš„æŒ‡ä»¤ç¼–ç 类型对应关系 WPæ±‡ç¼–è¯æ³•æ ¼å¼ 01ï¼»<Rn>,+/-< Rm >ï¼½ 10ï¼»<Rn>],+/-< Rm > 11ï¼»<Rn>,+/-< Rm >ï¼½ï¼ 1) ï¼»<Rn>,+/-< Rm >ï¼½ 内å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼åŠ ä¸Š/å‡åŽ»Rmï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚ 2) ï¼»<Rn>,+/-< Rm >ï¼½ï¼ å†…å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼åŠ ä¸Š/å‡åŽ»Rmï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚当指令执行时,生æˆçš„地å€å€¼å°†å†™å…¥åŸºå€å¯„å˜å™¨ã€‚ 3) ï¼»<Rn>],+/-< Rm > 内å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨å€¼ï¼Œå½“å˜å‚¨å™¨æ“作完毕åŽï¼Œå°†åŸºå€å¯„å˜å™¨Rnå€¼åŠ ä¸Š/å‡åŽ»Rm,将所得到的值写回到基å€å¯„å˜å™¨Rn(更新基å€å¯„å˜å™¨ï¼‰ï¼Œå…¶åŠ å‡ç”±U的值æ¥ç¡®å®šã€‚ 注æ„事项:  程åºè®¡æ•°å™¨PC(R15)用作基å€å¯„å˜å™¨Rn或索引寄å˜å™¨Rm时,会产生ä¸å¯é¢„知的结果。  基å€å¯„å˜å™¨Rn和索引寄å˜å™¨Rm为åŒä¸€ä¸ªå¯„å˜å™¨æ—¶ï¼Œä¼šäº§ç”Ÿä¸å¯é¢„知的结果。 ã€ä¾‹35】指令功能解æžã€‚ LDRSB R0,[R1,R5]; R0<—[R1+R5ï¼½å—节å•元,R0æœ‰ç¬¦å·æ‰©å±•为32ä½ LDRH R2,[R1,-R5]; R2<—[R1-R5ï¼½åŠå—å•元,R2的高16使¸…é›¶ STRH R0,[R1,R5ï¼½ï¼ï¼› R0低16ä½â€”>ï¼»R1+R5ï¼½ï¼ŒåŒæ—¶R1=R1+R5 LDRSH R0,[R1],R5ï¼› R0<—[R1ï¼½åŠå—å•元且R0æœ‰ç¬¦å·æ‰©å±•为32ä½ï¼ŒR1=R1+R5 3.4批é‡Load/StoreæŒ‡ä»¤å¯»å€æ–¹å¼ ARM指令系统æä¾›äº†æ‰¹é‡Load/StoreæŒ‡ä»¤å¯»å€æ–¹å¼ï¼Œå³é€šå¸¸æ‰€è¯´çš„多寄å˜å™¨å¯»å€ï¼Œä¹Ÿå°±æ˜¯ä¸€æ¬¡å¯ä»¥ä¼ é€å‡ 个寄å˜å™¨çš„值,å…è®¸ä¸€æ¡æŒ‡ä»¤æœ€å¤šä¼ é€16个寄å˜å™¨ã€‚ 1. ç¼–ç æ ¼å¼ 批é‡Load/StoreæŒ‡ä»¤æ±‡ç¼–è¯æ³•æ ¼å¼å¦‚下。 批é‡åŠ è½½ï¼š LDM {<cond>}<addressing_mode> <Rn> {!},<register>{^^} 批é‡å˜å‚¨ï¼š STM {<cond>}<addressing_mode> <Rn> {!},<register>{^^} 批é‡Load/StoreæŒ‡ä»¤ç¼–ç æ ¼å¼å¦‚下: cond为指令执行的æ¡ä»¶ã€‚ P=1: å‰å˜å€æ“作 0: åŽå˜å€æ“作 U表示地å€å˜åŒ–的方å‘。 U=1: 地å€å‘上å˜åŒ–(Upwards) 0: 地å€å‘下å˜åŒ–(Downwards) W=1: 执行基å€å¯„å˜å™¨å›žå†™æ“作 0: 䏿‰§è¡ŒåŸºå€å¯„å˜å™¨å›žå†™æ“作 L=1: 执行Loadæ“作 0: 执行Storeæ“作 Rn为基å€å¯„å˜å™¨ï¼Œä¹Ÿå°±æ˜¯å†…å˜åœ°å€å—的最低地å€å€¼ã€‚ register_list表示è¦åŠ è½½æˆ–å˜å‚¨çš„寄å˜å™¨åˆ—表,bitï¼»15:0ï¼½å¯ä»¥è¡¨ç¤º16个寄å˜å™¨ï¼Œå¦‚æžœæŸä½ä¸º1,则该ä½çš„ä½ç½®ä½œä¸ºå¯„å˜å™¨çš„ç¼–å·ï¼Œæ¤å¯„å˜å™¨å‚ä¸ŽåŠ è½½æˆ–å˜å‚¨ã€‚例如,bitï¼»8]为1,则代表R8å‚ä¸ŽåŠ è½½æˆ–å˜å‚¨ã€‚ S用于æ¢å¤CPSR和强制用户ä½ã€‚当程åºè®¡æ•°å™¨PC包å«åœ¨LDM指令的register_listä¸ï¼Œä¸”S为1æ—¶ï¼Œåˆ™å½“å‰æ¨¡å¼çš„SPSR被å¤åˆ¶åˆ°CPSRä¸ï¼Œä½¿å¤„ç†å™¨çš„程åºè¿”回和状æ€çš„æ¢å¤æˆä¸ºä¸€ä¸ªåŽŸåæ“ä½œã€‚å¦‚æžœregister_listä¸ä¸åŒ…å«ç¨‹åºè®¡æ•°å™¨PC,S为1åˆ™åŠ è½½æˆ–å˜å‚¨çš„æ˜¯ç”¨æˆ·æ¨¡å¼ä¸‹çš„寄å˜å™¨ç»„。 addressing_mode表示地å€çš„å˜åŒ–æ–¹å¼ã€‚ 注æ„事项: 指令ä¸å¯„å˜å™¨å’Œè¿žç»å†…å˜åœ°å€å•元的对应关系: ç¼–å·ä½Žçš„寄å˜å™¨å¯¹åº”内å˜ä½Žåœ°å€å•元,编å·é«˜çš„寄å˜å™¨å¯¹åº”内å˜é«˜åœ°å€å•元。 2. å†…å˜æ“作 批é‡Load/Store指令在实现寄å˜å™¨ç»„和连ç»çš„内å˜å•å…ƒä¸æ•°æ®ä¼ 递时,地å€çš„å˜åŒ–æ–¹å¼(addressing_mode)有以下4ç§ç±»åž‹ã€‚  åŽå¢žIA(Increment After): æ¯æ¬¡æ•°æ®ä¼ é€åŽåœ°å€åŠ 4。  先增IB(Increment Before): æ¯æ¬¡æ•°æ®ä¼ é€å‰åœ°å€åŠ 4。  åŽå‡DA(Decrement After): æ¯æ¬¡æ•°æ®ä¼ é€åŽåœ°å€å‡4。  å…ˆå‡DB(Decrement Before): æ¯æ¬¡æ•°æ®ä¼ é€å‰åœ°å€å‡4。 它们与指令编ç ä¸Pã€U的对应关系如表39所示。 表39地å€å˜åŒ–æ–¹å¼ä¸ŽæŒ‡ä»¤ç¼–ç ä¸Pã€U的对应关系 addressing_modePU DA00 IA01 DB10 IB11 3. å †æ ˆæ“作 å †æ ˆæ˜¯ä¸€ç§æ•°æ®ç»“构,按先进åŽå‡º(First In Last Out,FILO)的方å¼å·¥ä½œï¼Œä½¿ç”¨ä¸€ä¸ªç§°ä½œå †æ ˆæŒ‡é’ˆçš„专用寄å˜å™¨æŒ‡ç¤ºå½“å‰çš„æ“ä½œä½ç½®ï¼Œå †æ ˆæŒ‡é’ˆæ€»æ˜¯æŒ‡å‘æ ˆé¡¶ï¼Œåœ¨ARM里常用R13ä½œä¸ºæ ˆæŒ‡é’ˆ(SP)。 æ ¹æ®å †æ ˆæŒ‡é’ˆçš„æŒ‡å‘ä½ç½®çš„ä¸åŒå¯ä»¥å°†å †æ ˆåˆ†ä¸ºæ»¡å †æ ˆå’Œç©ºå †æ ˆã€‚  æ»¡å †æ ˆ(Full Stack): å½“å †æ ˆæŒ‡é’ˆæŒ‡å‘æœ€åŽåŽ‹å…¥å †æ ˆçš„æ•°æ®æ—¶ã€‚  ç©ºå †æ ˆ(Empty Stack): å½“å †æ ˆæŒ‡é’ˆæŒ‡å‘ä¸‹ä¸€ä¸ªå°†è¦æ”¾å…¥æ•°æ®çš„空ä½ç½®æ—¶ã€‚ æ ¹æ®å †æ ˆçš„ç”Ÿæˆæ–¹å¼ï¼Œåˆå¯ä»¥åˆ†ä¸ºé€’å¢žå †æ ˆå’Œé€’å‡å †æ ˆã€‚  é€’å¢žå †æ ˆ(Ascending Stack): å½“å †æ ˆç”±ä½Žåœ°å€å‘高地å€ç”Ÿæˆæ—¶ã€‚  递å‡å †æ ˆ(Decending Stack): å½“å †æ ˆç”±é«˜åœ°å€å‘低地å€ç”Ÿæˆæ—¶ã€‚ 4ç§ç±»åž‹çš„å †æ ˆå·¥ä½œæ–¹å¼å¦‚下。  æ»¡é€’å¢žå †æ ˆFA(Full Ascending): å †æ ˆæŒ‡é’ˆæŒ‡å‘æœ€åŽåŽ‹å…¥çš„æ•°æ®ï¼Œä¸”由低地å€å‘高地å€ç”Ÿæˆã€‚  满递å‡å †æ ˆFD(Full Descending): å †æ ˆæŒ‡é’ˆæŒ‡å‘æœ€åŽåŽ‹å…¥çš„æ•°æ®ï¼Œä¸”由高地å€å‘低地å€ç”Ÿæˆã€‚  ç©ºé€’å¢žå †æ ˆEA(Empty Ascending): å †æ ˆæŒ‡é’ˆæŒ‡å‘ä¸‹ä¸€ä¸ªå°†è¦æ”¾å…¥æ•°æ®çš„空ä½ç½®ï¼Œä¸”由低地å€å‘高地å€ç”Ÿæˆã€‚  空递å‡å †æ ˆED(Empty Descending): å †æ ˆæŒ‡é’ˆæŒ‡å‘ä¸‹ä¸€ä¸ªå°†è¦æ”¾å…¥æ•°æ®çš„空ä½ç½®ï¼Œä¸”由高地å€å‘低地å€ç”Ÿæˆã€‚ æ ˆæ“ä½œå…¶å®žä¹Ÿæ˜¯å—æ‹·è´æ“作,æ¯ä¸€æ¡æ ˆæ“作指令都相应与一æ¡å—æ‹·è´æ“作指令相对应,其对应关系如表310所示。 表310å—æ‹·è´ä¸Žæ ˆæ“作的对应关系 å—æ‹·è´ æ ˆæ“作 地å€å˜åŒ–æ–¹å‘ å‘上å‘下 满空满空 增 å…ˆSTMIB STMFALDMIB LDMED åŽSTMIA STMEALDMIA LDMFD å‡ å…ˆLDMDB LDMEASTMDB STMFD åŽLDMDA LDMFASTMDA STMED 例如: LDMIA R0,{R5R8}; 功能解æžï¼š 将内å˜å•元[R0ï¼½~ï¼»R0+15]以å—为å•ä½è¯»å–到R5~R8ä¸ï¼Œä½Žåœ°å€ç¼–å·çš„å—æ•°æ®å†…å˜å•元对应低编å·å¯„å˜å™¨ã€‚ 3.5å处ç†å™¨æŒ‡ä»¤å¯»å€æ–¹å¼ ARM支æŒå处ç†å™¨æ“作,其æ“作è¦é€šè¿‡å处ç†å™¨å‘½ä»¤æ¥å®žçŽ°ï¼Œä¸‹é¢è®¨è®ºåå¤„ç†æŒ‡ä»¤å…·ä½“çš„å¯»å€æ–¹å¼ã€‚ 1. å处ç†å™¨åŠ è½½/å˜å‚¨æŒ‡ä»¤çš„坻倿–¹å¼ å处ç†å™¨çš„åŠ è½½å˜å‚¨æŒ‡ä»¤å¯ä»¥ç”¨æ¥å®žçްARM处ç†å™¨ä¸Žå处ç†å™¨ä¹‹é—´çš„æ•°æ®ä¼ 输。 å…¶æ±‡ç¼–è¯æ³•æ ¼å¼å¦‚下: <opcode>{<cond>}{L} <coproc>,<CRd>,<addressing_mode> å…¶ä¸ï¼š opcode为指令æ“作ç ï¼› coproc为å处ç†å™¨åç§°ï¼› addressing_modeä¸ºæŒ‡ä»¤å¯»å€æ¨¡å¼ã€‚ æ ¹æ®å†…å˜åœ°å€çš„æž„æˆæ–¹å¼ï¼Œå¯åˆ†ä¸ºç´¢å¼•æ ¼å¼å’Œéžç´¢å¼•æ ¼å¼ã€‚ 1) 内å˜åœ°å€ç´¢å¼•æ ¼å¼ ç´¢å¼•æ ¼å¼ç±»ä¼¼äºŽLDR/STR指令寻å€ä¸çš„ç«‹å³æ•°ä½œä¸ºåœ°å€åç§»é‡çš„å½¢å¼ã€‚ addressing_modeä¸çš„åç§»é‡ä¸º8ä½ç«‹å³æ•°çš„æ±‡ç¼–è¯æ³•æ ¼å¼æœ‰ä»¥ä¸‹3ç§ã€‚ å‰å˜å€ä¸å›žå†™å½¢å¼ï¼š ï¼»<Rn>,#+/-<immed_offset8>*4 ï¼½ å‰å˜å€å›žå†™å½¢å¼ï¼š ï¼»<Rn>,#+/-<immed_offset8>*4ï¼½ï¼ åŽå˜å€å›žå†™å½¢å¼ï¼š ï¼»<Rn>],#+/-<immed_offset8>*4 æŒ‡ä»¤ç¼–ç æ ¼å¼å¦‚下: cond为指令执行的æ¡ä»¶ã€‚ Cp_num为å处ç†å™¨çš„ç¼–å·ã€‚ P=1: å‰å˜å€æ“作 0: åŽå˜å€æ“作 U=1: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rnå€¼åŠ ä¸Šåœ°å€åç§»é‡ 0: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rn值å‡åŽ»åœ°å€åç§»é‡ N: ä¾èµ–于具体的å处ç†å™¨ï¼Œä¸€èˆ¬ç”¨æ¥è¡¨ç¤ºä¼ 输数æ®çš„大å°ã€‚ W=1: 执行基å€å¯„å˜å™¨å›žå†™æ“作 0: 䏿‰§è¡ŒåŸºå€å¯„å˜å™¨å›žå†™æ“作 L=1: 执行Loadæ“作 0: 执行Storeæ“作 CRdä½œä¸ºç›®æ ‡å¯„å˜å™¨çš„å处ç†å™¨å¯„å˜å™¨ã€‚ åç§»é‡ä¸º8ä½ç«‹å³æ•°çš„æŒ‡ä»¤ç¼–ç å¯¹åº”çš„æ±‡ç¼–è¯æ³•æ ¼å¼ç±»åž‹å¦‚表311所示。下é¢ä»‹ç»å„æ±‡ç¼–è¯æ³•æ ¼å¼ä¸‹çš„地å€è®¡ç®—方法: 表311å处ç†å™¨åŠ è½½/å˜å‚¨æŒ‡ä»¤ç¼–ç Wã€Pä¸Žåœ°å€æ¨¡å¼çš„关系 WPæ±‡ç¼–è¯æ³•æ ¼å¼ 01ï¼»<Rn>,#+/-<immed_offset8>*4ï¼½ 10ï¼»<Rn>],#+/-<immed_offset8>*4 11ï¼»<Rn>,#+/-<immed_offset8>4*ï¼½ï¼ (1) ï¼»<Rn>,#+/-<immed_offset8>*4ï¼½ 第一个内å˜åœ°å€ç¼–å·ä¸ºåŸºå€å¯„å˜å™¨Rnå€¼åŠ ä¸Š/å‡åŽ»immed_offset8çš„4å€(å…¶åŠ å‡ç”±U的值æ¥ç¡®å®šï¼‰ï¼ŒåŽç»çš„æ¯ä¸€ä¸ªåœ°å€æ˜¯å‰ä¸€ä¸ªå†…å˜åœ°å€åŠ 4,直到å处ç†å™¨å‘出信å·ï¼Œç»“æŸæœ¬æ¬¡æ•°æ®ä¼ 输为æ¢ã€‚ (2) ï¼»<Rn>,#+/-<immed_offset8>*4ï¼½ï¼ å†…å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨Rnå€¼åŠ ä¸Š/å‡åŽ»immed_offset8çš„4å€(å…¶åŠ å‡ç”±U的值æ¥ç¡®å®šï¼‰ï¼ŒåŽç»çš„æ¯ä¸€ä¸ªåœ°å€æ˜¯å‰ä¸€ä¸ªå†…å˜åœ°å€åŠ 4,直到å处ç†å™¨å‘出信å·ï¼Œç»“æŸæœ¬æ¬¡æ•°æ®ä¼ 输为æ¢ã€‚当指令执行时,生æˆçš„地å€å€¼(也就是Rnå€¼åŠ ä¸Š/å‡åŽ»immed_offset8çš„4å€ï¼‰å°†å†™å…¥åŸºå€å¯„å˜å™¨ã€‚ (3) ï¼»<Rn>],#+/-<immed_offset8>*4 内å˜åœ°å€ä¸ºåŸºå€å¯„å˜å™¨Rn值,当å˜å‚¨å™¨æ“作完毕åŽï¼Œå°†åŸºå€å¯„å˜å™¨Rnå€¼åŠ ä¸Š/å‡åŽ»immed_offset8çš„4å€(å…¶åŠ å‡ç”±U的值æ¥ç¡®å®šï¼‰ï¼ŒåŽç»çš„æ¯ä¸€ä¸ªåœ°å€æ˜¯å‰ä¸€ä¸ªå†…å˜åœ°å€åŠ 4,直到å处ç†å™¨å‘出信å·ï¼Œç»“æŸæœ¬æ¬¡æ•°æ®ä¼ 输为æ¢ã€‚最åŽå°†Rnå€¼åŠ ä¸Š/å‡åŽ»immed_offset8çš„4å€å†™å›žåˆ°åŸºå€å¯„å˜å™¨Rn(更新基å€å¯„å˜å™¨ï¼‰ã€‚ 2) 内å˜åœ°å€éžç´¢å¼•æ ¼å¼ è¿™ç§æŒ‡ä»¤å¯»å€æ±‡ç¼–è¯æ³•æ ¼å¼ä¸ºï¼š ï¼»<Rn>],<userdefined> æŒ‡ä»¤ç¼–ç æ ¼å¼å¦‚下: å…¶ä¸ï¼š cond为指令执行的æ¡ä»¶ï¼› U=1: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rnå€¼åŠ ä¸Šåœ°å€åç§»é‡ 0: 内å˜åœ°å€address为基å€å¯„å˜å™¨Rn值å‡åŽ»åœ°å€åç§»é‡ N: ä¾èµ–于具体的å处ç†å™¨ï¼Œä¸€èˆ¬ç”¨æ¥è¡¨ç¤ºä¼ 输数æ®çš„大å°ï¼› L=1: 执行Loadæ“作 0: 执行Storeæ“作 CRdä½œä¸ºç›®æ ‡å¯„å˜å™¨çš„å处ç†å™¨å¯„å˜å™¨ï¼› Cp_num为å处ç†å™¨çš„ç¼–å·ï¼› userdefined为用户自定义内容。 è¿™ç§å¯»å€æ–¹å¼ç”¨æ¥äº§ç”Ÿä¸€æ®µè¿žç»çš„内å˜åœ°å€ï¼Œç¬¬ä¸€ä¸ªåœ°å€å€¼ä¸ºåŸºå€å¯„å˜å™¨<Rn>的值,åŽç»çš„æ¯ä¸€ä¸ªåœ°å€æ˜¯å‰ä¸€ä¸ªå†…å˜åœ°å€åŠ 4,直到å处ç†å™¨å‘出信å·ï¼Œç»“æŸæœ¬æ¬¡æ•°æ®ä¼ 输为æ¢ã€‚ 注æ„事项:  ä»Žç´¢å¼•æ ¼å¼å’Œéžç´¢å¼•æ ¼å¼å¯»å€æƒ…况æ¥çœ‹ï¼Œå®ƒä»¬æœ‰ä¸€ä¸ªå…±åŒç‚¹ï¼š æ•°æ®ä¼ 输的数目是由å处ç†å™¨æ¥å†³å®šçš„。  在使用ä¸ï¼Œè¿™ä¸¤ç§å¯»å€æ–¹å¼æœ€å¤§å¯ä»¥ä¼ 输16ä¸ªå—æ•°æ®ã€‚ 2. å处ç†å™¨æ•°æ®å¤„ç†æŒ‡ä»¤çš„坻倿–¹å¼ å处ç†å™¨æ•°æ®å¤„ç†æŒ‡ä»¤çš„坻倿–¹å¼ä¸»è¦é€šè¿‡å¯„å˜å™¨å¯»å€ï¼Œæ ¹æ®å¯„å˜å™¨ç¼–ç æ¥æŸ¥æ‰¾ç›¸åº”的寄å˜å™¨ï¼Œè¿™éƒ¨åˆ†å†…容在指令系统ä¸è¿›è¡Œè¯¦ç»†ä»‹ç»ã€‚ æ€è€ƒä¸Žç»ƒä¹ 题 1. 在指令编ç ä¸ï¼Œæ¡ä»¶ç å æœ‰å‡ ä½ï¼Ÿæœ€å¤šæœ‰å¤šå°‘个æ¡ä»¶ï¼Ÿå„个æ¡ä»¶æ˜¯å¦‚何形æˆçš„? 2. 指令æ¡ä»¶ç ä¸ï¼ŒVæ ‡å¿—ä½åœ¨ä»€ä¹ˆæƒ…况下æ‰èƒ½ç‰äºŽ1? 3. 在ARM指令ä¸ï¼Œä»€ä¹ˆæ˜¯åˆæ³•çš„ç«‹å³æ•°ï¼Ÿåˆ¤æ–下é¢å„ç«‹å³æ•°æ˜¯å¦åˆæ³•ï¼Œå¦‚æžœåˆæ³•则写出在指令ä¸çš„ç¼–ç æ ¼å¼(也就是8ä½å¸¸æ•°å’Œ4ä½çš„ç§»ä½æ•°ï¼‰ã€‚ 0x54300x1080x3040x501 0xfb100000x3340000x3FC0000x1FE0000 0x55800000x7F8000x39C0000x1FE80000 4. 分æžé€»è¾‘å³ç§»ã€ç®—术å³ç§»ã€å¾ªçޝå³ç§»ã€å¸¦æ‰©å±•的循环å³ç§»ä¹‹é—´çš„区别。 5. ARMæ•°æ®å¤„ç†æŒ‡ä»¤å…·ä½“çš„å¯»å€æ–¹å¼æœ‰å“ªäº›ï¼Ÿå¦‚果程åºè®¡æ•°å™¨PCä½œä¸ºç›®æ ‡å¯„å˜å™¨ï¼Œä¼šäº§ç”Ÿä»€ä¹ˆç»“果? 6. 在Load/Store指令寻å€ä¸ï¼Œå—ã€æ— 符å·å—节的Load/Store指令寻å€å’ŒåŠå—ã€æœ‰ç¬¦å·å—节的寻å€ä¹‹é—´æœ‰ä»€ä¹ˆå·®åˆ«ï¼Ÿ 7. å—æ‹·è´Load/Store指令在实现寄å˜å™¨ç»„和连ç»çš„内å˜å•å…ƒä¸æ•°æ®ä¼ 递时,地å€çš„å˜åŒ–æ–¹å¼æœ‰å“ªå‡ ç§ç±»åž‹ï¼Ÿåˆ†æžå®ƒä»¬çš„地å€å˜åŒ–情况。 8. æ ˆæ“作指令地å€çš„å˜åŒ–æ–¹å¼æœ‰å“ªå‡ ç§ç±»åž‹ï¼Ÿåˆ†æžå®ƒä»¬çš„地å€å˜åŒ–æƒ…å†µï¼Œä»Žè€Œå¾—å‡ºæ ˆæ“作指令寻å€å’Œå—æ‹·è´Load/Store指令之间的对应关系。 9. 分æžå处ç†å™¨åŠ è½½/å˜å‚¨æŒ‡ä»¤çš„坻倿–¹å¼ä¸çš„内å˜åœ°å€ç´¢å¼•æ ¼å¼ä¸ä¸åŒçš„æ±‡ç¼–è¯æ³•æ ¼å¼ä¸‹å†…å˜åœ°å€çš„计算方法。 10. 写出下列指令的机器ç ï¼Œå¹¶åˆ†æžæŒ‡ä»¤æ“作功能。 MOVR0,R1 MOVR1,#0x198 ADDEQSR1,R2,#0xAB CMPR2,#0Xab LDRR0,[R1,#4ï¼½ STRR0,[R1,R1,LSL#2ï¼½ï¼ LDRHR0,[R1,#4ï¼½ LDRSBR0,[R2,#-2ï¼½ï¼ STRBR1,[R2,#0xA0ï¼½ LDMIAR0,{R1,R2,R8} STMDBR0ï¼ï¼Œ{R1-R5,R10,R11} STMEDSPï¼ï¼Œ{R0-R3,LR}