· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Письмо от Яна.

Посл.отвђт Сообщенiе


Дата: Сен 7, 2003 16:49:46

Ян не может пока зарегистрироваться.
Посылаю его письмо со своего логина.
----------

Меня зовут Ян.
Мне нравится писать в машинных кодах.
Программа выводит на экран большие и
маленькие буквы английского алфавита в столбик.
Можно ли эту программу написать так, чтобы
она была короче?
база файла 0, потом после загрузки будет база+100h
0000: B4 09	; поместить в ah номер функции 09
0002: BA 13 01  ;поместить в dx адрес строки (0113h)
0005: B9 1A 00  ;поместить в cx 001A (количество букв)
0008: CD 21	;вывести строку
000A: 81 06 13 01 01 01 ;прибавить к каждому из первых
		;двух байтов строки по 1. Получатся числовые
		;значения следующей буквы алфавита.
0010: E2 F6	;уменьшить cx на один, если он не 0 -
		;прибавить к IP (IP будет равен 110+2) минус 10
		;чтобы в IP оказался адрес 108
0012: C3	;перейти по адресу в [SP] в com файле там всегда 0.
		;а по адресу 0 всегда CD 20 (выход).
0013: 41 61 0D 0A 24 ; Первая заглавная и маленькая буква, перевод строки.
		;$ - символ ограничения.


Дата: Сен 7, 2003 18:01:43

Используя значения регистров при старте можно уменьшить на 3 байта, не меняя алгоритм. Подобны задачки решают на http://codeclimber.com.
.model tiny
.code
org 100h
start:
	xchg	ax,bp		;при старте bp=09xxh
	mov	cl,26		;при старте cx=00FFh
	inc	si		;при старте si=0100h=ip
	mov	dx,offset Mess
L10:
	int	21h
	add	Mess,si
	loop	L10
	ret
Mess	dw	'aA' 
	db	0Dh, 0Ah, '$'
end start


Дата: Сен 7, 2003 19:09:03 · Поправил: _G3

Еще на байт уменьшил. В итоге 20 байт.
.model tiny
.code
org 100h
start:
	db	40h		;inc	ax
	db	60h		;pusha
	db	0Dh, 0Ah, '$'	;or ax,240Ah
	xchg	ax,bp		;при старте bp=09xxh
	mov	cl,26		;при старте cx=00FFh
	mov	dx,si		;при старте si=0100h=ip
L10:
	add	[si],0101h
	int	21h
	loop	L10
	int	20h
end start


Дата: Сен 7, 2003 19:47:09 · Поправил: _G3

Еще на байт уменьшил. В итоге 19 байт.
.model tiny
 .code
org 100h
start:
	db	1Ah,'A','a'	;sbb al,[bx+si+60]
	db	0Dh,0Ah,'$'	;or ax,240Ah
	xchg	ax,bp		;при старте bp=09xxh
	mov	cl,26		;при старте cx=00FFh
	inc	si
	mov	dx,si		;при старте si=0100h=ip
L10:
	int	21h
	add	[si],si
	loop	L10
	ret
end start


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.080