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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2011, 16:53   #1
MaRtOvSkiI_KoT
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 16
Печаль Код ассемблера

Не могу понять как работает программа после ----------------------------------------
в первой части разобрался, а дальше как то не получается...




Код:
; Template for DOS .exe file

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

        ; code
cseg    segment
start:
	mov ax, dseg
	mov ds, ax
	mov es, ax  			
	
	
	mov di, offset mem

	mov si, 16		; в si будет лежать количество чисел
	mov	cx, si		; записываем количество шагов цикла
	
	mov ax, 32768
		
loopIn:	
	mov word ptr [di], ax	
	add di, 2	
	shr ax, 1
	loop loopIn	

	
	mov di, offset mem
	mov cx, si        			
loopOut:	
	mov ax, word ptr [di]	; заполняем ax последовательно из di 		
	call pOut	; выводим символ из ax
    add di, 2	;
	loop loopOut	


main@end: 	
	mov ah, 1
    int 21h
       										 ; exit to DOS
	mov	ax, 4C00h
	int	21h


;----------------------------------------------------------------------------------------------------------------------------
        
pOut:									; Подпрограма печатает число в AX
		pusha
		
		mov	di, offset strBuffer
    	mov cx, 5
    	mov bl, ' '           		
	
	pOut@cl:		
		mov [di], bl
		inc di
		loop pOut@cl
		
		std
	
	pOut@jmp:      
		xor     dx, dx     				; dx =0 чтобы избежать переполнения при делении на 10
        mov     cx, 10
        div     cx						; делим ax на cx - результат в ax,
										
        add     dx, '0'     				; преобразуем число в символьный вид
        xchg    ax, dx
        stosb               					; запоминаем в памяти по es:di
        xchg    ax, dx
        test    ax, ax      				; Пока не ноль преобразуем в десятичный вид
        jnz     pOut@jmp

		
		mov dx, di
        mov ah, 09h
        int 21h         				; Печать результата на экране
 		
 		popa
		ret
                
pIn:										; Ввод числа с клавиатуры
		xor bx, bx  				; зануляем. будем накапливать здесь число
		mov cx, 10  				; будем умножать на 10
	pIn@inp1: 		
		mov 	ah, 1					; Вводим  символ
		int 	21h     				; Результат в AL
		cmp 	al, 13  				; Сравниваем al c кодом ENTER 
		jz  	pIn@exit
		
		xchg    ax, bx 				; умножаем BX на 10, (аналог mul bx, 10)
		mul 	cx						; умножает ax на сx - результат в dx:ax
		xchg    ax, bx 				; Поместили резуьтат обратно в BX
		
		xor 	ah, ah					; Результат в AL, зануляем AH
		sub 	al, '0' 				; Переходим от ASCI кода цифры к числу
		add 	bx, ax  				; bX += AX
		jmp  	pIn@inp1
				
	pIn@exit:			
		mov ax, 3
		int 10h
		mov ax, bx  				; Результат принято возвращать в AX
		
		ret


cseg    ends


        ; data
dseg    segment byte

        strBuffer	db 6 dup (' ')
					db '$'
		mem 		db 100 dup (?)       
       

dseg    ends


        ; stack
sseg    segment stack

        db      100h    dup(?)

sseg    ends
end start
MaRtOvSkiI_KoT вне форума Ответить с цитированием
Старый 20.10.2011, 17:01   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от MaRtOvSkiI_KoT Посмотреть сообщение
Не могу понять как работает программа после ----------------------------------------
в первой части разобрался, а дальше как то не получается...




Код:
;----------------------------------------------------------------------------------------------------------------------------
        
pOut:									; Подпрограма печатает число в AX
		pusha
		
		mov	di, offset strBuffer
    	mov cx, 5
    	mov bl, ' '           		
	
	pOut@cl:		
		mov [di], bl
		inc di
		loop pOut@cl
===> В предыдущем коде strBuffer  заполняется пробелами, количество которых задано в регистре CX
		
		std
	
	pOut@jmp:      
		xor     dx, dx     				; dx =0 чтобы избежать переполнения при делении на 10
        mov     cx, 10
        div     cx						; делим ax на cx - результат в ax,
										
        add     dx, '0'     				; преобразуем число в символьный вид
        xchg    ax, dx
        stosb               					; запоминаем в памяти по es:di
        xchg    ax, dx
        test    ax, ax      				; Пока не ноль преобразуем в десятичный вид
        jnz     pOut@jmp

===> Здесь, в коде выше преобразует число в символьный вид
	
		mov dx, di
        mov ah, 09h
        int 21h         				; Печать результата на экране
 		
 		popa
		ret
                
pIn:										; Ввод числа с клавиатуры
		xor bx, bx  				; зануляем. будем накапливать здесь число
		mov cx, 10  				; будем умножать на 10
	pIn@inp1: 		
		mov 	ah, 1					; Вводим  символ
		int 	21h     				; Результат в AL
		cmp 	al, 13  				; Сравниваем al c кодом ENTER 
		jz  	pIn@exit
		
		xchg    ax, bx 				; умножаем BX на 10, (аналог mul bx, 10)
		mul 	cx						; умножает ax на сx - результат в dx:ax
		xchg    ax, bx 				; Поместили резуьтат обратно в BX
		
		xor 	ah, ah					; Результат в AL, зануляем AH
		sub 	al, '0' 				; Переходим от ASCI кода цифры к числу
		add 	bx, ax  				; bX += AX
		jmp  	pIn@inp1
			
====> Здесьпохожеобратная операция: введенные цифры числа (в символьном виде) преобразуются во внутреннее представление числа	

	pIn@exit:			
		mov ax, 3
		int 10h
		mov ax, bx  				; Результат принято возвращать в AX
===> Здесь что-то делается с экраном: либо он очищается,либьо еще что-то. Нужно смотреть описание прерывания  BIOS для экрана 10h функция 03. Я по памяти уже не помню, что эта функция прерывания экрана делает		
		ret


cseg    ends


        ; data
dseg    segment byte

        strBuffer	db 6 dup (' ')
					db '$'
		mem 		db 100 dup (?)       
       

dseg    ends


        ; stack
sseg    segment stack

        db      100h    dup(?)

sseg    ends
end start
Комментарии внутри вашего текста.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 20.10.2011, 17:16   #3
MaRtOvSkiI_KoT
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 16
По умолчанию

Классно, но хотелось бы подробнее, потому что не понятно для чего оно делается... в каждой строчке
MaRtOvSkiI_KoT вне форума Ответить с цитированием
Старый 20.10.2011, 17:25   #4
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от MaRtOvSkiI_KoT Посмотреть сообщение
Классно, но хотелось бы подробнее, потому что не понятно для чего оно делается... в каждой строчке
Вводится число с клавиатуры, записывается вдвоином виде,а затем обратно из двоичного вида записывается в символьном виде.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка ассемблера в Си Влодимир Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 18.02.2011 05:05
Основы ассемблера Maksim_27_10 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 08.07.2010 12:24
вставки из ассемблера макс07 Общие вопросы C/C++ 7 13.05.2008 19:19
Сравнение Си и Ассемблера... Sota Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 25.07.2007 16:15