2012-09-12 3 views
4

아직 조립이 ​​새 것이므로 아직 어셈블리에 많은 명령어 코드를 알지 못합니다. 16 비트 레지스터에서 나눗셈을하고 싶습니다. 그 내용을 인쇄하고 싶습니다. 인쇄를 위해 레지스터의 내용을 ASCII로 변환해야하지만 다시 문제가되는 것은 알고 있습니다. 도와주세요.조립 : 16 비트 사업부

예를 들어 cx의 내용은 2012 (정수)입니다. 어떻게해야합니까?

mov ax, cx 
mov bx, 1000 
idiv bx 

위의 코드는 잘못되었습니다. 맞습니까?

답변

3

편집의 : I 이것은 부호가있는 구분 idiv임을 알게되고 이에 따라 답변이 수정되었습니다.

위 코드는 한 측면에서 잘못되었습니다. axdx:ax으로 부호가 확장되지 않습니다.

idiv bx 전에 cwd (단어를 더블 워드로 변환)을 추가하기 만하면됩니다. 몫은 ax이고 나머지는 dx입니다.

+0

감사. 여기에 문자를 인쇄 할 때, mov dl 대신 mov 012, 을 사용할 수 있습니다. 바로 16 비트를 다루고 있기 때문입니다. – shriekyphantom

+0

'dh'를 0으로 설정하면 yes입니다. 그래서'mov dx, a''와'mov dh, 0; mov dl, 'a'는 동일한 레지스터 값을 생성하고 플래그를 변경하지 않습니다. – nrz

+0

오. 괜찮아. 정리해 주셔서 감사합니다. :) – shriekyphantom

4

체크 아웃 this reference (검색 IDIV)

IDIV 명령은 64 비트 정수 EDX 내용 분할 : 최소로 최상위 4 바이트로 및 EAX를 EDX를 볼에 의해 구성 EAX를 (중요한 4 바이트)를 지정된 피연산자 값으로 바꿉니다. 분할의 몫 결과는 EAX에 저장되고, 나머지는EDX에 저장됩니다. 구문 IDIV IDIV

IDIV의 EBX - EDX의 내용을 분할 : EAX를 EBX의 내용으로. 몫을 EAX에두고 나머지를 EDX에 배치하십시오. idiv DWORD PTR [var] - EDX : EAS의 내용을 메모리 위치 var에 저장된 32 비트 값으로 나눕니다. 몫을 EAX에두고 나머지는 EDX에 놓습니다.

물론

, 16 비트를 사용하고 있기 때문에, 반으로 지정된 비트 값을 모두 잘라 등록 각 떨어져 E를 삭제하고 동일한

+0

따라서 OP 요구 사항에 대해 EDX/DX를 제로화해야합니까? –

+0

@MartinJames 예, 16 비트 숫자를 16 비트 숫자로 나누는 경우에만 가능합니다. – Earlz

+0

우리는 "div"대신 "idiv"를 사용하기 때문에 "cwd"(sign extension axx를 dx로 삽입하는 것이 더 좋을 수도 있습니다 ... –