2017-11-22 18 views
0

안녕하세요, 저는 어셈블리 언어의 초보자입니다. 어느 누구도 어셈블리 언어 x86에서 숫자를 다루는 방법을 이해할 수 있습니다. 나는 숫자와 관련된 모든 작업을 처리 할 때 나는 나는 shl 같은 프로그램을 실행할 수 없습니다, 어려움에 직면 shr, mul 어느 한 설명 또는 나는 매우 감사 할 것입니다 다음 코드를 공유 할 수있는 경우 div 두 자리 또한어셈블리 언어의 숫자

마찬가지로 :

Mov Al 2 
Mov Bx 2 
mul bx 

mov dx,bx 
mov ah,2 
int 21h 

하지만 30h조차 못할 쇼 정답을 뺀를 통해 은밀한 경우 그것이 상징에 나타내었다 올바른 출력을 표시 할 수 없습니다.

+0

조립시 * 문자 *를 읽고 쓸 수 있습니다. 숫자 값이 필요한 경우 문자 값을 숫자로 변환 한 다음 숫자를 조합하려는 모든 유형에 결합해야합니다. [ASCIITable] (http://asciitable.com) 참조 –

+1

화면의 두 자리 숫자는 두 개의 ASCII 문자로 구성됩니다. 'mov dl', 2 'mov ah, 2 int 21h mov dl,'5 'mov ah, 2 int 21h'와 같이 화면에 "25"가 출력됩니다. 이 예제에서 실제 값 '25'는 전혀 사용되지 않았습니다. DOS는 숫자를 출력하는 서비스가 없습니다. 숫자를 먼저 문자로 변환해야합니다. 참조 : https://stackoverflow.com/tags/x86/info ... 어셈블리 기초를 배우는 중이라면 문자열 항목을 완전히 건너 뛰고 디버거를 사용하여 숫자 값이 맞는지 확인하십시오. 나중에 산술 및 메모리 조작에 대한 경험이있는 경우 문자열로 작업하십시오. – Ped7g

답변

1

나는 shl, shr, mul, div

shlshr는, mul는, div지침처럼 프로그램을 실행할 수 없습니다. 그들에게 프로그램으로 언급하지 마십시오.

... 난

대신 30H를 뺀의 30H를 추가 변환이 당신을 필요로 아래의 코드를 참조하십시오 ... 뺀 30H를 통해 은밀한.

Mov Al 2 
Mov Bx 2 
mul bx 
mov dx,bx 
mov ah,2 
int 21h 

당신은 이 개 한 자리 숫자를 곱이 프로그램을 수정할 수 있습니다.

오류 1 : 올바른 크기 곱하기를 선택하십시오. mul bx을 사용하면 DX:AX = AX * BX이 계산됩니다.이 경우 잔인합니다. 또한 AH을 잊어 버린 이후로 무작위로 결과를 얻었습니다!

mov al, 2 
mov bl, 2 
mul bl  ; -> AX = AL * BL 

오류 2 : 수있는 결과를 변환 4 (2 × 2) 문자 "4"로.
mul 명령어의 결과가 BX 레지스터에 없으므로 코드가 생각 중이므로 (mov dx, bx) 알 수 있습니다.
mul blAX에 그 결과를 남겨두고, 값이 너무 작기 때문에, 우리는 AL (AX의 낮은 반)

add al, "0" ;"0" = 30h 
mov dl, al 
mov ah, 02h 
int 21h 

그것은 보는 것이 중요을 사용하는 경우에만 필요가 할 수있는 결과를 표시이 매우 간단한 방법 0에서 9까지의 결과에 대해서만 작동합니다.

이 [0,9] 범위를 벗어나는 숫자를 표시하려면 Displaying numbers with DOS을보십시오. 이 텍스트는 어떤 숫자를 텍스트 표현으로 변환하여 화면에 출력 하는지를 자세하게 설명합니다.

+0

큰 설명을 해주셔서 정말 고마워요. – sahar