2014-11-02 5 views
-1
나는이 계산 8086 어셈블리 프로그램을 작성해야

:8086 어셈블리 언어 부호 해석

(a+b*c+2/c)/(2+a)+e 

a, b-byte

c-word

e을 - doubleword,

부호없는 해석. 여기

assume cs:code,ds:data 

data segment 

    a db 4 
    b db 2 
    c dw 16 
    e dd 126 
    data ends 

code segment 
start: 

    mov ax,data 
    mov ds,ax 

과 내 프로그램

내가 계속하는 방법을 모르는
mov al,b ; al=b 
    mov ah,0 ; ax=b; 
    mul c; dx:ax=b*c; b*c=doubleword 
    mov bx,ax; we save b*c in bx to use ax in the division 2/c 
    mov al,2; al=2 
    mov ah,0; al=ax=0 
    div c; ax=dx:ax/c ; dx=dx:ax%c; 

입니다 :

지금까지 나는이 있습니다.

+0

도움이 필요합니다. [** Art of Assembly **] (https://courses.engr.illinois.edu/ece390/books/artofasm/artofasm.html) 특히 [** 산술 연산 **] (https : //courses.engr .illinois.edu/ece390/books/artofasm/CH06/CH06-2.html # HEADING2-1) 및 [** 표지 및 Zero Extension **] (https://courses.engr.illinois.edu/ece390/books /artofasm/CH01/CH01-2.html#HEADING2-151) –

답변

0

당신은 당신이 실제로 단지 그것은 제공하는 번호와 함께 작동 B와 C 사이의 제품의 하위 워드를 저장하고

mov bx,ax; we save b*c in bx to use ax in the division 2/c 

쓰기 있지만 일반적인 해결책이 아니다 때. 쓰기

mov al,2; al=2 
mov ah,0; al=ax=0 

사용 mov ax,2 및 분할이 필요하기 때문에 명시 적으로 DX를 등록을 취소 기억 대신에

.

계속 하시겠습니까? 결국 가장 큰 표현식 참가자의 크기가 결과의 크기를 정의하기 때문에 더블 워드 크기의 결과 변수를 만드는 것이 좋습니다. 그런 다음 이동하거나 부분 결과를이 변수에 추가하십시오.
32 비트 레지스터를 사용할 수있는 경우 적합한 방법은 모든 값을 32 비트로 승격하고 거기에서 계속하는 것입니다.