Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/48: Рейтинг темы: голосов - 48, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 3

Написать программу перевода двухбайтового целого числа в массив символов

24.12.2012, 23:09. Показов 9873. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста сделать несколько лаб по ассемблеру, вот например такое задание:
Разработать алгоритм т написать программу перевода 2-байтового целого числа в массив символов, который представляет запись числа в шестнадцатеричной системе(4 знака)
число: A2B7h
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.12.2012, 23:09
Ответы с готовыми решениями:

Написать программу перевода целого числа a из цифрового формата в прописной
Добрый день. Знаю, что такое уже было на вашем форуме, но оно было не полностью, а как доделать я не сильно знаю. Задача: Написать...

Написать программу перевода целого числа a из цифрового формата в прописной
Написать программу перевода целого числа a из цифрового фор- мата в прописной. a < 1012 Пример: a = 123 ⇒ cто двадцать три.

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

5
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
25.12.2012, 09:55
Лучший ответ Сообщение было отмечено как решение

Решение

смотри прикрепленную тему Ввод и вывод чисел в различных системах счисления — Вывод числа в шестнадцатеричной системе или вот куча вариантов
  1. Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
        mov ecx,8; количество цифр в строке
        mov edi,offset String; адрес строки в edi
    @@:    rol eax,4; преобразуемое число в регистре eax
        push eax
        cmp al,9;если al < 10, CF = 1
        ja a1  
        add al,'0'
        jmp short a2
    a1:     add al,'7'
    a2:    stosb; помещаем значение из AL в строку
        pop eax
        loop @b; уменьшаем счетчик
  2. Assembler
    1
    2
    3
    4
    5
    
          add al,'0'
               cmp al,'9'; если al < 10, CF = 1
        jbe a1        
        add al,7
    a1:    stosb; помещаем значение из AL в строку
  3. Для увеличения скорости выполнения программы, стараются как можно реже использовать условные переходы. Та же самая задача при использовании команд DAS и DAA может быть выполнена следующим образом:
    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
    
       mov edi,offset String; адрес строки в edi
        mov ecx,4
    @@:    rol eax,8
        push eax
        push eax
        shr al,4; работаем со старшей тетрадой
        call Hex2
               pop eax
               and al,0Fh; обнуляем старшую тетраду
        call Hex2; работаем с младшей тетрадой
        pop eax
        loop @b
        ...
    Hex2:    add al,90h ;если в al была цифра 0..9, тогда в al
                ;будет 90h..99h, если в al была цифра 0Ah..0Fh,
               ;тогда в al будет 9Ah..9Fh
        daa         ; 0-9: 90h..99h CF=0
                     ; A-F: 00h..05h CF=1
        adc al,40h ; 0-9: D0h..D9h
                     ; A-F: 41h..46h
        daa       ; 0-9: 30h..39h
                     ; A-F: 41h..46h
        stosb      ; помещаем значение из AL в строку
        ret
  4. Assembler
    1
    2
    3
    4
    5
    6
    7
    
         cmp al,10 ; если al < 10, CF = 1
        sbb al,69h;если в al была цифра 0..9, тогда в al 
              ;будет 96h..9Fh, если в al была цифра 0Ah..0Fh,
              ;тогда в al будет 0A1h..0A6h
               das       ; 0-9: 96h..9Fh минус 66h -> 30h..39h,
                      ; A-F: 0A1h..0A6h минус 60h -> 41h..46h
        stosb     ; помещаем значение из AL в строку
  5. Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    
        and al,0Fh; обнуляем старшую тетраду
        cmp al,10; если al < 10, CF = 1
        sbb ah,ah; если al < 10, то ah=0, иначе ah=0FFh
        and ah,1; сбрасываем CF, ah = ah&1 (в ah окажется 0 или 1)
             daa; если в al было 0..9, тогда содержимое al не изменится   
        add al,'1'; если в al было A..F тогда в al стало 10h..15h
        sub al,ah
        stosb; помещаем значение из AL в строку
  6. Assembler
    1
    2
    3
    4
    5
    6
    7
    
        and eax,0Fh; обнуляем старшую тетраду
        cmp al,10; если al < 10, CF = 1
        adc ah,0; если al < 10, то ah=1, иначе ah=0
             daa; если в al было 0..9, тогда содержимое al не изменится   
        add al,'1'; если в al было A..F тогда в al стало 10h..15h
        sub al,ah
        stosb; помещаем значение из AL в строку

  7. Assembler
    1
    2
    3
    4
    5
    6
    7
    
        and eax,0Fh; обнуляем старшую тетраду
        cmp al,10; если al < 10, CF = 1
        sbb ebx,ebx; если al < 10, то ebx=-1, иначе ebx=0
        and ebx,ebx; сброс CF и AF
             daa; если в al было 0..9, тогда содержимое al не изменится   
        lea eax,[ebx+eax+31h];add al,'1'; если в al было A..F тогда в al стало 10h..15h
        stosb; помещаем значение из AL в строку
  8. Assembler
    1
    2
    3
    4
    5
    6
    
        cmp al,10;если al < 10, CF = 1
        sbb ebx,ebx; если al < 10, то ebx=0, иначе ebx=-1 CF=AF=1
        daa ; если в al было A..F, тогда al равно 10h..15h
        and ebx,-103; если 0..9, тогда al равно 66h..6Fh    
        lea eax,[eax+ebx+31h]; если A..F, тогда al равно 41h..46h
        stosb; помещаем значение из AL в строку
  9. Assembler
    1
    2
    3
    4
    5
    6
    7
    
        and al,0Fh; обнуляем старшую тетраду
        cmp al,10;если al < 10, CF = 1
        sbb ebx,ebx; если СF=0, то ebx=0, иначе ebx=-1
        and ebx,-13; сбрасываем CF и AF, в ebx окажется 0 или -13
        das; если 0..9, тогда al не изменится
        lea eax,[eax+ebx+3Dh]; если A..F, тогда al равно 3..9
        stosb; помещаем значение из AL в строку
  10. Assembler
    1
    2
    3
    4
    5
    6
    7
    
          and al,0Fh; обнуляем старшую тетраду
               cmp al,10; если al < 10, CF = 1
        sbb ebx,ebx; если СF=0, то ebx=0, иначе ebx=-1 CF=AF=1
        das; если 0..9, тогда al не изменится
        and ebx,-167; если A..F, тогда al равно 3..9
        lea eax,[eax+ebx+3Dh]
        stosb; помещаем значение из AL в строку
  11. Вариант с использованием команды XLAT, где-то в сегменте данных должна быть таблица перекодировки:
    table db '0123456789ABCDEF'
    Assembler
    1
    2
    3
    
        and al,0Fh; обнуляем старшую тетраду
        xlat
        stosb; помещаем значение из AL в строку
  12. Вариант с использованием команды условной пересылки CMOVcc:
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
             mov ecx,8; количество цифр в строке
             mov edi,offset String; адрес строки в edi
             mov bl,30h
    @@:         rol eax,4
             push eax; преобразуемое число в регистре eax
             and al,0Fh; обнуляем старшую тетраду
             mov dl,37h
             cmp al,10
             cmovb edx,ebx 
             add al,dl
             stosb; помещаем значение из AL в строку     
             pop eax
             shr eax,4; переходим к следующей тетраде
             loop @b; уменьшаем счетчик
  13. Вариант без использования условного ветвления:
    Assembler
    1
    2
    3
    4
    5
    6
    
        and al,0Fh; обнуляем старшую тетраду
              cmp al,10
        sbb ebx,ebx; если СF=0, то ebx= 0, иначе ebx=-1
        and ebx,-7; в ebx окажется 0 или -7
        lea eax,[eax+ebx+37h]
        stosb; помещаем значение из AL в строку
  14. Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    
       and al,0Fh
        cmp al,10 
        cmc       ; если al < 10, CF = 0
        adc al,30h;если в al была цифра 0..9, тогда в al 
    ;будет 30h..39h, если в al была цифра 0Ah..0Fh, тогда в al будет 3Bh..40h
        daa       ; 0-9: 30h..39h,
                      ; A-F: 3Bh..40h плюс 6 -> 41h..46h
        stosb     ; помещаем значение из AL в строку
  15. Для разнообразия можно задействовать MMX (murderer)
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
     x      dd 0FACD123h
    mask   dq 0F0F0F0F0F0F0F0Fh
    ascii  dq 3030303030303030h
    hex    dq 3939393939393939h
    ascii2 dq 0707070707070707h
    s      rb 9
    --//--
    pxor      mm0,mm0
    punpcklbw mm0,qword[x]
    movq      mm1,mm0
    psrlw     mm1,12
    por       mm0,mm1
    pand      mm0,[mask]
    paddusb   mm0,[ascii]
    movq      mm1,[hex]
    pcmpgtb   mm1,mm0
    pandn     mm1,[ascii2]
    paddusb   mm0,mm1
    pshufw    mm0,mm0,00011011b
    movq      qword[s],mm0
  16. Assembler
    1
    2
    3
    4
    5
    
     and al,0Fh; обнуляем старшую тетраду
                daa     ;F->15h            1->1
        add al,0F0h;F0+15h->05h CF=1     F0+1->F1 CF=0 
        adc al,40h ;46h            31h
               stosb; помещаем значение из AL в строку
  17. Assembler
    1
    2
    3
    4
    5
    6
    7
    
           and al,0Fh; обнуляем старшую тетраду
                daa    ; F->15h            1->1
        add al,70h; 70h+15h->85h SF=1 70h+1->71h SF=0
        cbw    ; ah=0FFh    ah=0
        sub al,ah   ; 85+1->86h        71h
        sub al,40h; 46h            31h
               stosb; помещаем значение из AL в строку
  18. Assembler
    1
    2
    3
    4
    5
    
         and al,0Fh; обнуляем старшую тетраду
                sub al,11h;  F->FEh    1->F0h
        db 0D4h,0F9h;FE->0105h      F0->00F0h
                add al,41h  ;05+41->46h   F0+41->31h
        stosb; помещаем значение из AL в строку
  19. Assembler
    1
    2
    3
    4
    5
    
          and al,0Fh; обнуляем старшую тетраду
                aam;         0F->105h   01->0001
        db 0D5h,11h; 105h->16h  0001->01 
        add al,30h  ;16+30->46h 01+30->31h
               stosb; помещаем значение из AL в строку
  20. Assembler
    1
    2
    3
    4
    5
    
           and ax,0Fh; обнуляем старшую тетраду
                aaa;         0F->105h   01->0001
        db 0D5h,11h; 105h->16h  0001->01 
        add al,30h  ;16+30->46h 01+30->31h
               stosb; помещаем значение из AL в строку
  21. Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    
           and al,0Fh; обнуляем старшую тетраду
                cmp al,10; если al < 10, CF = 1
        cmc       ; если al < 10, CF = 0
                adc al,30h;если в al 0..9, тогда в al будет 30h..39h, 
            ; если в al 0Ah..0Fh, тогда в al будет 3Bh..40h
                daa  ; 0-9: 30h..39h,
                      ; A-F: 3Bh..40h плюс 6 -> 41h..46h
        stosb; помещаем значение из AL в строку
  22. Assembler
    1
    2
    3
    4
    5
    6
    7
    
            and al,0Fh; обнуляем старшую тетраду
                daa    ; F->15h            1->1
        add al,70h; 70h+15h->85h SF=1 70h+1->71h SF=0
        cbw    ; ah=0FFh        ah=0
        sub al,ah   ; 85+1->86h        71h
        sub al,40h; 46h            31h
               stosb; помещаем значение из AL в строку
  23. Assembler
    1
    2
    3
    4
    5
    
           and ax,0Fh; обнуляем старшую тетраду
                aaa;         0F->105h   01->0001
        db 0D5h,11h; 105h->16h  0001->01 
        add al,30h  ;16+30->46h 01+30->31h
               stosb; помещаем значение из AL в строку
  24. подпрограммы z0mbie выдача hex-числа на экран (DOS, число в AX)
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      mov cx,4;20 байт  
    cycle: rol ax,4
         push ax
         and al,15
         daa
         add al,-10h
         adc al,'0'+10h
         int 29h
         pop ax
         loop cycle
         ret
  25. Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      mov cx,4;21 байт  
    cycle: rol ax,4
         push ax
         and al,15
         sub al,'A'-'0'
         aam '9'-'A'+1
         add al,'A'
         int 29h
         pop ax
         loop cycle
         ret
  26. Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      mov cx,4;21 байт  
    cycle: rol ax,4
         push ax
         and al, 15
         aam 10
         aad 'A'-'0'
         add al, '0' 
         int 29h
         pop ax
         loop cycle
         ret
  27. Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
      mov cx,4;21 байт  
    cycle: rol ax,4
         push ax
         and al,15
         add al,90h
         daa
         adc al,'A'-1
         daa 
         int 29h
         pop ax
         loop cycle
         ret
