Консультация № 143744
12.09.2008, 16:11
0.00 руб.
0 3 2
Здравстуйте, уважаемые эксперты!
Сегодня меня поздравили с днем программиста. А я не в состоянии написать на Ассемблере программу: сложить два числа и результат вывести на экран.
Передо мной лежат две книги по Ассемблеру (Калашникова и Галисеева). Там много чего есть, в том числе и примеры на арифметические действия, только вывод на экран результата не дается. А я без этого не могу двинутся дальше. У меня на компьютере MASM611 с сайта Калашникова.
С уважением, Анатолий.

Обсуждение

давно
Старший Модератор
31795
6196
12.09.2008, 16:21
общий
Вам в каком виде нужно выводить информацию: строкой или число из регистра.
Лучше покажите Ваш код, подскажем где ошибки.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
12.09.2008, 17:19
общий
это ответ
Здравствуйте, Швецов Анатолий Прокофьевич!

В приложении программа, которая вводит 3-и числа и считает функцию X*Y+Z, после этого выводится результат.
Думаю она будет Вам полезна. Число выводится из регистра.
Удачи!

Приложение:
;tasm prog
;tlink prog /t
;MASM;IDEAL or MASM
.MODEL tiny
.186
.CODE;SEG
org 100h
start:
;перходим в 3-ий режим и чистим экран
mov ax,3
int 10h
;коэфициент, для деления и умножения
mov si,10
;вводим X
call isEnter
;запоминаем в стеке
push di
;вводим Y
call isEnter
;извлекаем из стека число в АХ
pop ax
;умножаем AX(X) и DI(Y)
xor dx,dx
mul di
;запоминаем в стеке результат
push ax
;вводим Z
call isEnter
;извлекаем из стека AX(X)*DI(Y)
pop ax
;добавляем
add ax,di
;будем выводить 5-раз
mov cx,5
;запоминаем в стеке число и счетчик цикла
outLoop: push cx
push ax
;выводим сообщение
mov ah,9
mov dx,offset dbResult
int 21h
;востанавливаем и снова запоминаем число
pop ax
push ax
;сбрасываем счетчик цифр
xor cx,cx
;делим на 10
isDiv: xor dx,dx
div si
;запоминаем в стеке остаток от деления и считаем кол-во цифр в числе
push dx
inc cx
;повторяем пока не достигли 0
or ax,ax
jnz isDiv
;извлекаем из стека цифры в нужном порядке
isOut: pop ax
;переводим цифру в символ и выводим на экран в цикле
or al,30h
int 29h
loop isOut
;востанавливаем число и счетчик цикла
pop ax
pop cx
loop outLoop
;ожидание клавиши
xor ax,ax
int 16h
ret
;
dbResult db 13,10,'Result:$'
dbEnter db 13,10,'Enter '
dbVal db 'W:$'
;изменяем переменную
isEnter: inc byte ptr[dbVal]
;выводим сообщение
mov ah,09
mov dx,offset dbEnter
int 21h
;в этом регистре будет накапливатся число
xor di,di
;вводим без эхо
noNumber: xor ax,ax
int 16h
;если ENTER -ввод числа закончен
cmp al,13
jz isStop
;все что не цифры игнорируем
cmp al,'0'
jb noNumber
cmp al,'9'
ja noNumber
;выводим цифру
int 29h
;преобразовываем в число
and ax,0fh
;меняем местами рание и только введенное число
xchg ax,di
;умножаем рание введенное на 10
xor dx,dx
mul si
;суммируем
add di,ax
jmp short noNumber
;выход из п\п
isStop: ret
end start
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
13.09.2008, 23:03
общий
это ответ
Здравствуйте, Швецов Анатолий Прокофьевич!

Пример подпрограммы вывода на экран целого числа.

Приложение:

LOCALS

data SEGMENT

data ENDS


ASSUME cs:code, ds:data, ss:stk

.186

code SEGMENT
entry_point:
mov ax,SEG data
mov ds,ax

mov ax,0003h ;текстовый видеорежим 80x25
INT 10h

;беззнаковый целочисленный тип
;0000h = 0
push 0 ;Y
push 0 ;X
push 0 ;signed_flag
push 0000h ;word_value
call PrintWord ;(word_value:WORD, signed_flag:BYTE, X:BYTE, Y:BYTE)

;беззнаковый целочисленный тип
;0FFFFh = 65535
push 0 ;Y
push 10 ;X
push 0 ;signed_flag
push 0FFFFh ;word_value
call PrintWord ;(word_value:WORD, signed_flag:BYTE, X:BYTE, Y:BYTE)


