2013-05-22 3 views
2

키보드에서 숫자를 읽고이를 buf라는 배열에 저장했습니다. 또한 len 변수에 배열의 길이가 있습니다.어셈블리의 배열 요소 수를 계산하십시오.

지금 배열에서 번호를 계산하려고합니다. 내 코드는 다음과 같습니다.

xor si, si 
    xor bx, bx ; made them 0 
    start_for: 
    cmp si, len 
    je end_for 
    mul bx, 10 ; I think here is the problem! 
    mov al, buff[si] 
    sub al, '0' 
    add bx, ax 
    inc si 
    jmp start_for 

    end_for: 

무엇이 문제입니까?

'mul bx, 10'줄이 효과가 없다는 것을 디버깅하는 것으로 나타났습니다.

+1

AS는 숫자가 넘치기 전까지 만 65535 자까지 증가 할 수 있습니다. 현재 발생한 문제입니까? 더 작은 숫자에 대해 코드 작업을합니까? –

+0

아니요, 배열의 항목 수에 관계없이 작동하지 않습니다. – Sorin

+0

아래 답변의 ah 문제는 좋은 팁입니다. –

답변

3

라인 add bx, ax에는 상위 바이트 ah이 아직 정의되지 않은 것 같습니다. ax 또는 ah ~ 0으로 설정하는 것이 좋습니다.

또한 i86은 사용자가 생각하는 곳에 'mul'제품을 넣지 않을 수도 있습니다. 제품은 BX 피연산자가있는 경우에도 DX : AX에있을 수 있습니다. 코드에서 AX와 BX의 사용을 바꾸는 것이 좋습니다. AX를 최종 제품으로하고 bx를 한 자리 값으로 설정하십시오.

+0

나는 그것을 정의하고 여전히 작동하지 않습니다. 요소의 합계만을 계산하므로 bx의 곱셈은 아무런 효과가 없습니다. – Sorin

1

MUL 명령을 잘못 사용하고있었습니다. 프로그램을 수정하고 그것을 작동 :

xor si, si 
xor ax, ax   

    start_for: 
    cmp si, len 
    je end_for 
    mov bx, 10 
    mul bx ; This means AX = AX * BX (for 8 bit operands) 
    mov bh, 0 
    mov bl, buff[si] 
    sub bl, '0' 
    add ax, bx 
    inc si 
    jmp start_for 

    end_for: 

AX와 BX 레지스터가 그 의미를 변경했습니다. AX는 번호를 저장하고 BX는 MUL에만 사용됩니다.

관련 문제