2013-04-23 2 views
0

지금 내 코드는 1846을 거꾸로주고 있습니다. 1846 및 6481 인쇄하려면 배열을 되돌릴 방법을 잘 모르겠다. 내가 그것을 되돌릴 루프가 필요하지만 그것을 구현하는 방법을 알지 않아요. 어떤 도움을 주시면 감사하겠습니다. 고맙습니다.어셈블리에서 배열의 순서를 바꾸는 방법은 무엇입니까?

.data 

enter_message: 
    .ascii "Enter a binary value:\n" 

enter_message_length: 
    .int 22 

name: 
    .space 50 
buffersize: 
    .int 0 

someLength: 
    .int 50 
array: 
    .space 50 

.text 
.global _start 

_start: 




mov $1846, %eax 

mov $10, %ebx 
    mov $0, %edi 
While_Loop: 
    cmp $0, %eax       
    je Convert_to_ASCII     

    mov $0, %edx       
    div %ebx        

    add $48, %edx    
    movb %dl, buffersize(%edi)  
    add $1, %edi 
    jmp While_Loop  


Convert_to_ASCII: 
    mov $4, %eax 
    mov $1, %ebx 
    mov $buffersize, %ecx 
    mov %edi, %edx 
    int $0x80 

mov $1, %eax 
int $0x80 
+0

가능한 [어셈블리에서 배열 조작] (http://stackoverflow.com/questions/13541679/manipulating-arrays-in-assembly) – nrz

답변

1

이 (문자열이 아스키 0으로 끝나는 확인) 두 개 이상의 실제/쉬운 옵션

대상 문자열 전용 메모리 영역의 끝에서

1) 시작하고 포인터를 감소 .

mov ah,[bx]; 
    dec bx 

2) 스택을 사용하여 - 당신은 각 N이 반복 두 개의 루프로 작업을 분할 할 필요가

  • 첫 번째 루프 : 푸시 N 시간
  • 다음 루프 : N 시간을 팝업 및 쓰기 to * bx ++

2.1) 임시 문자열에 쓰기 (스택과 동일한 메커니즘이지만 공간이 적고 복잡한 명령어 사용).

2.5)을 사용하여 순환이 문제는이 시험 감산 :)

int biggest = 10000; 
while (biggest) { 
    digit='0'; 
    while (number >= biggest) { number -=biggest; digit++; } 
    output(digit); // tune this to skip leading zeros 
    biggest/=10; // or read next from a table 
} 
전형적으로 달성된다 (제 1 최대 수에서 작동하는 알고리즘을 사용하여, ASCII로 변환하는 소수에 대해 근본적 같이

3)

관련 문제