2014-03-28 4 views
-1

저는 전체적인 문제를 풀기 위해 좀 더 복잡한 질문이 있지만 현재 두 개의 숫자를 더할 수 없습니다. '추가'명령에 대해 알고 있습니다. 레지스터 할당 값에 정수를 추가 할 때 유용합니다. 메모리에서 두 개의 숫자를 추가 할 때, 그들은 처음에는 문자열입니다. 이전에 정수로 변환해야합니다 (그건 내 추측입니다). 어떤 도움이 필요합니까?NASM : 메모리에 저장된 두 개의 숫자 추가하기

SECTION .data 
    msg1 db 'Enter 2 numbers:', 0Ah 
    msg2 db 'You entered:', 0Ah 
    msg3 db 'Sum: ' 

SECTION .bss 
one: resb 4 
two: resb 4 
sum: resb 4 


SECTION .text 
global _start 

_start: 

mov eax, 4 
mov ebx, 1 
mov ecx, msg1 
mov edx, 32 
int 80h 

mov eax, 3 
mov ebx, 0 
mov ecx, one 
mov edx, 4 
int 80h 

mov eax, 3 
mov ebx, 0 
mov ecx, two 
mov edx, 4 
int 80h 

mov eax, 4 
mov ebx, 1 
mov ecx, msg2 
mov edx, 39 
int 80h 

mov eax, 4 
mov ebx, 1 
mov ecx, one 
mov edx, 4 
int 80h 

mov eax, 4 
mov ebx, 1 
mov ecx, two 
mov edx, 4 
int 80h 

mov eax, 4 
mov ebx, 1 
mov ecx, sum 
mov edx, 4 
int 80h 

mov eax, 1 
mov ebx, 0 
int 80h 
+0

예, 맞습니다. 문자열을 파싱하기 위해 어떤 노력을 했습니까? – Guffa

답변

1

귀하의 질문에 대한 이해를 통해 숫자를 나타내는 두 개의 문자열을 읽고 그 숫자를 추가하려고합니다.

처음에는 숫자가 아니라 문자열이라는 말로 옳습니다. 문자열이 나타내는 숫자를 추가하려면 먼저 문자열을 일반 숫자 표현으로 변환하는 방법을 찾아야합니다.

몇 가지 가능성이 있습니다. strtol과 같은 라이브러리 함수를 사용할 수 있습니다 (해당 라이브러리를 사용해야 함). 문자열을 인수로하여이 함수를 호출하면 작업이 수행됩니다. eax 레지스터 옆에 결과가 표시됩니다.

큰 교육적 가치를 얻으려면 직접 계산해야 할 수도 있습니다. 그렇게 어렵지는 않습니다. 적어도 평생 적어도 한 번은 그렇게하는 것이 좋습니다.

먼저 기본 질문이 있습니다. 아마받은 숫자는 10 진수라고 가정합니다. 또한 모든 ASCII 숫자를 값으로 변환하려고합니다. 이 경우 0x30 또는 '0'을 뺄 수 있습니다.

숫자가 a_0, a_1, a_2, a_3 인 경우 (예 : 0x30 빼기), 1 * a_0 + 10 * a_1 + 100 * a_2 + 1000 * a_3으로 계산해야합니다. 바로 그런 루프를 만듭니다. 결과는 실제 숫자입니다.

번호를 콘솔에 다시 인쇄하려면 반대쪽 기본 변환을 수행해야합니다. 다른 경우에는 10을 기준으로 10을 모듈화하여 반복해서 나누어서 사용해야합니다. 마지막으로 모든 10 진수에 0x30을 더하고 그 문자를 인쇄해야합니다.

행운을 빌어 요.

관련 문제