Консультация № 188895
05.03.2016, 15:01
0.00 руб.
0 12 1
Здравствуйте! Прошу помощи в следующем вопросе:

Как в asm организовать ввод однозначного числа и его вывод?

Обсуждение

давно
Посетитель
7438
7205
05.03.2016, 17:13
общий
06.03.2016, 00:37
Адресаты:
Способов масса
Ввести, например, можно считывая символ по
mov ah,0
int 16h
Естественно, надо проверять на цифру и преобразовать из ASCII-кода в число
Выводить, например, как и любой другой символ, при помощи
mov ah, 2
mov dl, <символ>
int 21h
В dl помещаем символ цифры, т.е. должно быть 30h-39h
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400012
5
07.03.2016, 16:53
общий
код в паскале:
var a:byte;
begin
read(a);
write(a,9,9-a)
end.

нужно оптимизировать код, если:

begin
asm
//ввод цифры и вывод так, как выше?
end
end.
Будет ли код короче?
давно
Посетитель
7438
7205
07.03.2016, 17:23
общий
Адресаты:
Вы хотите использовать ассемблерные вставки?
Безусловно, будет короче. Но эффект от этого ничтожный.
Если уж хотите оптимизировать, перепишите все на асме.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400012
5
08.03.2016, 07:54
общий
Нужно просто сократить длину кода,т.е:
вход: цифра
выход: цифра,9,9-цифра или цифра,99-цифра
давно
Старший Модератор
31795
6196
09.03.2016, 10:12
общий
это ответ
Здравствуйте, safinim!

Код ВР 7.
[code lang=pascal h=200]procedure newstr;
begin{процедура перевода строки}
asm
mov al,10
int 29h
mov al,13
int 29h
end
end;

begin
asm
@@01: xor ax,ax{читаем символ без эхо}
int 16h
cmp al,'0'{проверяем цифра ли это}
jb @@01{не цифра цифра повторяем ввод}
cmp al,'9'
ja @@01
int 29h{не документированная функция(для ДОС 1) вывод в текущую позицию}
push ax
call newstr{переводим строку}
pop ax
push ax
int 29h
mov dl,'9'
mov ah,2
int 21h{аналог int 29h - выводим 9}
pop ax
mov dl,'9'{получаем разность}
sub dl,al
mov al,dl
add al,'0'
int 29h{выводим результат}
end
end.[/code]
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400012
5
09.03.2016, 14:17
общий
09.03.2016, 14:40
ваш код на много больше:)
[code lang=pascal h=100] procedure newstr;
begin{процедура перевода строки}
asm
mov al,10
int 29h
mov al,13
int 29h
end
end;

begin
asm
@@01: xor ax,ax{читаем символ без эхо}
int 16h
cmp al,'0'{проверяем цифра ли это}
jb @@01{не цифра цифра повторяем ввод}
cmp al,'9'
ja @@01
int 29h{не документированная функция(для ДОС 1) вывод в текущую позицию}
push ax
call newstr{переводим строку}
pop ax
push ax
int 29h
mov dl,'9'
mov ah,2
int 21h{аналог int 29h - выводим 9}
pop ax
mov dl,'9'{получаем разность}
sub dl,al
mov al,dl
add al,'0'
int 29h{выводим результат}
end
end.[/code]



чем просто код в паскале,
[code lang=pascal h=90]var n:byte;
begin
read(n);
write(n,99-n)
end.[/code]

основная цель - сократить данный код, по длине!
давно
Старший Модератор
31795
6196
09.03.2016, 14:33
общий
Адресаты:

Код в формате:
[code lang=pascal h=100]var n:byte;
begin
read(n);
write(n,99-n)
end.[/code]
Занимает 2544 байта, против
[code lang=pascal h=100]procedure newstr;
begin{процедура перевода строки}
asm
mov al,10
int 29h
mov al,13
int 29h
end
end;

begin
asm
@@01: xor ax,ax{читаем символ без эхо}
int 16h
cmp al,'0'{проверяем цифра ли это}
jb @@01{не цифра цифра повторяем ввод}
cmp al,'9'
ja @@01
int 29h{не документированная функция(для ДОС 1) вывод в текущую позицию}
push ax
call newstr{переводим строку}
pop ax
push ax
int 29h
mov dl,'9'
mov ah,2
int 21h{аналог int 29h - выводим 9}
pop ax
mov dl,'9'{получаем разность}
sub dl,al
mov al,dl
add al,'0'
int 29h{выводим результат}
end
end.[/code]
Всего 1696 байта.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
09.03.2016, 14:34
общий
Адресаты:
Вы хотите сократить исходный код на Паскале?
Вы не знали, что исходный код на Ассемблере получается длиннее?
Зато результирующий код в виде exe - короче и быстрее работает.
А исходный код на ЯВУ всегда короче
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
09.03.2016, 14:38
общий
Адресаты:
Сама заглушка паскаля
[code lang=pascal h=50]begin
end.[/code]
- 1632 байта
поиграйтесь с калькулятором и увидите реальную длину чистого кода.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400012
5
09.03.2016, 14:49
общий
Задача №4 с сайта acmp.ru
var n:byte;
begin
read(n);
write(n,99-n)
end.
Данный код 40 символов, один участник написал в 37!
Поэтому была мысль об asm вставке
давно
Старший Модератор
31795
6196
09.03.2016, 14:54
общий
Адресаты:
ссылку на задачу
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400012
5
09.03.2016, 14:59
общий
09.03.2016, 17:01
http://acmp.ru/index.asp?main=task&id_task=4

write(99*(n+1)) можно и так, но код длиннее
Форма ответа