Две задачки на Ассемблере

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
tomich
Сообщения: 2
Зарегистрирован: 11 ноя 2007, 12:51

Нужно написать программы на Ассемблере. Первые проги, так что мне нужно понять на примере, как вообще их писать.
1. Требуется найти сумму двух двухзначных десятичных чисел введенных с клавиатуры. Результат отразить числом, представленным в десятичной системе счисления. Вывести результат требуется зеленым цветом в центре экрана. Все действия сопровождать выводом комментариев в нижней строке экрана.
2. Файл содержит предложение, состоящее из слов, количество которых не превышает 25. Записать в дополнительно созданный файл и вывести на экран слова, содержащие менее 6 символов.
VK77
Сообщения: 2
Зарегистрирован: 16 ноя 2007, 19:54

Какая платформа?
Какой разрядности (16, 32, 64)?
В какой системе? DOS, WINDOWS, ...?

Просто "Ассемблера" нету - есть только "Ассемблер для x86", "Ассемблер для x64", "Ассемблер для ARM" и т.д.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Код: Выделить всё

.model tiny
.data

Str1 db 'Input first number  (0-99) : ', 0
Str2 db 'Input second number (0-99) : ', 0
Str3 db 'Result of summ is '
StrR db 'XXXXX',0
Num1 db 3,0,'00#'
Num2 db 3,0,'00#'
N1 dw 0
N2 dw 0

.code
jmp @pstart

; =======================================
; =========== Int to string =============
; =======================================
; Input  : AX - 16-bit unsigned number
;          DS:SI - pointer to string
;
; Output : DS:SI - result string (null-terminated)
;
IntToStr16 proc near
push ax
push bx
push cx
push dx
push si
mov bx, 10
xor cx,cx
	wnum_1:
xor dx, dx
div bx
push dx
inc cx
or ax, ax
jnz wnum_1
add si, cx
mov byte ptr [si], 0
sub si, cx
	wnum_2:
pop ax
add al,30h
mov [si], al
inc si
loop wnum_2
pop si
pop dx
pop cx
pop bx
pop ax
ret
IntToStr16 endp

; =======================================
; =========== String to int =============
; =======================================
; Input : DS:SI - offset to string
;         First byte of string must
;         contain actual length
; Output: AX - 16-bit unsigned number
;
; There is no matter the non-digit symbol 
;
StrToInt16 proc near
push bx
push cx
push dx
push si
push bp
xor bp, bp
mov cl, [si]
or cl, cl
jz @str2int16_exit
xor ch, ch
add si, cx
mov bx, 1
	@str2int16_loop:
mov al, [si]
sub al, 30h
sub ah, ah
mul bx
add bp, ax
mov ax, 10
mul bx
mov bx, ax
dec si
dec cl
jnz @str2int16_loop
	@str2int16_exit:
mov ax, bp
pop bp
pop si
pop dx
pop cx
pop bx
ret
StrToInt16 endp
; =======================================
; =========== Text output ===============
; =======================================
; Input : DS:SI - offset to text
;         DL,DH - X,Y location
;         BL    - Color attribute
;         String must be finished by zero
;
OutText proc near
push ax
push bx
push dx
push di
push es
mov al, 80
mul dh
add al, dl
adc ah, 0
shl ax, 1
mov di, ax
mov ax, 0B800h
mov es, ax
mov ah, bl
	@to_1:
lodsb
or al, al
jz @to_exit
stosw
jmp short @to_1
	@to_exit:
mov bh, 80
mov ax, di
shr ax, 1
div bh
mov dx, ax
xchg dh, dl
xor bh, bh
mov ah, 2
int 10h
pop es
pop di
pop dx
pop bx
pop ax
ret
OutText endp

	@pstart:
push cs
pop ds
mov ax, 3
int 10h
lea si, Str1
xor dx, dx
mov bl, 7
call OutText
mov ah, 0Ah
lea dx, Num1
int 21h
lea si, Str2
mov dx, 0100h
mov bl, 7
call OutText
mov ah, 0Ah
lea dx, Num2
int 21h
lea si, Num1 + 1
call StrToInt16
mov N1, ax
lea si, Num2 + 1 
call StrToInt16
add ax, N1
mov N2, ax
call OutText
mov ax, N2
lea si, StrR
call IntToStr16
lea si, Str3
mov dx, 0C1Ch
mov bl, 10
call OutText
xor ah, ah
int 16h
mov ax, 3
int 10h

mov ax, 4C00h
int 21h
end
комменты не писал, если где непонятно, спрашивайте
описания процедур писал на английском, чтобы не морочиться с кодировкой. Думаю там все понятно
It's a long way to the top if you wanna rock'n'roll
tomich
Сообщения: 2
Зарегистрирован: 11 ноя 2007, 12:51

Огромное спасибо!!! Сам бы никогда не справился. Попробую разобраться что к чему. А со второй задачей поможете?
Ответить