값은 .BLKW 개체에 저장되며 LDR R0, R1,0 - ADD R1, R1,1이있는 루프에로드됩니다 (.BLKW 주소를 증가시킵니다). 문제는 저장된 HEX 값을 이진 값으로 변환 한 다음 변환을 16 비트 이진 형식의 CONSOLE로 출력하는 방법입니다. 어떤 아이디어라도 대단히 감사하겠습니다! 나는 값을 ANDing하는 것에 대해 생각해 왔지만, 그것에 대해 어떻게해야하는지 확신 할 수 없다.저장된 Hex 값을 lc3/어셈블리 코드를 사용하는 이진 파일로 변환하는 방법은 무엇입니까?
답변
나는 LC3에 대해 아무 생각이 없지만, 당신은 리틀 엔디안 아키텍처에
- , 값이 1에 의해 왼쪽 시프트 할 수있는 시프트 지침은 마지막으로 캐리 플래그의 비트를 이동 반영하는 것으로 추정하고, 캐리가 설정되면 '1'을 출력 스트림에 넣고 그렇지 않으면 '0'을 출력하고 그렇지 않으면 빅 엔디안 아키텍처에서
- 을 입력하고 값을 오른쪽으로 시프트하고 캐리 설정시 문자 '1'을 넣거나 '0' 그렇지 않으면 출력으로.
시프트 명령어가 캐리 플래그로 이동하지 않으면 가장 큰 비트 또는 최하위 비트를 먼저 테스트 할 수 있습니다 (각각 작은 또는 큰 엔디안 아치의 경우). 결과에 따라 '1'또는 출력 스트림에 '0'을 입력하고 그 후에 —으로 전환하면 효과가 동일합니다.
"스트림"이란 상상할 수있는 출력 매체를 의미합니다. 메모리 또는 실제 파일에있는 (문자열) 변수 또는 다른 버퍼 일 수 있습니다.
죄송합니다. 문제의 시스템에서 사용 가능한 소스 코드를 제공해 드릴 수는 없습니다.
감사합니다.
이미 루프가 종료되었습니다. 그러나 하나의 작은 오류.
OUT을 사용하여 인쇄하면 R0의 값이 콘솔에 인쇄됩니다. 그래서 우리가 인쇄하고있는 숫자 (R0의 숫자)는 항상 0이나 1이어야합니다. 따라서 우리가 작업중인 16 진수 값은 R2와 같은 다른 레지스터에 저장되어야합니다. 코드 "LDR R0, R1, 0"은 "LDR R2, R1, 0"이됩니다.
이제 각 단어 (.BLKW의 주소)에 대해 한 번에 한 비트 씩 인쇄하여 이진으로 변환해야합니다.
16 개의 AND 연산을 수행 할 수 있습니다. R2를 1000 0000 0000 0000의 숫자로 AND 연산하여 [16] (맨 왼쪽 비트)이 1인지 확인하십시오. 결과가 0이 아니면 가장 왼쪽의 비트가 1이므로 1을 인쇄하십시오. 결과가 0이면 0이어야합니다. 따라서 0을 인쇄하십시오. 그런 다음 AND R2를 0100 0000 0000 0000으로 설정하여 두 번째 비트를 동일한 방식으로 확인하는 등의 작업을 수행 할 수 있습니다.
그러나 이것은 지저분합니다. 가장 좋은 방법은 루프를 사용하는 것입니다.
레지스터 중 하나를 설정하십시오. 예를 들어 R3을 1000 0000 0000 0000으로 설정하십시오. 잠시 후 사용하겠습니다.
R5를 우리의 센티넬, 즉 "카운터"로 사용하여 16 자리 숫자를 모두 처리 한 시점을 알려 드리겠습니다. R5를 16으로 설정하고 루프를 돌 때마다 R5에서 1을 뺀 다음 0을 누르면 루프가 종료됩니다.
이제 루프 내부에 무엇을 넣을 것입니까?
각 반복 AND R2 및 R3에 대해 R4와 같은 일부 사용되지 않는 레지스터에 결과를 저장합니다. 결과가 0이면 R2의 가장 왼쪽 비트가 0이라는 것을 알 수 있으므로 0을 인쇄하십시오. 결과가 음수이면 (1000 0000 0000 0000이 2의 보수이며 음수이므로) 왼쪽 비트가 1, 그래서 인쇄 1.
그런 다음 R2에서 왼쪽 비트 단위 시프트를 수행하십시오. 이것은 R2를 추가하고 "ADD R2, R2, R2"를 통해 저장함으로써 수행됩니다. 를 통해 R5에서 카운터
감소 접속 : 루프의 시작
반환 "R5, R5, # -1 추가"를 선택합니다.
결과가 필요합니다.