2016-08-24 1 views
-1

다음 assember 명령이 주어진다어셈블러 명령어를 좀 더 복잡한 명령어로 변경 - 올바르게 했습니까?</p> <pre><code>SUB[R1], 8[-R2] </code></pre> <p>양식이 명령이 계산된다 :

op1 = op1 - op2 

첫 번째 피연산자는 "간접 레지스터"다루어진다. 두 번째 것은 "인덱스가 등록 된"사전 감소 ("n[-Rx]")로 처리됩니다.

8[-R2]이 같은도 기록됩니다 :

add #7, R2 
sub [R1], [R2] 
sub #8, R2 

나는 것을 가지고 이유를 설명하려고 :

나는 것을 변경 R2-1+8= R2+7을, 그래서 나는 처음에 R27을 추가했다.

다음 줄이 분명합니다.

마지막 줄 "pre-decrement"를 말하기 때문에 마지막 줄에서 R2에서 8을 제거합니다.


모두 괜찮습니까? 나는 우리의 개인적인 작문 방법에 대해 충분히 설명했으면 좋겠다. (나는 다른 방법으로 쓰는 법을 알지만, 이것을 사용한다.)

이것은 숙제가 아니다. 나는 그것을 이해하기 만하면 나는이 일을한다. 내 자신의 배웁니다.

+0

어떤 명령어가 이것입니까? –

+0

구문은 무엇입니까 –

+0

Sry 무슨 뜻인지 이해가 안 되니? #이 의미하는 것은 상수를 사용한다는 것을 의미합니다. 각각의 상수 사용 전에 #을 쓰십시오. # Constant – rpbudd

답변

2

정의에 몇 가지 문제점이 있습니다. 모든

첫째, 명령은 [-R2]이 있으므로이 명령이 계산됩니다 형태는 그 부작용을 포함 할 것이다 : 당신의 지시에서

op1 = op1 - op2 
r2 = r2 - 1 

다른 문제는 정의하지 않는다는 것입니다 크기가 분명합니다. 당신이 바이트라고 가정하는 것처럼 보입니다. 증분 및 감소뿐만 아니라 잘 정의 된 크기를 갖는 68000 프로세서 (암시 된 크기가 많은 인텔 프로세서와는 반대)를 살펴볼 수 있습니다.

예를 들어 스택에 D1을 저장하려면 다음과 같이하십시오. 어떤 일을하고 밖으로 값을 다시 팝의 .L은 크기 (LONG, 4 바이트)를 정의합니다 :이 경우

MOV.L D1, -(SP) 
... 
MOV.L (SP)+, D1 

을의 SP 레지스터는 4 감소하고 4 다시 증가합니다 명령이 long을 처리하고 있기 때문입니다. 당신의 경우에, 우리는 정말로 모른다.

+1

"묵시적 크기"당신이 말하는 방식은 어셈블리 구문 디자인의 문제이지 CPU 디자인은 아닙니다. 'andi.l # $ ffff, d0'와'and eax, 0xffff'의 차이점에 대해 말하면 AT & T 구문 (GNU'as') 버전은'andl $ 0xffff, % eax '(여기서'l '은 32 비트 피연산자 크기를 지정합니다). 물론 32 비트 모드와 동일한 기계 코드 형식을 사용하는 16 비트 모드가 존재한다는 것은 컴퓨터 코드/CPU 디자인의 의미에서 x86에서 계속 진행되는 암시 적 크기의 작업이 많다는 것을 의미합니다. –

+1

ARM 어드레싱 모드는 흥미롭고 요소 크기 인 IIRC 이외의 값으로 사전/사후 증가/감소를 허용합니다. 또한 ARM 모드, IIRC에서는 네 가지 조합을 모두 사용할 수 있습니다. 최소한 컴팩트 인코딩의 경우 thumb-in 및 pre-dec 만 허용됩니다. R4를 저장 주소로 사용하면 'STR R2, [R4], # - 16'은 'R4- = 16'이됩니다. –