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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2010, 13:24   #1
SickUSP
Новичок
Джуниор
 
Регистрация: 28.01.2010
Сообщений: 10
По умолчанию Разные программы для студентов по Ассемблеру

1.Вычислить значение выражения(5684/4+357/3+245/5)*3. Полученый Результат записать в регистр СХ.


Код:
.model tiny
.data
.code
org 100h
main:
; Разделим выражение на 3 подвыражения:
;5684/4
MOV DX,0 ;Для деления используется пара из DX:AX
MOV AX,5684
MOV CX,4 ;В качестве делителя выступает регистр CX
DIV CX ;Делим.
PUSH AX ;Результат сохраним в стеке.
;357/3
MOV DX,0
MOV AX,357
MOV CX,3
DIV CX
PUSH AX
;245/5
MOV DX,0
MOV AX,245
MOV CX,5
DIV CX
; Суммируем результаты подвыражений.
POP DX ; выталкиваем последний результат из стека( в стеке всего 2 результата.
; Последний результат остался в регистре AX.
ADD AX,DX ; суммируем последний результат с предыдущим.
POP DX ; выталкиваем следующий(последний) результат подвыражения
ADD AX,DX ; и суммируем с общей суммой
;MOV DX
MOV DX,0
MOV CX,3 ; в качестве множителя выступит CX.
MUL CX ; умножаем
MOV CX,AX ; помещаем результат всех вычислений в CX
output proc near
	push cx
;; Проверяем число на знак.
        test    ax, ax
        jns     @oi1

;; Если оно отрицательное, выведем минус и оставим его модуль.
	  push ax
        mov     ah, 02h
        mov     dl, '-'
        int     21h
        pop ax
        neg ax
        
;; Количество цифр будем держать в CX.
@oi1:  
        xor     cx, cx
        mov     bx, 10
@oi2:   
       ;cwd
       xor dx,dx
       div bx
; Делим число на десять. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
        push    dx
        inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
        test    ax, ax
        jnz     @oi2
; Теперь приступим к выводу.
        mov     ah, 02h
@oi3:   pop     dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
        add     dl, 30h
        int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
        loop    @oi3
     	pop cx
	mov dx," "
	mov ah,02h
	int 21h
	ret
endp output

end main

2.Найти максимальный элемент матрицы.

Код:
.model tiny; нужно будет получить исполняемый файл формата СОМ
.code
org 100h
start:
   mov ax, 3
   int 10h	; устанавливаем текстовый режим
   
   lea dx, srcArray
   mov ah, 9
   int 21h
   
   cld  	; буду использовать строковые инструкции
   	; установим флаг направления
   mov cx, arsize
   lea si, ar
@@_next:
    lodsw
    CALL writeWordDEC_signed
    mov al, ' '
    int 29h
    int 29h
LOOP @@_next   
    ; определение минимального и максимального
    lea si, ar
    lodsw

    mov max_el, ax
 
    mov cx, arsize      
@@_analize_next:
      lodsw

      jge @@10

@@10:
      cmp ax, max_el
      jle @@20
      mov max_el, ax
@@20:
LOOP @@_analize_next
  mov ah, 9
  int 21h
  CALL writeWordDEC_signed
  lea dx, maxElem
  mov ah, 9
  int 21h
  mov ax, max_el
  CALL writeWordDEC_signed
  lea dx, PressKey
  mov ah,9
  int 21h
  xor ax, ax
  int 16h

  int 20h
  
; две подпрограммы для вывода чисел на экран  
  writeWordDEC proc near
; вывод на экран слова в AX, воспринимается как беззнаковое
 push ax
 push bx
 push dx
 push cx
   mov bx, 10
   xor cx, cx
@@1:
   xor dx, dx
   div  bx
   push dx
   inc cx
   or ax, ax
   jnz @@1
 @@2:
   pop ax
   add al, '0'
   int 29h	; это прерывание умеет делать только одно -
   		; выводить символ в AL на экран
   LOOP @@2    
 pop  cx
 pop  dx
 pop  bx
 pop  ax
 ret
writeWordDEC endp
WriteWordDEC_signed proc
; вывод на экран слова в AX как знакового
; просто, если отрицательное, выводит минус, превращает в
; положительное и вызывает подпрограмму writeWordDEC
 or ax, ax
 jns @@_no_sign 
   push ax
   mov al, '-'
   int 29h
   pop ax
   neg ax ; изменение знака на +
@@_no_sign:
 CALL writeWordDEC     
 ret
WriteWordDEC_signed endp 
PressKey db 13,10,10,'Press any key ...$'
srcArray db 'ucxogHblu MaccuB:',13,10,'$'
maxElem  db 13,10,'MAX: $'
ar       dw 12, 23, -3, 4, 0, 7, 40	; сюда просто добавляйте числа, если хотите
arsize   equ ($ - ar)/2  	; так определяется констата = размер массива в словах (число элементов)
max_el   dw  ?		
end start

Последний раз редактировалось Stilet; 29.01.2010 в 13:45.
SickUSP вне форума Ответить с цитированием
Старый 29.01.2010, 13:25   #2
SickUSP
Новичок
Джуниор
 
Регистрация: 28.01.2010
Сообщений: 10
По умолчанию Готовые разные программы 2.

3.Найти сумму массива.
Код:
data segment   
mas db 12, 2, 7, 3, 2, 0, 21, 9, 0, 16   ;исходный массив
len dw $-mas  ;размер массива в байтах
data ends   
               
code segment   
start:   
assume cs:code, ds: data       
mov ax, data   
mov ds, ax   
lea bx, mas  ;берём в bx адрес первого элемента
mov cx, len  ;счетчик цикла
xor ax, ax   
cikl:   add al, [bx]  ;прибавляем к al байт, адрес которого хранится в bx
inc bx  ;переходим к следующему элементу
loop cikl   
aam  ;преобразуем сумму в BCD-код
add ax, 3030h  ;затем в ASCII-код
mov bx, ax  ;и выводим
mov ah, 02   
mov dl, bh   
int 21h   
mov dl, bl   
int 21h   
mov ax, 4c00h   
int 21h   
code ends   
end start
4.Транспонирование матрицы.
Код:
model small
.data
Rows    equ     4
Columns equ     4
m       dw      Rows
n       dw      Columns
mas     db      00h, 01h, 02h, 03h
        db      04h, 05h, 06h, 07h
        db      08h, 09h, 0ah, 0bh
        db      0ch, 0dh, 0eh, 0fh
s_mas=$-mas
_mas    db      s_mas dup (?)
temp    db      0
asCR_LF  db     0dh, 0ah, '$'
asHex    db     '00 ', '$'
HexTabl  db     '0123456789123456'
asTitle1 db     'ucXogHa9 MaTpuLLa', '$'
asTitle2 db     'TpaHcnoHupoBaHHa9 MaTpuLLa', '$'
.stack  256
.486
.code
ShowHex PROC FAR
        pusha
        mov     di, OFFSET asHex
        mov     cx, ax
        and     ax, 000fh
        mov     bx, OFFSET HexTabl
        xlat
        mov     [di+1], al
        mov     ax, cx
        and     ax, 00f0h
        mov     cl, 4
        shr     ax, cl
        xlat
        mov     [di], al
        mov     ah, 09h
        mov     dx, OFFSET asHex
        int     21h
        popa
        ret
ShowHex ENDP
ShowMatrix PROC FAR
        pusha
        mov     si, 0  ; строка
        mov     di, 0  ; столбец
        mov     cx, dx
@@ShowRow:
        mov     dx, 0
        mov     ax, n
        mul     si
        mov     bx, ax
        add     bx, cx
        mov     ah, 0
        mov     al, [bx+di]
        call    ShowHex
        inc     di
        cmp     di, n
        jb      @@ShowRow
        mov     dx, OFFSET asCR_LF
        mov     ah, 09h
        int     21h
        mov     di, 0
        inc     si
        cmp     si, m
        jb      @@ShowRow
        popa
        ret
ShowMatrix ENDP
main:
        mov     dx,@data
        mov     ds,dx
        mov     ah, 09h
        mov     dx, OFFSET asTitle1
        int     21h
        mov     ah, 09h
        mov     dx, OFFSET asCR_LF
        int     21h
        mov     dx, OFFSET mas
        call    ShowMatrix
        xor     ecx,ecx
        mov     cx,m
        xor     si,si
m1:
        push    cx
        mov     cx,n
        xor     di,di
m2:
        mov     ax,n
        mul     si
        add     ax,di
        mov     bx,ax
        mov     al,mas[bx]
        mov     temp,al
        mov     ax,m
        mul     di
        add     ax,si
        mov     bx,ax
        mov     al,temp
        mov     _mas[bx],al
        inc     di
        loop    m2
        inc     si
        pop     cx
        loop    m1
    mov ax, m
    xchg    ax, n
    mov m, ax
        mov     ah, 09h
        mov     dx, OFFSET asTitle2
        int     21h
        mov     ah, 09h
        mov     dx, OFFSET asCR_LF
        int     21h
        mov     dx, OFFSET _mas
        call    ShowMatrix
        mov     ax,4c00h
        int     21h
end     main

Последний раз редактировалось Stilet; 29.01.2010 в 13:44.
SickUSP вне форума Ответить с цитированием
Старый 30.01.2010, 16:49   #3
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Код:
DIV CX
По черному завидую.
Levsha100 вне форума Ответить с цитированием
Старый 30.01.2010, 17:35   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

гггг знакомый код
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 30.01.2010, 19:04   #5
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

По моему все задачи решены верно. Sparky какая разница чей это код?! главное чтобы верно и пригодились студентам. Тема была бы полезна прикрепленной в разделе Ассемблер.

Я вот тут тоже решил немного выложить задач:

Транспонировать битовую матрицу использую операторы сдвига
Код:
.model small
.stack 100h
.data
mes1	db	10,13,"Vvedite elementy matricy(8 elem)!!$"
mes2	db	10,13,"$"
mas	db	8	dup(0)
mas_tr	db	8	dup(0)
.code
begin:
	mov ax,@data			;перемещаем сегмент данных в ах
	mov ds,ax			;перемещаем сегмент данных в dx 
	lea dx,mes1			;в dx адрес mes1 
	mov ah,9h			;вывод строкм mas1 	
	int 21h	
	xor bx,bx
	mov cx,8
again:					;ввод массива
	mov ah,1
	int 21h
	sub al,'0'
	mov mas[bx],al
	inc bx
	loop again			;повторение цикла again, пока сх не = 0
	lea dx,mes2			;адрес mes2 в dX
	mov ah,9
	int 21h
	mov cx,8
	xor bx,bx
	xor dh,dh
output:					; вывод матрицы
	mov dl,mas[bx]
	add dx,30h
	mov ah,2
	int 21h
	inc bx
	loop output
	mov cx,8
	lea di,mas_tr
repeat:					;транспонирование
	push cx		
	mov cx,8
	lea si,mas
rep1:
	rol BYTE PTR[si],1
	rcl al,1
	inc si
	loop rep1
	pop cx
	mov [di],al
	inc di
	loop repeat
	
exit:
	mov ah,4с00h
	int 21h			
end begin
Ввести 2 строки и сравнить их
Код:
.model small
.stack 100h
.data
msg1 db 0Ah,0Dh,"Enter first string",0Ah,0Dh,'$'
msg2 db 0Ah,0Dh,"Enter second string",0Ah,0Dh,'$'
msg4 db 0Ah,0Dh,"equal strings",0Ah,0Dh,'$'
msg5 db 0Ah,0Dh,"str1>str2",0Ah,0Dh,'$'
msg6 db 0Ah,0Dh,"str1<str2",0Ah,0Dh,'$'
str1 db 80 dup(0)
str2 db 80 dup(0)
.code
start:
	push @data
	pop ds
	mov ah , 09h
	mov dx,offset msg1
	int 21h
	xor si,si
	xor di,di
	mov cx,80
enter_str1:
	mov ah,01h
	int 21h
	cmp al,0Dh
	je continue_str2
	mov str1[si],al
	inc si
	loop enter_str1
continue_str2:
	mov cx,80
	mov str1[si],'$'
	mov ah,09h
	lea dx,msg2
	int 21h
	xor di,di
enter_str2:
	mov ah,01h
	int 21h
	cmp al,0Dh
	je continue
	mov str2[di],al
	inc di
	loop enter_str2
continue:
	mov cx,80
	mov str2[di],'$'
	xor di,di

	call my_proc 

	mov ah,09h
	int 21h
	mov ax,04C00h
	int 21h
	
my_proc proc
	xor di,di	
comparable:
	mov al,str1[di]
	cmp al,str2[di]
	jl large_str2
	jg large_str1
	inc di
	loop comparable
	lea dx,msg4
	ret
large_str1:
	lea dx,msg5
	ret
large_str2:
	mov ah,09h
	lea dx,msg6
	ret
my_proc endp
end start
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 30.01.2010, 19:12   #6
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Ввести с клавиатуры строку. Переставить в ней символы, поменяв местами первый с последним, второй с предпоследним и т.д. Вывести результаты на экран

Код:
.186
stacksg segment stack
 dw 100h dup(?)
stacksg ends
data segment
 text1 db 'Stroka Input',0ah,0dh,'$';Текстовое сообщение для ввода
 t1  db 60    ;t1, t2, source необходимы для функции DOS 0ah int 21h
 t2  db ?
 source db 60 dup(' ')
 newstr db 0ah,0dh,'$' ;Переход на следующую строку
data ends
 assume cs:code,ds:data
code segment
begin:
 ;Инициализация сегмента ds
 mov ax,data
 mov ds,ax
 ;Устанавливаем текстовый режим
 mov ax,03h
 int 10h
 ;Ввод приглашения
 mov ah,09
 mov dx,offset text1
 int 21h
 ;Ввод строки до 59 символов
 mov ah,0ah
 mov dx,offset t1
 int 21h

;Обработка строки
 xor ax,ax
 mov al,t2 ;Колличество введеных строк
 push ax
 shr ax,1 ; делим на 2

 mov cx,ax ; и заносим в cx
 mov si,offset source ;Начало введеной строки в si
 mov di,offset source ; и в di
 
 pop ax
 push ax ;Сохраним в стеке значение кол-во введеных строк
 push si ; и начальный адрес строки source
 dec al
 add di,ax ;Установим di на конец введеной строки
 
 ;Отсюда идет обмен символами в строке
 @B0:   ; начало строки обмениваем с символами с концом строки
 mov al,[si]
 mov ah,[di]
 mov [di],al
 mov [si],ah
 inc si  ;После обмена изменяем значение адреса начала
 dec di  ; и конца строки (сближаем их)
 dec cx  ;Уменьшаем значение счетчика
 jne @B0 ;Если значение 0 то выходим
 
 pop si ;Востанавливаем значения из стека
 pop ax
 add si,ax ;Определяем адрес конца строки
 mov al,'$' ; и заносим символ $
 mov [si],al
 ;Переход на новую строку
 mov ah,09
 mov dx,offset newstr
 int 21h
 ;Вывод полученой строки
 mov ah,09
 mov dx,offset source
 int 21h
 ;Ждем нажатия любой клавиши
 mov ah,0
 int 16h
 ;Выход в DOS
 mov ah,4ch
 int 21h
code ends
 end begin
и еще инвертирование строки...

Код:
.MODEL SMALL
.STACK 256
.DATA
stroka db '0123456789','$'
.CODE
start:
     mov ax, @Data
     mov ds, ax
     xor ax, ax
     mov cx, 5
     lea bx, stroka
     lea si, stroka
     add si, 9
m1:
     mov al,[bx]
     mov ah,[si]
     mov [si],al
     mov [bx],ah
     inc bx 
     dec si
     dec cx
     jnz m1
     mov ah,09h
     lea dx,stroka 
     int 21h

     mov ah,4ch
     int 21h
END start
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ещё одна прога для студентов, тестирование с помощью программы ADSoft Tester - взлом пароля rpy3uH Софт 70 23.12.2021 21:47
Немного исходников решений студенческих задач merax Общие вопросы C/C++ 4 15.01.2010 16:48
Пишу программы на заказ для студентов NeshSoft Фриланс 6 16.02.2009 12:36