Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
goshenka
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 4
1

Перевод из одной СС в другую

08.01.2014, 00:56. Просмотров 830. Ответов 6
Метки нет (Все метки)

Здравствуйте! Пытаюсь понять, как работает эта программа, но назначение некоторых строчек мне не ясно.


Полный текст программы.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
.586
.MODEL FLAT, STDCALL
PUBLIC fun3
_DATA SEGMENT 
    buf dw 8 dup(0)
    val dw 260
    dev dw 8
_DATA ENDS
_TEXT SEGMENT
fun3 proc 
    lea EBX, buf
    mov ECX, 6
metka1: 
    mov BYTE PTR [EBX],' '    
    inc EBX
    Loop metka1
    mov AX,val
    push AX
    OR AX,AX
    jns metka2 
    neg AX
metka2:
    xor EDX,EDX
    div dev
    add DX,'0'
    dec EBX
    mov BYTE PTR[EBX], DL
    OR AX,AX
    jnz metka2
    pop AX
    OR AX,AX         
    jns metka_end 
    dec EBX
    mov BYTE PTR [EBX],'-'
    jmp metka_end
metka_end:
    mov EAX, EBX
    ret
fun3 ENDP
_TEXT ENDS
    END
Подскажите, плиз, для чего нужны следующие строчки:
1.
Assembler
1
buf dw 6 dup(0)
Здесь зачем-то в переменную buf помещают 6 нулей, для чего?
2.
Assembler
1
mov ECX, 6
Зачем мы помещаем в этот регистр 6? Ведь далее мы его вообще не используем.
3.
Assembler
1
mov BYTE PTR [EBX],' '
Тут вообще не понятно. Первым операндом является эффективный адрес EBX, а вторым операндом является символ пробела. Получается, что мы записываем символ пробела по полученному адресу. Если это так, почему нельзя написать не "BYTE PTR [EBX]", а просто "EBX"?
4.
Assembler
1
inc EBX
Здесь мы увеличиваем на 1 содержимое регистра EBX, смысл тоже не ясен, ведь там символ пробела.
5.
Assembler
1
OR AX,AX
Здесь судя по следующей строчке ("jns metka2"), каким-то образом проверяется знак числа. Вот только не пойму, как? Допустим, у нас в регистре число "11111110", что соответствует 254 в десятичной. Результатом команды OR будет 11111110. В чем тогда смысл этой строчки?
6.
Assembler
1
add DX,'0'
Тут код символа 0 складывается с содержимым регистра DX, в котором, как я понял, находится остаток от деления. Тоже непонятно, зачем?
7.
Assembler
1
dec EBX
Теперь зачем-то уменьшаем на единицу?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2014, 00:56
Ответы с готовыми решениями:

Перевод из одной СС в другую
Здравствуйте. Помогите составить программу перевода из троичной СС в девятеричную. Буду очень...

Перевод с одной кодовой таблицы в другую
Помогите с лабораторной работой пожалуйста. Нужно написать программу, для кодирования строки путем...

Перевод чисел из одной системы счисления в другую
Задача: Написать программу перевода чисел из одной системы счисления в другую. Систему счисления...

перевод их одной с-мы счисления в другую
Здравствуйте. Подскажите пожалуйста, вот есть дробные числа десятичные, как их переводить из N-ной...

Нужна помощь в решении задачи "Перевод числа из одной системы счисления в другую"
Доброго времени суток! Помогите пожалуйста не получается сделать задачу которая бы переводила числа...

6
skaa
Хочу в Исландию
1035 / 834 / 119
Регистрация: 10.11.2010
Сообщений: 1,629
08.01.2014, 18:46 2
Ответ на 1й вопрос.
Таким образом мы резервируем 6 слов (12 байт) памяти. На C++ это выглядит так int buf[6];. Я не очень разбирался в этой программе, что-то похожее на перевод числа 260 в восьмиричную систему, где результат попадёт в buf. Помещают туда 6 нулей, потому что надо что-то поместить .

Ответ на 2й вопрос.
Далее регистр ECX используется командой Loop metka1. Каждый раз в этом месте значение ECX уменьшается на 1, и переход на метку metka1: пока ECX больше 1.
1
goshenka
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 4
08.01.2014, 19:20  [ТС] 3
Благодарю за помощь! С назначением регистра ECX разобрался

