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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2010, 19:06   #1
Rymbil
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 38
По умолчанию

Напишите мне пожалуста программу чтоб складывала 2 числа и выводила на экран. У меня почему то символ выводится вместо ответа например число 3 это сердечко, а 2 это смайл
Вот мой код:

Код:
model small 
stack 256 
.data 
a db 0 
.code 
main: 
mov ax,@data 
mov ds,ax 
mov al,2 
add al,1 
mov a,al 
mov ah,9 
lea dx,a[+'$'] 
int 21h 
mov ah,7 
int 21h 
mov ax,4c00h 
int 21h 
end main
ЗЫ: Tasm

Что делаю не так?

Последний раз редактировалось Stilet; 22.01.2010 в 10:40.
Rymbil вне форума Ответить с цитированием
Старый 13.01.2010, 19:40   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

см вот эту тему http://programmersforum.ru/showthread.php?t=79701 мой ответ на твой вопрос там
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 14.01.2010, 04:31   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Rymbil
то что получится в результате вычисления и то что нужно выводить в файл или на экран -- две большие разницы, надеюсь что ты это понял
Цитата:
У меня почему то символ выводится вместо ответа например число 3 это сердечко, а 2 это смайл
для того чтобы на экран вывести число от 0 до 9 требуется выводить на экран символы с кодом от 30h до 39h в твоем случае
Код:
mov al,2 
add al,1 
add al,'0'
mov a,al
если требуется вывести на экран число от 10 до 255, то под результат нужно отвести три байта и в конце поставить символ доллара
Код:
.data 
a db 0,0,0,'$' 
.code 
...
	mov al,128 
	add al,41; AL=169=0A9h 
 	aam; делим число в AL на 10, частное окажется в AH, остаток в AL  AX=1009h
	add al,'0'
	mov [a+2],al
	shr ax,8; AX=0010h
	aam; AX=0106h
	xchg ah,al; меняем содержимое в AL и AH местами
	add ax,3030h; корректируем перед выводом на экран
	mov a,ax; передаем результат в переменную
код lea dx,a[+'$'] полностью не верный нужно или в data писать a db 0,'$' или если требуется писать в коде mov byte ptr [a+1],'$'
если адрес переменной [a] равен 64h, то команда lea dx,a[+'$'] поместит в DX число 88h (64h+24h=88h код '$'=24h)

Последний раз редактировалось Mikl___; 14.01.2010 в 05:05.
Mikl___ вне форума Ответить с цитированием
Старый 14.01.2010, 15:47   #4
Rymbil
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 38
По умолчанию

Типа работает ответ не больше 9 должен быть, и ответ выводится не в верхнем левом углу

Код:
model small 
stack 256 
.data 
a db 0 
.code 
main: 
mov ax,@data 
mov ds,ax 
mov al,5 
add al,4
add al,'0'
mov a,al 
mov ah,9 
lea dx,a[+'$']
int 21h 
mov ah,7 
int 21h 
mov ax,4c00h 
int 21h 
end main
Если без lea dx,a[+'$'] то после ответа выводит много мусора и пищит

Последний раз редактировалось Stilet; 22.01.2010 в 10:46.
Rymbil вне форума Ответить с цитированием
Старый 14.01.2010, 16:30   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

не ты издеваешься?
Ладно пишу еще раз
Код:
;процедура ввода	
input proc near
	xor ax,ax
	xor dx,dx
	xor bx,bx
	xor di,di
	mov ah,0ah
	mov dx,offset buff ; адрес буфера
	int 21h 
	
;перевести строку
	mov dl,0ah
	mov ah,02h
	int 21h 
	
; обрабатываем содержимое буфера
	mov si,offset buff+2 ;адрес начала строки
start:
	cmp byte ptr[si]," "
	je _prop
	cmp byte ptr [si],"-" ; если первый символ минус
	jnz _poloz	;в противном случае перейти на обработку положительных
	mov di,1  ; устанавливаем флаг
_prop:
	inc si    ; переходим на следующее
	jmp start
_poloz:
	xor ax,ax
	mov bx,10  ; основание системы счисления
_perevod:
	mov cl,[si] ; берем символ из буфера
	cmp cl,0dh  ; проверям равен ли символ переводу строки
	jz _endin	;перейти на конец обработки
	
; если символ не последний, то проверяем его на правильность
	cmp cl,30h  ; если введен неверный символ <0
    	jl _err	
    	cmp cl,39h  ; если введен неверный символ >9
    	ja _err

	sub cl,30h ; делаем из символа число 
	mul bx     ; умножаем на 10
	jc _err
	add ax,cx  ; прибавляем к остальным
	jc _err
	inc si     ; переходим на следующее число

	cmp di,1
	je srav_32768
	cmp ax,32767
	ja _err
	jmp _perevod	; повторяем
srav_32768:
	cmp ax,32768
	ja _err	
	
	jmp _perevod	; повторяем


; если была ошибка, то выводим сообщение об этом и выходим
_err:
	mov dx, offset error
	mov ah,09
	int 21h
	int 20h

; все символы из буфера обработаны число находится в ax
_endin:
	
	cmp di,1 ; если установлен флаг, то
	jnz _endp
	neg ax   ; делаем число отрицательным
	
_endp:	
	ret
endp input

;====================================================================
;процедура вывода
output proc near  
;; Проверяем число на знак.
        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
	ret
endp output
вызывается командой call, то что ввели или вывели на ax
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 14.01.2010, 16:55   #6
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию

Цитата:
Сообщение от Rymbil Посмотреть сообщение
Типа работает ответ не больше 9 должен быть, и ответ выводится не в верхнем левом углу
Так понимаю тебе нужно выводить результат именно вверхнем левом углу....тогда тебе нужно переключиться в графический режим или проще всего
прописать положения курсора
mov ah,2
mov dh,? <----столбец
mov dl,? <---- строка ;положения курсора
mov bh,0
int 10h
Doholyan вне форума Ответить с цитированием
Старый 14.01.2010, 19:46   #7
Rymbil
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 38
По умолчанию

Спасибо всем, все работает!
Rymbil вне форума Ответить с цитированием
Старый 22.01.2010, 10:24   #8
Billy Spleen
Пользователь
 
Регистрация: 22.01.2010
Сообщений: 11
По умолчанию

Проверил все работает

model small
stack 256
.data
a db 0
.code
main:
mov ax,@data
mov ds,ax
mov al, a
add al,1
mov ah, 2h
mov dl, al
add dl, 30h
int 21h
mov ah, 1h
int 21h
mov ax,4c00h
int 21h
end main

Последний раз редактировалось Stilet; 22.01.2010 в 10:47.
Billy Spleen вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Add у TStringList FaTaL Общие вопросы Delphi 7 21.09.2014 09:59
SQL.add Grom48 БД в Delphi 2 13.12.2009 16:42
Проблема с LogList.Add mellon Помощь студентам 0 08.12.2009 21:17
add project lalilulelo Помощь студентам 3 26.05.2009 10:18
В чем разнича Add и text plato БД в Delphi 1 30.01.2009 13:49