7
0 / 0 / 0
Регистрация: 09.10.2015
Сообщений: 21
26.08.2016, 00:14
HTML5
1
Например, вот так.
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
proga
    mov dx,0A2B7h
    mov di,buff
    call    pr_hex
    ret
 
pr_hex
    mov cl,4
    mov al,dh
    call    .m1
    mov al,dl
.m1 mov ah,al
    shl al,cl
    call    .m2
    mov al,ah
.m2 and al,15
    or  al,30h
    cmp al,3Ah
    jc  .m3
    add al,7
.m3 stosb
    ret
 
buff
0
programmer
 Аватар для Thread
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
28.08.2016, 15:18
savc,

Цитата Сообщение от Mikl___ Посмотреть сообщение
Вариант с использованием команды XLAT, где-то в сегменте данных должна быть таблица перекодировки:
table db '0123456789ABCDEF'
Assembler
1
2
3
    and al,0Fh; обнуляем старшую тетраду
    xlat
    stosb ; помещаем значение из AL в строку
0
0 / 0 / 0
Регистрация: 09.10.2015
Сообщений: 21
28.08.2016, 16:08
Это замечательно, Thread, только печатать нужно два байта. А команда на самом деле XLATB.

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

Добавлено через 1 минуту
Assembler
1
2
3
4
5
6
7
8
9
10
11
PrWordHex2buf
        mov     bx,tabl_hex
        mov     al,[si+1]
        call    PrByteHex2buf.m1
        mov     al,[si]
        call    PrByteHex2buf.m1
        mov     byte [di],'H'
        inc     di
        inc     si
        inc     si
        ret
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
PrByteHex2buf
        lodsb
        mov     bx,tabl_hex
        call    .m1
        mov     byte [di],'H'
        inc     di
        ret
.m1     mov     ah,al
        xchg    al,ah
        shr     al,1
        shr     al,1
        shr     al,1
        shr     al,1
        xlatb
        mov     [di],al
        inc     di
        mov     al,ah
        and     al,15
        xlatb
        mov     [di],al
        inc     di
        ret
 
tabl_hex        db '0123456789ABCDEF'
0
programmer
 Аватар для Thread
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
29.08.2016, 01:24
savc,
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    table   db '0123456789ABCDEF'
    buff    db  250 dup (0)
    num     dd  0xABCD4321
    
.code   
proc Start
    ;read 'console', string 
    ;alloc buff, 256
    
    lea ebx, [table]
    lea edi, [buff]
    mov ecx, 32
    @@:
        rol [num], cl
        mov eax, [num]
        and eax, 0xF
        xlatb
        stosb
        sub ecx, 4
    jnz @b
 
    invoke GetStdHandle,STD_OUTPUT_HANDLE
    invoke WriteConsole, eax, buff, 8, buff+8, NULL
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.08.2016, 01:24
Помогаю со студенческими работами здесь

Строка представляет собой запись целого числа. Составьте программу ее перевода в соответсвующую величину целого типа.
Помогите сделать задание: Строка представляет собой запись целого числа. Составьте программу ее перевода в соответсвующую величину целого...

Написать программу перевода целого числа из десятичной системы в любую другую от двоичной до системы с основанием 35
Написать программу перевода целого числа из десятичной системы в любую другую от двоичной до системы с основанием 35. Для обозначения цифр...

Написать программу удаления из текстового файла символов перевода строки ‘\n’ и перевода каретки ‘\r’
Здравствуйте,помогите написать программу на подобии этой,только не подсчета,а удаления.Заранее благодарен! #include &lt;stdio.h&gt; int...

Программа, которая выводит на экран код двухбайтового целого числа
Программа, которая выводит на экран код двухбайтового целого числа.

составте программу перевода целого числа a, где a>0 в двоичную систему счисления
помогите пожалуйста, я ваще не могу понять, нужно сегодня срочно


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru