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

Ваш аккаунт

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

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

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

получение значений переменных из командной строки (assembler)

26K
28 апреля 2008 года
metal_anton
27 / / 20.04.2008
в ассемблере почти ничего не шарю и вот задача стоит надо ввести с командной строки 4 переменные и их значения в любом порядке и вычислить по формуле, написал процедуры перевода из 10 в 16 с.с., вычисления по формуле осталось тока разработать процедуру для работы с цепочкой, что бы взять вот из этой строки с:\lab21.exe /a=3/b=4/c=5/d=2 значения переменных и присвоить своим переменным и передать эти переменные в функцию вычисления помогите вот код(плоховат но как умею))))
Код:
model small
.stack 100h
.data
    buf db 10, ?, 5 dup(' ')
    outbuf db 3 dup(30h)
    ten db ?
    result dw 0
    virable_a db 0
    virable_b db 0
    virable_c db 0
    virable_d db 0
    soxr_rez db 0
    ; неверный формат данных
    message db 0ah,0dh,"*ҐўҐа*л© д®а¬ в ¤ **ле","$"
    ; введите значение переменных
    message_1 db 0ah,0dh,"ўўҐ¤ЁвҐ §* зҐ*Ёп ЇҐаҐ¬Ґ**ле ¤«п д®а¬г«л (Ђ+B)*C/D ў д®а¬ ⥠a=<§* зҐ*ЁҐ>/b=<§* зҐ*ЁҐ>/c=<§* зҐ*ЁҐ>/d=<§* зҐ*ЁҐ>,ЇаЁзс¬ Ї®б«Ґ¤®ў ⥫м*®бвм  ўў®¤  ¬®¦Ґв Ўлвм «оЎ®©","$"
    ; деление на ноль
    message_2 db 0ah,0dh,"¤Ґ«Ґ*ЁҐ *  *®«м","$"
    ; результат равен
    message_3 db 0ah,0dh,"१г«мв в а ўҐ* =  ","$"

.code

begin:
    mov ax,@data ; связываем регистр DX с сегментом
    mov ds,ax    ; данных через регистр AX


jmp main


;************************************
;процедура сдвига переход  коретки
;************************************
shift proc
        mov dl,10
        mov ah,2
        int 21h
ret
shift endp
;*******************************************************
;процедура вывода на экран переменной, которую в данный
;момент требуется ввести    
;*******************************************************
Read proc        
      mov ah,2   ;выбор прерывания на вывод символа
      int 21h    ;прерывание
      mov dl,'=' ;заносим байтовый регистр dl значение символа '='
      mov ah,2
      int 21h
      call ReadLN ;переход с возвратотм к функции ввода числа
      call shift
      ret        
Read endp
;****************************************
; вывод сообщения если  не  верный формат данных
; переход к приглашению ввести всё по новой
;****************************************

error_message proc
  mov ah,09h
  lea dx,message
  int 21h
  jmp main
  ret
error_message endp
 ;*************************************
 ;;функция ввода числа
 ;*************************************  
ReadLN proc      
  mov ten,10     ;делитель для преобразования строки в число
  lea dx,buf     ;заносим адрес буфера под число в ax
  mov al,0ah     ;вызываемая DOS-овская процедура после очистки буфера ввода
  mov ah,0ch     ;выбор прерывания отчистки буфера ввода
  int 21h        ;вызов прерывания
  mov si,1      
  mov al,buf[si] ;занесение в АL количества введенных символов
  mov cl,al      ;установка счетчика цикла
  mov ch,0       ;обнуляем верхний байт счетчика
  mov ax,0       ;обнуляем AX
  jcxz ml2        ;переход "если CX = 0"
asd:
  mul ten        ;умножение содержимого AX на 10
  inc si         ;инкремента модификатора SI
  mov dl,buf[si] ;записываем значение символа из буфера в DL
  sub dl,30h     ;вычитаем из него значение нуля, получаем цифру
  add al,dl      ;прибавляем цифру к АL (результат преобразования)
  jc error_message       ;в случае переноса - ошибка и выход и программы
 loop asd       ;цикл
  mov soxr_rez,al ; временное сохранение рузультата в регистре АL
   
ml2:
  ret            ;возвращение из подпрограммы
ReadLN endp
;******************************
; процедура выхода по ошибке
;******************************
error proc          ;метка ошибки - вызывает прерывание завершения программы  
  mov al,1       ;с кодом ошибки 1
  mov ah,4ch
  int 21h
  ret
error endp

;*******************************************
;деление на ноль выход и программы процедура
;********************************************
error_message1 proc
    mov ah,09h
    lea dx,message_2
    int 21h
   jmp error
   ret
 error_message1 endp  
 ;***************************
 ;процедура вычисления
 ;***************************
Calculation_main proc
  cmp virable_d,0; если D = 0 то ошибка  выйдим из программы
  int 21h
  jz error_message1      ;собственно переход к ошибке и выход из проргаммы
 
  ; первым действием надо  сложить А и В и записать результат в BX
  mov al, virable_a ;заносим в AL переменную А
  add al, virable_b
  jnc m1 ; переход если нет  переполнения
  mov ah,0
  adc ah,0
jmp r1            ; переход дальше для вычисления
  m1:
  mov ah,0  
r1:
  div virable_d
  mov ah,0
  mov bl,al
  xor ax,ax
  mov al,bl
  mul virable_c  
  mov  result,ax
  ret            ;возврат
Calculation_main endp
;********************************************
; процедура вывода числа
;(перевод  в 10 и вывод на экран)
;********************************************
WriteLN Proc ;AX -  выводимое число
 mov ah,09h
 lea dx,message_3
 int 21h
xor ax,ax
mov ax,result
xor cx,cx
mov bx,10
x:
xor dx,dx
div bx
add dl,'0'
push dx
inc cx
cmp ax,0
jne x
x2:
pop dx
mov ah,2
int 21h
loop x2
ret
WriteLN EndP
;*************************************************
;главная процедура с которой начинаем работу
; она сразу же начинает своё выполнение
;*************************************************
main proc
  mov ah,09h
  lea dx,message_1
  int 21h
  call shift
   
  mov al,0           ;прерывание завершения
  mov ah,4ch
  int 21h  
  ret  
main endp
end begin
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог