2014-11-02 3 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

Вам нужна помощь. См. [** Искусство сборки **] (https://courses.engr.illinois.edu/ece390/books/artofasm/artofasm.html). Особенно [** Арифметические операции **] (https: //courses.engr .illinois.edu/ece390/books/artofasm/CH06/CH06-2.html # HEADING2-1) и [** Sign and Zero Extension **] (https://courses.engr.illinois.edu/ece390/books /artofasm/CH01/CH01-2.html#HEADING2-151) –

ответ

0

Когда вы пишете

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

вы на самом деле только экономия младшее слово продукта между B и C. Он работает с числами, предоставленных, но это не является общим решением.

Вместо написания

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

использования mov ax,2 и не забудьте явно очистить регистр DX, так как деление нуждается.

Чтобы продолжить, я предлагаю вам создать переменную результата размера двойного слова, потому что в конце размер вашего наибольшего участника выражения определяет размер результата. Затем по пути переместите или добавьте свои частичные результаты в эту переменную.
Если вам разрешено использовать 32-битные регистры, подходящий подход может состоять в том, чтобы продвигать все значения до 32 бит и продолжать оттуда.

Смежные вопросы