Лекции по Вычислительным машинам, системам и сетям   

5. Программирование на языке Ассемблер

5.2. Системы счисления

Любое число может быть задано в различных системах счисления. Например, число 130 в различных системах счисления выглядит так:

130

десятичная,

10000010

двоичная,

82

шестнадцатеричная,

202

восьмеричная.

Наиболее часто при написании ассемблерных программ используются числа, заданные в 10-й и 16-й системах счисления. Реже, но все-таки достаточно интенсивно, используется двоичная система счисления. Для того чтобы транслятор мог понять, о какой системе счисления идет речь при задании в программе какого-либо числа, справа от этого числа пишется соответствующая буква:

130

десятичная,

10000010b

двоичная,

82h

шестнадцатеричная.

Проще говоря, если буквы нет, то транслятор понимает число, как 10-е и сам переводит его в двоичный эквивалент, с которым уже и работает процессор. Если есть буква h (hexadecimal), транслятор понимает это число как 16-е и сам переводит его в двоичный эквивалент и т.д. Буква b означает двоичную систему (binary).

Транслятор считает значительно лучше, чем «человек с калькулятором», поэтому если надо в программе, допустим, занести в регистр ax значение 34*21/ 8, то пишите:

mov ax, 34*21/8,

транслятор сам все подсчитает.

Однако, если нет уверенности том, как транслятор поймет заданную конструкцию, то лучше ее не пишите. Любую конструкцию обычно можно задать разными способами. При этом лучше выбрать способ, в котором будете уверены, хотя, возможно, при этом придется написать и больше команд. Например, программист ввел в программе три переменные x, y и z:

 x db 7  ;директивой db программист «попросил» ;транслятор выделить в памяти байт для ;переменной, которую программист назвал ;х, и занести в этот байт число 7;

 y db 17

 z db 3

затем где-то в программе программист написал команду

mov al, x+2.

Если программист при этом рассчитывает, что в регистр al попадет 7+2 = 9, то он заблуждается. В al попадет 3 (адрес Х плюс 2 байта = адрес Z, по этому адресу из памяти и будет выбрана информация). Чтобы в al действительно попало 7+2 = 9, надо было писать:

 mov al, x  ; занести в al значение переменной х;

 add al, 2  ;прибавить к содержимомуal двойку.

У новичков часто возникает вопрос: «А какую систему счисления лучше использовать в моей программе?». Отвечаем, та или иная система счисления используется в зависимости от ситуации. Например, в регистр al надо занести число 112, здесь удобно написать:

mov al, 112.

Теперь в al надо занести 12, а в регистр ah9. Можно написать:

mov al, 12 ; вalß00001100b = 0ch

mov ah, 9 ; в ah ß00001001b = 9h.

Но ведь можно написать и короче, учитывая, что ah и al составляют вместе регистр ax:

mov ax, 90ch ; в axß0000100100001100b = 090ch.

Курсивом выделена та часть числа, которая попадает в ah. Здесь удобно использовать 16-ю систему счисления. Если бы использовали 10-ю и написали бы mov ax, 912, то это было бы неправильно, поскольку транслятор, переведя 912 в двоичный код, получил бы 0000001110010000, т.е. ah попало бы 3, а в al – 144, что не соответствует заданию.

Двоичную систему часто используют при задании управляющих слов, в которых каждый отдельный бит несет в себе определенную управляющую информацию.

Отметим, что в шестнадцатеричной системе счисления в качестве цифр используются буквы: a (10), b (11) ….. f (15). Если напишем в программе число с7а3h, транслятор не поймет, что речь идет о числе, он будет считать, что это идентификатор какой-то переменной. Поэтому, если число начинается с буквы, перед этой буквой надо писать цифру 0!. В этом случае транслятор поймет, что речь идет о числе, а не о переменной. Итак, правильная запись нашего числа ‑ 0c7a3h. Начинающие программисты часто забывают об этом правиле, в результате транслятор начинает выдавать сообщения об ошибках.



*****

© 2009-2017 Банк лекций siblec.ru
Лекции для преподавателей и студентов. Формальные, технические, естественные, общественные, гуманитарные, и другие науки.