С 1-м вопросом тоже разобрался, мы просто резервируем память. Но хочу кое-что уточнить.
Цитата Сообщение от skaa Посмотреть сообщение
мы резервируем 6 слов (12 байт) памяти
Точно слов, а не битов?
И ещё: почему именно 6, а не 8 или 16? В чем тут хитрость?
0
skaa
Хочу в Исландию
1035 / 834 / 119
Регистрация: 10.11.2010
Сообщений: 1,629
08.01.2014, 19:26 4
Ответ на 3й вопрос.
Пробел ' ' компилятор переводит в число (2016). Число в EBX указывает на номер ячейки памяти куда надо поместить это число. Машины бывают 64-, 32-, 16- и т.д. разрядные, как тогда процессору понять в какого размера ячейку поместить (2016)? Вот и приходится писать:
byte - в [EBX] запишется 20 (один байт)
word - в [EBX] запишется 20, 00 (два байта)
dword - в [EBX] запишется 20, 00, 00, 00 (четыре байта).

Добавлено через 3 минуты
Количество бит я не знаю как зарезервировать, наверное никак нельзя . В этой программе резервируют 6 слов потому что наверное решили что больше не надо... типа 8-ричное число не будет содержать больше 6 символов.
1
Charles Kludge
Клюг
7647 / 3162 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
08.01.2014, 19:29 5
Цитата Сообщение от goshenka Посмотреть сообщение
почему именно 6, а не 8 или 16? В чем тут хитрость?
Это - к автору, ведь макс. значение для слова в восьмиричной системе 177777, к тому же оно не может быть со знаком.
1
goshenka
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 4
08.01.2014, 23:15  [ТС] 6
Цитата Сообщение от goshenka Посмотреть сообщение
buf dw 6 dup(0)
Спасибо, ребята, разобрался с этой строчкой
По директиве dw отводится ячейка памяти размером в слово (2 байта или 16 бит), которой присваивается имя buf, и в которую заносится операнд 0. Конструкция 6 dup(0) говорит о том, что надо отвести 6 ячеек размером в слово и записать в каждую из них 0. Таким образом, мы зарезервировали 6 слов памяти.

Почему именно 6? Вроде тоже разобрался. В слово можно записать числа диапазона -2^(n-1):2^(n)-1, где n - разрядность ячейки (в нашем случае n=16). Максимальное число этого диапазона будет 2^(16)-1 = 65535, которое в 8-чной СС выглядит как 177777 (т.е. мы можем задать в качестве переводимого числа val число 65535, т.к. для него определена ячейка размером в слово dw). Как я понял, каждая цифра восьмеричного числа 177777 записывается в отдельную ячейку выделенного нами размера. Всего цифр 6, поэтому мы и выделяем 6 ячеек.
Получается, если бы мы переводили не в 8-чную, а в 2-чную СС, то нам надо было бы выделить 16 слов, т.к. в 2-чной СС 65535 представлено 16-тью единицами?

И почему мы выделяем для каждой цифры целое слово, когда достаточно и одного байта?

А вот по 3-му вопросу все равно не совсем понимаю. Зачем нам нужно записывать число 20 в ячейку?
0
skaa
Хочу в Исландию
1035 / 834 / 119
Регистрация: 10.11.2010
Сообщений: 1,629
08.01.2014, 23:52 7
Скорее всего потому что хотелось бы на выходе иметь ' 404'. Непонятно почему
Assembler
1
buf dw 8 dup(0)
, разумнее было бы
Assembler
1
buf db 8 dup(' ')
, тогда и цикл по заполнению пробелами не нужен .
1
08.01.2014, 23:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2014, 23:52

Перевод из одной сс в другую
Боже мой.помогите мне пожалуйста кто-нибудь!:gcray2: мне нужно на vb написать программу.есть даже...

Перевод из одной сс в другую
помогите решить пожалуйста

Перевод из одной С.С. в другую
Как можно организовать при помощи ОДНОЙ функции, в которую вводится само число и система счисления?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru