2016-10-10 2 views
1

정수로 입력하고 그 정수의 정수 값 6.985를 반환하는 ARM 어셈블리 언어로 프로그램을 작성해야합니다. 예를 들어 36을 입력 값으로 입력하면 결과는 251이됩니다.부동 소수점의 곱셈을 수행하는 ARM 어셈블리 언어 프로그램 작성

mul (두 개의 정수를 더함), mul (두 개의 정수를 곱함), divide (두 개의 정수를 나눕니다.), getnum (사용자로부터 입력으로 정수를 얻음) 및 printnum (출력을 화면에 출력 함).

bl getnum 

mov r1, #1000 

bl divide 

mov r4, r0 

mov r5, r1 

bl printnum 

mov r0, r5 

bl printnum 

내 질문 :

bl getnum 

mul r0, r0, #6985 

bl printnum 

여기 분할 기능에 대한 내 코드입니다 : 내 접근 방식은 처음 6,985을 곱과 1000

가 여기에 MUL 기능에 대한 내 코드입니다에 의해 다음 분할하는 것입니다 한 번에 곱셈과 나눗셈을 수행 할 수 있도록 어떻게 두 가지 방법을 결합 할 수 있습니까? 나는이 언어에 대해 아직 익숙하지 않기 때문에 나누기 함수에서 getnum을 제거하고 mul 함수와 결합하는 방법을 모른다.

+0

어떤 ARM 명령어 세트 및 프로세서 제품군을 사용하고 있습니까? Cortex-M4 용 ARMv7 등? 일반적으로 곱셈과 나눗셈을 동시에 수행하는 단일 명령은 없으며 일부 ARM 프로세서에는 나누기 명령이 없습니다. – InfinitelyManic

+0

정확한 정확도 요구 사항이없는 경우 * 57221을 수행 한 다음 8192 = * 6.9849853515625로 값을 나눌 수 있습니다. 요점은 8192가 2^13이므로 나누기가 13으로 단순 시프트입니다. 비트. (더 나은 정확도를 얻으려면 원래의 6.985 값에 2를 곱해서 자르면 소수점 이하 자릿수가 충분 해지고 곱해진 횟수를 셉니다.) 그렇지 않으면 당신의 접근 방식이 유효하고, 당신이 무엇을 요구하고 있는지 확신 할 수 없다. 단지'mul'의 결과를 나누기 부분에 사용하면된다. (그리고 만약 2의 거듭 제곱을 가졌다면 최대 넘버가 오버플로되기 전에 곱해질 수 있습니다.) – Ped7g

+0

2의 거듭 제곱에 의한 나누기는 물론 shift-right이고, 왼쪽으로의 쉬프트는 2의 거듭 제곱입니다. – Ped7g

답변

0

전체 사진을 얻으려면 getnum, divideprintnum의 실제 정의를 포함하여 전체 코드를 게시해야합니다.

의 가정하자 :

  • getnum 코드에서 참조 r0
  • divide 기능 어딘가에 (? 콘솔)에 저장한다 정수를 얻는 것은 r1에 의해 r0 분할과에 결과를 저장 동일한 레지스터 (확실하지 않은 것 r1, 아마 분할 알림).
  • printnum은 단지 r0의 값을 출력합니다. 내 가정이 맞다면

, 그냥 같이 코드를 결합 :

bl getnum 

mul r0, r0, #6985 
mov r1, #1000 

bl divide 

bl printnum 

보너스

당신이 mul 명령에 대해 같은 레지스터를 사용할 수 없습니다 AFAIK. 모든 ARM에 적용되는지 여부는 확실하지 않습니다.

+0

Cainkovs - 예 r0, r0 ...은 Cortex-A9, A53 및 M-4에서 작동합니다. 그러나 곱셈기 (# 6985)는 먼저 다른 레지스터에 배치해야합니다. 예 : Cortex-A9 movw r9, # 6985, Cortex-M4 ldr r9, # 6985 *, Cortex-A53 mov x9, 6985. * 의사 지시 – InfinitelyManic

관련 문제