Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C = A + B*2

65K
12 декабря 2010 года
sotyear
1 / / 12.12.2010
Здравствуйте, есть следующая задача, почти решённая, но для начала сообщу её условия:

[FONT="Book Antiqua"][SIZE="1"]Пользователь вводит два числа А и В в десятичном виде. Программа должна:
1. Посчитать С=А+В*2.
2. Если третий бит числа С установлен, то вывести на экран С в двоичном виде, в противном случае, вывести на экран С/2 в двоичном виде.
3. Написать макрос для вывода результата
4. Написать процедуру для ввода чисел
5. Написать макрос для расчета
6. Передача параметров через стек
7. Используйте стандартные директивы сегментации и формат сом-программы. [/SIZE][/FONT]

Вот возникли следующие проблемы:
1. Не могу сделать передачу параметров через стек. Прошу помочь с этим.
2. При попытке создания сом-программы выдается ошибка Cannot generate COM file: data below initial CS:IP defined. Что это значит? В чем проблема, как исправить?
3. собственно, если знающие люди видят еще какую-то ошибку в программе, помогите и с ней.

Код:
numout macro c
mov bx,c
    xor ax,ax

        mov ah,9h
    mov dx,offset messageC
    int 21h

    mov cl,10h
m1:
    sal bx,1
    jc m2
   
    mov ah,9h
    mov dx,offset message0
    int 21h
    jmp m3
m2:
    mov ah,9h
    mov dx,offset message1
    int 21h
m3:
    loop m1
   
endm

count macro a,b
        xor bx,bx

        mov al,b
        mov bl,2
        mul bl
       
        mov bl,a

        add ax,bx


        mov c,ax
endm

CSEG segment 'Code'
assume cs:CSEG,ds:CSEG,es:CSEG,ss:CSEG
org 100h

numin proc

        mov ah,1
    int 21h

   

    sub al,30h

    mov bl,al

    shl bl,3
    shl al,1
    add bl,al  

        int 21h

    sub al,30h
   
    add bl,al
   

    mov [bp+4],bl

ret
endp


main:

    mov ah,9
    mov dx,offset messageA
    int 21h


    xor ax,ax
;-------------Ввод A-------------------------

  call numin    ;addres
  mov bl,[bp+4]
  mov a,bl
;---------------Ввод B-------------------
    xor ax,ax
    mov ah,9
    mov dx,offset messageB
    int 21h

  call numin
  mov bl,[bp+4]
  mov b,bl
 
;---------------C=A+B*2
count a,b
;----------------Проверка 3 бита
       and ax,1000b  
        cmp ax,0h
        jne  gotoc
         
          mov ax,c
          mov bl,2
          div bl
          mov c,ax
       
        gotoc:
;--------------Вывод С
numout c   
   
;-----------------------Выход из СОМ-программы
    int 20h

;-----------------------Данные   
messageA db 'A= $'
messageB db 10,13,'B= $';10 - ASCII-код перехода на новую строку,13-ASCII-код возврата каретки
messageC db 10,13,'C=A+B*2= $'

message1 db '1$'
message0 db '0$'

a db 0
b db 0
c dw 0
;-----------------------
endp

end main
7
12 декабря 2010 года
@pixo $oft
3.4K / / 20.09.2006
0.Вроде бы эта тема уже была
1.Что именно не получается?Параметры в стек укладываются инструкцией [FONT="Courier New"]Push <Param>[/FONT],ложить можно только двойные/слова,байты–нет,НЯП
В подпрограмме параметры берутся по адресу [FONT="Courier New"][ESP+4+…][/FONT],где «…»–смещение i-го параметра от вершины стека(вернее,от адреса возврата–поэтому и +4).Смещения считайте сами.Если все параметры одного размера(слова,например),адрес будет вида [FONT="Courier New"][ESP+4+i*N][/FONT],где N–номер параметра
И вообще,то,что я сейчас изложил,в любой книге по ассемблеру
2.Вы текст переводили?Описание искали?Пробовали исправить?Вот если не получилось,то описываете свои действия,а уж мы поможем
3.Что-то влом,я концерт смотрю:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог