Показаны сообщения с ярлыком assembler. Показать все сообщения
Показаны сообщения с ярлыком assembler. Показать все сообщения

четверг, 11 июня 2009 г.

перевод в десятичную систему

разработать программу для перевода двоичного числа в десятичное


.8087
text segment byte
assume cs:text,ds:text
org 100h
begin:
; Форматируем
mov ax,1Ah ; 0666
call GetDecimalStr
; Выводим на печать
mov dx,offset DecNum
mov ah,09h
int 21h
ret

GetDecimalStr:
; Пусть в ax будет число, которое надо вывести как десятичное
; Форматируем его, результат записываем в строку
mov cx,10000 ; Начальный делитель
mov di,offset DecNum ; Адрес приемника
cld ; Флаг направления для команды stosb
@@GetDec:
xor dx,dx
div cx ; dx:ax / cx -> ax, остаток в dx
add al,'0' ; Приводим к ASCII
stosb ; Записываем в выходную строку
push dx ; Запоминаем остаток
xor dx,dx
mov ax,cx
mov cx,10
div cx ; Делим делитель на 10
mov cx,ax
pop ax ; Вспоминаем делимое
test cx,cx ; Делитель стал равен 0 ?
jnz @@GetDec
ret
DecNum db '??????',13,10,'$'
text ends
end begin


скачать можно тут

понедельник, 8 июня 2009 г.

работа со стеком

Записать в стек содержимое регистров AX, BX, CX, DX. Вызвать процедуру, которая бы ссунула содержимое регистра BX, взятый из стека, на количество разрядов, заданную содержимым CX также взятым из стека, и поместила результат в стек на место значения регистра DX. После выполнения процедуры вытянуть из стека содержимое регистров (DX-новое) и поместить их в соответствующие регистры.

  1. Записать в стек содержимое регистров AX, BX, CX, DX

    push AX
    push BX
    push CX
    push DX


  2. Вызвать процедуру которая бы ссунула содержимое регистра BX взятый из стека...

    my_proc proc
    ; заполним регистры соотв. значениями
    pop DX
    pop CX
    pop BX

    ; и вернём их назад, кроме DX
    push BX
    push CX

    ; тут будем сдвигать
    mov AX, BX
    ; в CX уже значение счётчика
    loop:
    shl AX, 1
    jnc loop

    ; и вместо DX теперь занёсем в стек AX
    push AX
    ret
    my_proc endp


  3. после вызова процедуры вернуть всё на место

    call my_proc

    pop DX
    pop CX
    pop BX
    pop AX


вуаля!

среда, 3 июня 2009 г.

25971883

Приписать по единице в начало и конец двоичной записи натурального числа.


давно это было... но попытаемся что-нибудь прояснить в памяти...



  1. определимся сначала что есть натуральные числа - это целые, бесзнаковые
  2. где можно хранить такие числа? ну например в регистрах AL, AX, EAX (8 бит, 16 бит, 32 бита соотв.), это значит что натуральное число может храниться в ячейках разного размера и то что число может быть ограничено соотв. диапазоном значений... но для примера возьмём 8-битное число, т.е. то которое влазит в AL - т.е. байт
  3. итак мне лично нравится число 10 - его двоичное педставление 1010b
  4. я так понимаю что на выходе должно получиться 110101b
  5. ту единичку, которая зелёная можно получить путём сдвига всего числа влево и прибавлением единицы... т.е.

    mov al, 1010b
    shl al, 1
    inc al

  6. ну а ту что красная... тут наверное есть несколько способов, но мне кажется самый очевидный - это подсчитать сколько значащих разрядов в числе, а потом на такое же кол-во + 1 сдвинуть вправо единицу, ну и полученный результат проORить с исходным значением...

  7. итак попробуем подсчитать кол-во начащих символов, будем сдвигать наше число (предварительно сохранив его где-нибудь) вправо - после сдвига проверяем флаг Zero - т.е. что число не стало нулём, если не стало увеличиваем счётчик на 1 и снова сдвигаем...

    mov al, 1010b ;инициализируем al нашим числом
    mov ah, al ;сохраним значение al в ah
    mov cx, 0 ;обнуляем счётчик

    ; подсчитываем кол-во значащих разрядов в нашем числе путём сдвига
    m1:
    shr al, 1
    jz m2 ; если флаг ZF выставлен - то значение al = 0, следовательно выходим
    inc cx
    jmp m1

    m2:

    inc cx ; увеличим ещё на один - чтобы единичка стала красной ;-)

    ; теперь двигаем на cx-раз 1 влево
    m3:
    mov al, 1
    shl al, 1
    dec cx
    jnz m3

    ; тут думается что al = 10000b

    ; тут OR-им, т.е. накладывает нашу единичку
    or al, ah

    ; тут подразумеваем что al уже в виде 11010b



исходников которые можно было бы скомпилировать не прилагаю, т.к не знаю какой OS вы пользуетесь и каким ассемблером... да и подзабыл я уже немного :-))
на этом всё.