2010-03-04 5 views
3
 .data 
VALS: .half 0xbead, 0xface 
RES: .space 4 
    .text 
    la  $t0,VALS 
    lh $t1,($t0) 
    lhu $t2,2($t0) 
    sll $t2,$t2,16 
    or $t2,$t1,$t2 
    jal AVG 
    .word -2 
    .word -6 
    la $t4,RES 
     sw $v0,($t4) 
     li  $v0,10 
    syscall 
AVG: lw $v0,($ra) 
    lw $t3,4($ra) 
    add $v0,$v0,$t3 
    sra $v0,$v0,1 
    addi $ra,$ra,8 
    jr  $ra 

이 MIPS 코드에서 .word 부분은 무엇을 수행합니까? 내 에뮬레이터에서 텍스트 섹션의 데이터 지시문을 처리 할 수 ​​없습니다. 지시문은 무엇을합니까? 그리고 .word -8이 아니라 .word -2와 .word -6을하는 것이 무엇입니까?MIPS 어셈블리의 .word 지시문

답변

4

이 지시문은 단어 값 -2와 -6을 코드 스트림에 넣습니다. 이 청크의 실제 이진 표현을 보면 명령어 인코딩의 중간에 엔디안 방식에 따라 FFFFFFFEFFFFFFFA 또는 FEFFFFFFFAFFFFFF가 표시됩니다.

어셈블러는 -2 단어 값 -2 및 -6의 데이터를 각각 출력하며 -8의 단일 단어와는 아무런 관련이 없습니다.

당신은 AVG에서 무엇을 보면 : 레이블, 당신은 그것을 사용 알 수 있습니다

lw $v0, ($ra) 
lw $t3, 4($ra) 

그 반환 주소 레지스터 V0 및 T3의 하중이 개 단어 (즉, 당신이에서 뛰어 곳, 즉 코드 세그먼트에 포함 된 데이터에서). 그래서 ... v0는 -2가되고, t3는 -6이됩니다. 또한 코드 세그먼트가 반환 전에 $ ra에 8을 더하여 삽입 된 데이터를 뛰어 넘는 방법에 유의하십시오.

간단히 말해 코드 스트림의 일부로 레지스터에로드 할 상수 값을 인코딩하는 방법입니다.

코드가 수행하는 작업은 반환하기 전에 2를 함께 추가하여 오른쪽으로 이동하는 것입니다 (평균 구현을 가정합니다). 이 특별한 경우에 컴파일 작업시 평균을 직접 계산할 수있는 경우 (또는 직접 asm을 머리에 쓰는 경우) 많은 작업을 수행하는 것은별로 의미가 없습니다. AVG는 여러 곳에서 호출해야한다고 가정하지만, 코드 세그먼트 (보통 읽기 전용)의 값을 기대하기 때문에 상수 값에서 수학 계산의 요점을 보지 못합니다.