Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2011, 00:22   #1
Nelson
 
Регистрация: 06.07.2011
Сообщений: 7
Восклицание условный переход на assembler

Помогите пожалуйста решить пример на Assembler(а то сам не могу никак осилить)
| a/b+1, если a>b
X= | a+25, если a=b
| (a*b-2)/a если a<b

я использую программу(emu8086)
По возможности результат вывести на экран
Изображения
Тип файла: jpg Клип_2.jpg (51.2 Кб, 142 просмотров)
Nelson вне форума Ответить с цитированием
Старый 02.12.2011, 02:28   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Вроде как код должен быть таким:
Код:
.486  
.model small 

assume  cs:cseg, ds:dseg, ss:sseg

sseg    segment stack 'STACK'
 db 256 dup(?)
sseg    ends

dseg    segment byte 'DATA'

 str_end db      13,     10,     '$' 
 A   db  0
 B   db  0
vvod_a db "vvedite A$"
vvod_b db "vvedite B$"

 buffer db 254,0,254 dup ('$')

dseg    ends
cseg    segment use16 'CODE'

;***************Главная процедура***************
start proc

  mov ax, dseg
  mov ds, ax

; установка текстового режима
  mov ah, 0 
  mov al, 3  
  int 10h  

; установка позиции курсора
  mov ah,2  
  mov bh,0 ; номер страницы
  mov dh,0 ; номер сторки  
  mov dl,0 ; номер позиции  
  int 10h


; ввод А
   mov dx, offset vvod_a
   call msg
   mov dx, offset a
   call InputStr
   call NextStr

; ввод Б
   mov dx, offset vvod_b
   call msg
   mov dx, offset b
   call InputStr
   call NextStr

; проверка на условие
mov DI,offset a
mov SI,offset b
cmp di,si
je a_ravno_b
jg a_bolshe_b

a_menshe_b:
	lea ax, a
	lea cx, b
	div cx ; деление. в cx запишется рез-т
	inc cx ; прибавим единицу
	mov dx, cx
	jmp vivod_x ; безусловный переход на метку

a_ravno_b:
	lea dx, a
	add dx,25 ; сложение. в dx запишется рез-т
	jmp vivod_x ; безусловный переход на метку

a_bolshe_b:
	lea ax, a
	lea dx, b
	mul dx ; умножение. в dx запишется рез-т
	sub dx, 2 ; вычитаем 2 из dx
	lea cx, a	
	div dx ; деление. в dx запишется рез-т
	jmp vivod_x ; безусловный переход на метку

vivod_x:
	call msg
	call InputStr
; завершение работы программы	
   mov ax, 4c00h 
   int 21h
  ret
start endp



;***************Процедура вывода сообщения***************
Msg proc
   mov ah,9
   int 21h 
   ret
Msg endp


;***************Процедура записи строки в dx***************
InputStr proc
   mov ah,0Ah
   int 21h
   ret
InputStr endp


;***************Процедура перехода на след. строку***************
NextStr proc
   push dx
   mov dx,offset str_end
   call Msg
   pop dx
   ret
NextStr endp

cseg    ends      
end    start
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 04.12.2011, 22:38   #3
Nelson
 
Регистрация: 06.07.2011
Сообщений: 7
По умолчанию

Спасибо за ответ.
Nelson вне форума Ответить с цитированием
Старый 04.12.2011, 22:39   #4
Nelson
 
Регистрация: 06.07.2011
Сообщений: 7
По умолчанию

Может кому и пригодится
Я решил эту программу в другом варианте
Код:
use16
org 100h

    mov al,[a];zanosim znachenie peremennoy [a] v registr AL     
    mov bl,[b];zanosim znachenie peremennoy [b] v registr BL

    cmp al,bl ;sravnenie operandov
    jg bolshe ;a>b
    jz ravno  ;a=b
    jl menshe ;a<b
  
bolshe:  
    div bl    ;AL = AL/BL = a/b (bez ostatka)
    inc al    ;AL = AL+1  = (a/b)+1
    mov [x],al;zanosim znachenie registr AL v peremennuy [x] 
jmp exit

ravno:	
    add al,25 ;AL = AL+25 = a+25
    mov [x],al;zanosim znachenie registr AL v peremennuy [x] 
jmp exit

menshe:
    imul bl    ;AL = AL*BL = a*b
    sub al,2   ;AL = AL-2  = a*b-2
    div [a]    ;AL = AL/[a]= (a*b-2)/a
    mov [x],al;zanosim znachenie registr AL v peremennuy [x] 
jmp exit

exit:
;vivod peremennoy [x] na ekran
    xor ax,ax
    mov al,[x]
    aam 
    add ax,3030h 
    mov dl,ah
    mov dh,al
    mov ah,02 
    int 21h 
    mov dl,dh 
    int 21h

;vixod iz programmi
    mov ax,4c00h
    int 21h 

;----------
a db 10
b db 5
x db ?
Nelson вне форума Ответить с цитированием
Старый 11.12.2011, 19:18   #5
DiMMa
Новичок
Джуниор
 
Регистрация: 11.12.2011
Сообщений: 2
По умолчанию

А у меня ошибки offset or pointer is 32-bit... Что делать?
DiMMa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Условный переход командой jnb. В чем смысл данного перехода? Ibanez Wizard Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 01.04.2011 04:41
условный переход if then else Rin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 05.05.2010 16:06
Условный переход в МК051 GMSD Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 18.11.2009 12:16
переход в реальный режим и обратно [Assembler] Айат Помощь студентам 8 11.04.2009 01:43
Условный оператор IF в Си Zid@ne Помощь студентам 7 24.12.2008 20:02