2016-12-11 3 views
1

저는 ASM/MIPS 기술을 사용하고 있으며 변환에 대한 교육을 받고 싶습니다.MIPS 명령어를 32 비트 16 진수로 간단히 변환하는 방법

MIPS 명령어를 32 비트 16 진수로 변환하고 싶습니다. 예를 들어, $ t0, $ zero, $ t1을 16 진수로 변경하려고합니다.

많은 솔루션을 찾았지만 모든 것이 다릅니다. 아이디어가 있으십니까?

답변

2

MIPS 하위 명령은 두 개의 레지스터를 빼고 결과를 레지스터에 저장합니다. sub $d,$s,$t

sub = function code 34 (see manual), 22 in hex, 100010 in bin (6 bits) 
$t0 = 8 in decimal, 8 in hex, 01000 in bin (5 bits) 
$zero = 0 in decimal, 0 in hex, 00000 in bin (5 bits) 
$t1 = 9 in decimal, 9 in hex, 01001 in bin (5 bits) 

$d = $s - $t 그래서 당신의 명령에 대한 기계 코드가 01001 01000 00000 100010 R-형식 지침, 옵 코드, 또는 "작동 코드"를

는 항상 0입니다 의미합니다. rs, rt 및 rd는 두 소스 및 하나의 대상 레지스터에 해당합니다.

따라서 소스 sub$t0,$zero,$t1은 16 진수 표기로 0x00094022으로 변환됩니다.

설명

MIPS 모든 명령어는 32 비트이고 16 진수 머신 코드로 기록 될 수있는 32 비트 수로 변환한다.

명령 하위 (빼기)에는 opcode 0x22가 있습니다. 따라서 가장 오른쪽 숫자는 22 여야합니다 (위에있는 참조).

sub는 명령어 유형 R입니다. 이는 명령어가 사용하는 모든 데이터 값이 레지스터에있는 경우 R 명령어가 사용됨을 의미합니다.

모든 R 형 명령의 형식은 다음과 같습니다

"OP는"(이 경우 하위에서) 특정 명령에 대한 니모닉입니다
OP rd, rs, rt 

. rs 및 rt는 소스 레지스터이고 rd는 대상 레지스터입니다. 즉

sub $t0, $zero, $t1 

, 당신의 명령 "0에서 T1을 빼고 T0에 결과를 넣어"의미 :이 경우, 하위 명령으로 사용됩니다.

두 레지스터의 값을 교체하려면 다음과 같이 당신은 그것을 할 수 있습니다 : 당신이 $의 T1에서 또한 $ t0의 콘텐츠를 넣어하려는 경우

.text 
.globl __start 
__start: 

sw  $t0, x 
sw  $t1, y 
lw  $t0, y 
lw  $t1, x 
.data 
x: 
.word 0x000000FF 
y: 
.word 0xABCDE080 

, 당신은 or 명령을 사용할 수 있습니다 :

lui $t0, 0x
or $t1, $zero, $t0 
+0

나는 혼자 노력했지만 동일한 결과가 있습니다. 하지만 바이너리 (10010100000000100010)로 전달했습니다. 당신의 설명은 좋았어, 고마워. 하지만 다른 질문이 있습니다. $ t0와 $ t1의 레지스트리를 교환하려면 어떻게해야합니까? 다시 변환해야합니까, 아니면 쓸모가 없어야합니까? – hiero

+0

xchg $ t0, $ t1을 완료했습니다 – hiero

+0

너무 복잡합니다. 그래서 무엇을해야합니까? xchg 8,9? – hiero