;знаковый целочисленный тип
;8000h = -32768
push 1 ;Y
push 0 ;X
push 1 ;signed_flag
push 8000h ;word_value
call PrintWord ;(word_value:WORD, signed_flag:BYTE, X:BYTE, Y:BYTE)

;знаковый целочисленный тип
;7FFFh = 32767
push 1 ;Y
push 10 ;X
push 1 ;signed_flag
push 7FFFh ;word_value
call PrintWord ;(word_value:WORD, signed_flag:BYTE, X:BYTE, Y:BYTE)

;знаковый целочисленный тип
;0FFFFh = -1
push 1 ;Y
push 20 ;X
push 1 ;signed_flag
push 0FFFFh ;word_value
call PrintWord ;(word_value:WORD, signed_flag:BYTE, X:BYTE, Y:BYTE)


push 4 ;Y
push 1 ;X
push 1 ;signed_flag
push -13 ;word_value
call PrintWord ;(word_value:WORD, signed_flag:BYTE, X:BYTE, Y:BYTE)

push 5 ;Y
push 1 ;X
push 1 ;signed_flag
push -12345 ;word_value
call PrintWord ;(word_value:WORD, signed_flag:BYTE, X:BYTE, Y:BYTE)

push 6 ;Y
push 1 ;X
push 1 ;signed_flag
push -31000 ;word_value
call PrintWord ;(word_value:WORD, signed_flag:BYTE, X:BYTE, Y:BYTE)

push 8 ;Y
push 1 ;X
push 1 ;signed_flag
push +13 ;word_value
call PrintWord ;(word_value:WORD, signed_flag:BYTE, X:BYTE, Y:BYTE)

push 9 ;Y
push 1 ;X
push 1 ;signed_flag
push +12345 ;word_value
call PrintWord ;(word_value:WORD, signed_flag:BYTE, X:BYTE, Y:BYTE)

push 10 ;Y
push 1 ;X
push 1 ;signed_flag
push +31000 ;word_value
call PrintWord ;(word_value:WORD, signed_flag:BYTE, X:BYTE, Y:BYTE)


mov ah,0
INT 16h


mov ax,4C00h
INT 21h




const_PrintWord_return_code__success = 0
const_PrintWord_return_code__X_is_too_big = 1
const_PrintWord_return_code__Y_is_too_big = 2

PrintWord PROC ;(word_value:WORD, signed_flag:BYTE, X:BYTE, Y:BYTE)

;ВОЗВРАТ: ax = код результата

ARG @@word_value:WORD, @@signed_flag:BYTE, @@X:BYTE, @@Y:BYTE = @@arg_size
LOCAL @@dec_buf:BYTE:6 = @@local_size
push bp
mov bp,sp
sub sp,@@local_size

push ds
push es
push si
push di
push bx
push cx
push dx

;проверка X
mov al,@@X
cmp al,79
jbe @@X_is_OK

mov ax,const_PrintWord_return_code__X_is_too_big
jmp @@exit

@@X_is_OK:
;проверка Y
mov al,@@Y
cmp al,24
jbe @@Y_is_OK

mov ax,const_PrintWord_return_code__Y_is_too_big
jmp @@exit

@@Y_is_OK:
;проверка типа целого
mov al,@@signed_flag
test al,al
jz process_word ;беззнаковый целочисленный тип

;знаковый тип
test @@word_value,8000h
jz signed_positive

;знаковый отрицательный
neg @@word_value
mov BYTE PTR @@dec_buf,'-'
jmp process_word

signed_positive:
;знаковый положительный
mov BYTE PTR @@dec_buf,'+'


process_word:
mov ax,@@word_value
xor dx,dx
mov cx,5
mov bx,10
lea di,@@dec_buf
add di,6-1

div_10_loop:
div bx
or dl,'0'
mov ss:[di],dl
xor dx,dx
dec di
dec cx
test cx,cx
jnz div_10_loop

mov ax,0B800h
mov es,ax
mov ax,ss
mov ds,ax
lea si,@@dec_buf
mov cx,6

mov al,@@signed_flag
test al,al
jnz print_word_value

;беззнаковый целочисленный тип
inc si
dec cx

print_word_value:
mov al,@@Y
mov ah,80
mul ah
mov dl,@@X
xor dh,dh
add ax,dx
shl ax,1
mov di,ax

print_loop:
mov al,ds:[si]
mov es:[di],al
inc si
inc di
inc di

dec cx
test cx,cx
jnz print_loop

mov ax,const_PrintWord_return_code__success

@@exit:
pop dx
pop cx
pop bx
pop di
pop si
pop es
pop ds

mov sp,bp
pop bp
ret @@arg_size
PrintWord ENDP



code ENDS

stk SEGMENT PARA STACK
DB 200h DUP(?)
stk ENDS

END entry_point
Форма ответа