Форум программистов, компьютерный форум, киберфорум
Наши страницы

Assembler, MASM, TASM

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.77
nitromiha
84 / 12 / 1
Регистрация: 24.01.2011
Сообщений: 292
Записей в блоге: 1
#1

Вопрос в стиле "Разрушители мифов" - Assembler

18.10.2011, 20:22. Просмотров 4123. Ответов 28
Метки нет (Все метки)

Скажите пожалуйста, правда ли то что чтобы возвести икс в квадрат на ассемблере нужно вручную прописать около пяти страниц программного кода?))))
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2011, 20:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос в стиле "Разрушители мифов" (Assembler):

Есть строка. Нужно сделать так, чтобы "re" и "not" заменялись на "***". - Assembler
Есть строка. Нужно сделать так, чтобы "re" и "not" заменялись на "***". Data Segment para 'Data' max equ 255 str_prm db 'Input...

изьять слова, которые имеют префикс "re", "not", "be" - Assembler
Заданы символьная строка. Слова и идентификаторы разделяются хотя бы одним символом пробела. Написать программу, которая из заданного...

Необходимо строку тип ""str1" "str2"",0 преобразовать в строку типа - Assembler
Необходимо строку тип ""str1" "str2"",0 преобразовать в строку типа "str2",0 label_parse_string: inc EAX cmp EAX, ' ' jnz...

В словах, которые имеют окончание "ing", сделать замену "ing" на "ed" - Assembler
Задан текст. Группы символов, разделённые пробелами (одним или несколькими) и не содержащими пробелов внутри себя, будем называть словами....

Составить программу для вывода на экран дисплея "бегущей" строки "Периферийные устройства ЭВМ" из (12,40) в (12,10) - Assembler
Нужно написать две программы вот их условия: 1.Составить программу для вывода на экран дисплея "бегущей" строки "Периферийные...

Заменить во вводимом тексте каждое слово "ЭВМ" словом "машина" - Assembler
Здравствуйте. Поможете разобраться с ниже приведенной задачей: Заменить во вводимом тексте каждое слово « ЭВМ » словом « машина ...

28
zzzyyyxxx
761 / 305 / 11
Регистрация: 27.05.2011
Сообщений: 704
19.10.2011, 12:21 #16
alexcoder, ты читал тему? там не сказано, что всё от а до я делать надо,
там просто возведение в квадрат.
я понимаю Mikl___ и ты умные люди, но зачем разводить такие споры, по мелочам?
0
nitromiha
84 / 12 / 1
Регистрация: 24.01.2011
Сообщений: 292
Записей в блоге: 1
19.10.2011, 19:32  [ТС] #17
Цитата Сообщение от Mikl___ Посмотреть сообщение
с чего вдруг программы стали измерятся в "страницах программного кода"?
да это просто один мой знакомый сказал что слышал такое про ассемблер))) а страници - это для того, чтобы показать что это очень сложно!! и много кода!)))
0
alexcoder
1549 / 694 / 93
Регистрация: 03.06.2009
Сообщений: 3,785
Завершенные тесты: 1
19.10.2011, 21:51 #18
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
; Требуется директива .286C или выше.
outfloat proc   near
        push    ax
        push    cx
        push    dx
; Формируем кадр стэка, чтобы хранить в нём десятку
; и ещё какую-нибудь цифру.
        push    bp
        mov     bp, sp
        push    10
        push    0
; Проверяем число на знак, и если оно отрицательное,
        ftst
        fstsw   ax
        sahf
        jnc     @of1
; то выводим минус
        mov     ah, 02h
        mov     dl, '-'
        int     21h
; и оставляем модуль числа.
        fchs
; Пояснение далее пойдёт на примере.   ; ST(0) ST(1) ST(2) ST(3) ...
; Отделим целую часть от дробной.      ; 73.25 ... что-то не наше
@of1:   fld1                           ;  1    73.25 ...
        fld     st(1)                  ; 73.25  1    73.25 ...
; Остаток от деления на единицу даст дробную часть.
        fprem                          ;  0.25  1    73.25 ...
; Если вычесть её из исходного числа, получится целая часть.
        fsub    st(2), st              ;  0.25  1    73    ...
        fxch    st(2)                  ; 73     1     0.25 ...
; Сначала поработаем с целой частью. Считать количество цифр будем в CX.
        xor     cx, cx
; Поделим целую часть на десять,
@of2:   fidiv   word ptr [bp - 2]      ;  7.3   1     0.25 ...
        fxch    st(1)                  ;  1     7.3   0.25 ...
        fld     st(1)                  ;  7.3   1     7.3   0.25 ...
; отделим дробную часть - очередную справа цифру целой части исходного числа,-
        fprem                          ;  0.3   1     7.3   0.25 ...
; от чатсного оставим только целую часть
        fsub    st(2), st              ;  0.3   1     7     0.25 ...
; и сохраним цифру
        fimul   word ptr [bp - 2]      ;  3     1     7     0.25 ...
        fistp   word ptr [bp - 4]      ;  1     7     0.25 ...
        inc     cx
; в стэке.
        push    word ptr [bp - 4]
        fxch    st(1)                  ;  7     1     0.25 ...
; Так будем повторять, пока от целой части не останется ноль.
        ftst
        fstsw   ax
        sahf
        jnz     short @of2
; Теперь выведем её.
        mov     ah, 02h
@of3:   pop     dx
; Вытаскиваем очередную цифру, переводим её в символ и выводим.
        add     dl, 30h
        int     21h
; И так, пока не выведем все цифры.
        loop    @of3                   ;  0     1     0.25 ...
; Итак, теперь возьмёмся за дробную часть, для начала проверив её существование.
        fstp    st(0)                  ;  1     0.25 ...
        fxch    st(1)                  ;  0.25  1    ...
        ftst
        fstsw   ax
        sahf
        jz      short @of5
; Если она всё-таки ненулевая, выведем точку
        mov     ah, 02h
        mov     dl, '.'
        int     21h
; и не более шести цифр дробной части.
        mov     cx, 6
; Помножим дрообную часть на десять,
@of4:   fimul   word ptr [bp - 2]      ;  2.5   1    ...
        fxch    st(1)                  ;  1     2.5  ...
        fld     st(1)                  ;  2.5   1     2.5  ...
; отделим целую часть - очередную слева цифру дробной части исходного числа,-
        fprem                          ;  0.5   1     2.5  ...
; оставим от произведения лишь дробную часть,
        fsub    st(2), st              ;  0.5   1     2    ...
        fxch    st(2)                  ;  2     1     0.5  ...
; сохраним полученную цифру во временной ячейке
        fistp   word ptr [bp - 4]      ;  1     0.5  ...
; и сразу выведем.
        mov     ah, 02h
        mov     dl, [bp - 4]
        add     dl, 30h
        int     21h
; Теперь, если остаток дробной части ненулевой
        fxch    st(1)                  ;  0.5   1    ...
        ftst
        fstsw   ax
        sahf
; и мы вывели менее шести цифр, продолжим.
        loopnz  @of4                   ;  0     1    ...
; Итак, число выведено. Осталось убрать мусор из стэка.
@of5:   fstp    st(0)                  ;  1     ...
        fstp    st(0)                  ;  ...
; Точнее, стэков.
        leave
        pop     dx
        pop     cx
        pop     ax
        ret
outfloat endp
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
value_s2f   dw  0           ;переменая для функции преобразования строки в число
 
 
;+==============================================+
;|          ПЕРЕВОД ИЗ STRING В FLOAT           |
;+==============================================+
;| SI - указатель на строку                     |
;+----------------------------------------------+
;| ST(0) - преобрезованное число                |
;| cf=1 если в строке ошибка            |
;+==============================================+
STRTOFLOAT  PROC
    jmp     @STARTCONVERSATION_S2F  ; стартуем в рабочую область
@STARTCONVERSATION_S2F:
    pusha
    mov     value_s2f, 0            ; обнуляем локальную переменную
    xor     bx, bx              ; очищаем указатель позиции
    cmp byte ptr [si], '-'      ; проверяем на отрицательность
    jne     @POSITIVE_S2F       ; число не отрицательное
    inc     bx                  ; число отрицательное, увеличиваем позицию
@POSITIVE_S2F:
    mov     value_s2f, 10       ; загружаем число в переменную
    fild        value_s2f           ; загружаем в стэк число 10
    fldz                            ; загружаем в стэк число 0
@REPEAT_BEFORE:
    mov     al, byte ptr si[bx]     ; получаем символ
    cmp al, byte ptr '.'            ; проверяем точка ли это
    je      @ISPOINTBEFORE  ; точка - идем дальше
    cmp al, byte ptr 13         ; проверяем конец ли строкиа
    je      @ENDASINT       ; уже конец и хватит искать дроби
    cmp al, '0'             ; если текущий символ не цифра
    jc  @END_S2F_ERR            ; то выход с ошибкой
    cmp     al,'9'
    ja  @END_S2F_ERR
    sub     al, 30h             ; делаем из CHAR - INT
    mov     byte ptr value_s2f, al  ; копируем в память
    fiadd   value_s2f           ; складываем из тем, что есть в стэке
    fmul    st(0), st(1)            ; умножаем на 10
    inc     bx                  ; увеличиваем указатель
    jmp     @REPEAT_BEFORE  ; повторяем
@ISPOINTBEFORE:
    inc     bx                  ; увеличиваем указатель
    fdiv        st(0), st(1)            ; делим число на 10, т.к. оно уже больше
    fxch        st(1)               ; меняем местами регистры
    mov     al, byte ptr 13         ; ищем символ конца строки
@FINDNEXT:
    cmp si[bx], al              ; ищем конец строки
    je      @FINDEND            ; нешел конец строки
    inc     bx                  ; получаем следующий адрес символа
    jmp     @FINDNEXT           ; не нашел, еще ищем
@FINDEND:
    dec     bx                  ; переходим на предыдущий символ
    fldz                            ; загружаем в стэк число 0
@REPEAT_AFTER:
    mov     ax, word ptr si[bx]     ; получаем символ
    cmp al, byte ptr '.'            ; проверяем точка ли это
    je      @WASPOINTAFTER  ; точка - идем дальше
    cmp al, '0'         ; если текущий символ не цифра
    jc  @END_S2F_ERR            ; то выход с ошибкой
    cmp     al,'9'
    ja  @END_S2F_ERR
    sub     al, 30h             ; делаем из CHAR - INT
    mov     byte ptr value_s2f, al  ; копируем в память
    fiadd   value_s2f           ; складываем из тем, что есть в стэке
    fdiv        st(0), st(1)            ; делим на 10
    dec     bx                  ; декрементируем указатель
    loop    @REPEAT_AFTER   ; повторяем
@WASPOINTAFTER:
    fxch        st(1)               ; меняем число 10 и остаток местами
    fxch        st(2)               ; меняем целое и 10 местами
    faddp   st(1)               ; складываем число до и после запятой
    fxch        st(1)               ; меняем местами результат и 10
    fistp       value_s2f           ; извлекаем из стэка 10
    jmp     @FULLEND            ; полный конец процедуры
@ENDASINT:
    fdiv        st(0), st(1)            ; делим число на 10, т.к. оно уже больше
    fxch        st(1)               ; меняем местами регистры
    fistp       value_s2f           ; извлекаем из стэка 10
@FULLEND:
    cmp byte ptr [si], '-'      ; проверяем на отрицательность
    jne     @END_S2F            ; число не отрицательное
    fchs                            ; число отрицательное, меняем знак
@END_S2F:
    popa                        ; выгружаем все регистры
    clc                     ;ошибки нет
    ret                         ; возврат из процедуры
 
@END_S2F_ERR:
    popa                        ; выгружаем все регистры
    fistp value_s2f             ;очищаем st0
    stc                 ;ошибка
    ret                         ; возврат из процедуры
STRTOFLOAT  ENDP
P.S. Может кому пригодятся
8
Mikl___
Заблокирован
Автор FAQ
20.10.2011, 11:28 #19
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
.686p
.model flat
includelib user32.lib
include windows.inc
extern _imp__MessageBoxA@16:dword
.code
start:  fld x
    call outfloat
    push 0
    push 0
    push offset String
    push 0
    call _imp__MessageBoxA@16
    retn
outfloat proc
    mov edi,offset String
    fldz
    fcomip st,st(1);Проверяем число на знак, и если оно отрицательное,
        jc @of1
    mov al,'-'; то выводим минус 
    stosb
        fchs; и оставляем модуль числа.
@of1:   fld st
    fstcw [control]
    or [control],110000000000b
    fldcw [control];делаем округление к нулю
    frndint                 
    fsub st(1),st           
    fbstp [bcdstr]           
    mov ecx,9    ;в десятом байте информация о знаке числа
b2:     cmp byte ptr [ecx-1+bcdstr],0            
    loopz b2;пропускаем незначащие (нулевые) разряды слева
    mov al,byte ptr [ecx+bcdstr];загружаем первую значащую пару разрядов
        cmp al,9  ;если в старшей тетраде 0 - пропустить старшую тетраду
    ja b4
    add al,30h  ;младшую тетраду переводим в ASCII
    stosb   
        jecxz b1
b4:     movzx ax,byte ptr [ecx+bcdstr];распаковываем остальные разряды числа
    ror ax,4    ;выделяем старшую и младшую тетрады
    shr ah,4
    add ax,3030h;переводим в ASCII-код
    stosw; и сразу выведем
    loop b4
b1: fldz; теперь возьмёмся за дробную часть, для начала проверив её существование.
        fcomip st,st(1)
        jz @of5
    mov al,'.'; Если она всё-таки ненулевая, выведем точку
    stosb
        mov ecx,6
@of4:   push eax
    fimul y; множим дрообную часть на десять
        fld st
        frndint; отделим целую часть
        fsub st(1), st; оставим от произведения лишь дробную часть,
        fistp dword ptr [esp]; сохраним полученную цифру во временной ячейке
    pop eax
        add al,30h
        stosb; и сразу выведем
    fldz
        fcomip st,st(1);если остаток дробной части ненулевой
        loopnz  @of4;если вывели менее шести цифр, продолжим.
@of5:   retn
outfloat endp
.data
String db 50 dup (0)
x dt -70600500043210.92345678
y dd 10
bcdstr dt ?
control dw ?
end start
0
raavaa
0 / 0 / 0
Регистрация: 13.04.2011
Сообщений: 73
20.10.2011, 14:05 #20
Подскажите пожалуйста а вот если мне например надо уровнение возвести в квадрат (2+n)в квадрате
как это сделать?
0
zzzyyyxxx
761 / 305 / 11
Регистрация: 27.05.2011
Сообщений: 704
20.10.2011, 17:16 #21
Assembler
1
2
3
4
5
6
...
    mov ax,2
    add ax,n
    mov bx,ax
    mul bx
    ...
0
Vadimych
634 / 477 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
20.10.2011, 18:03 #22
zzzyyyxxx, mov bx,ax - лишнее. mul ax достаточно.
1
zzzyyyxxx
761 / 305 / 11
Регистрация: 27.05.2011
Сообщений: 704
20.10.2011, 18:15 #23
хм..., спасибо за замечание. я как, когда-то запомнил, что в справочнике(по примерам) при умножении AX и BX и всё, думал, что так и надо, а тут оказывается и такой вариант есть.
0
taras atavin
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
20.10.2011, 18:24 #24
Цитата Сообщение от Mischanja Посмотреть сообщение
Вместо АХ нужно пользоваться AL, хотя я могу быть не прав, объясните пожалуйста
AX и есть аккумулятор, а на современных машинах EAX. AL ни какой не аккумулятор, а младший байт аккумулятора, но если разрядность операндов позволяет, то используется вместо всего аккумулятора. На современных машинах и AX нифига не аккумулятор, а только его младшее слово, но но если разрядность операндов позволяет, то используется вместо всего аккумулятора.

Добавлено через 2 минуты
Цитата Сообщение от Mischanja Посмотреть сообщение
как она знает что именно делим BH/AX
по разрядности явного операнды: разрядности обоих операндов равны, BH - байт, значит второй операнд AL, а если
Assembler
1
DIV BX
, то второй операнд AX, так как BX - слово.
0
Vadimych
634 / 477 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
20.10.2011, 19:12 #25
Цитата Сообщение от zzzyyyxxx Посмотреть сообщение
спасибо за замечание
Не за что.
0
murderer
3211 / 1434 / 78
Регистрация: 06.10.2010
Сообщений: 3,177
20.10.2011, 19:25 #26
Mikl___
Немного короче на FASM.


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
42
43
44
45
46
47
48
49
50
51
52
format PE GUI 4.0
entry start
include 'include\win32ax.inc'
section '' code readable writeable executable import data
library user32,'user32.dll'
import user32,\
       MessageBox,'MessageBoxA'
start: fld    [x]
 call   outfloat
 invoke MessageBox,0,String,0,0
 retn
outfloat:
    mov    edi,String
    ftst
    fstsw  ax
    shr    eax,8
    and    eax,1
    mov    byte[edi],'-'
    add    edi,eax
    fabs
    fld1        ;вычисляем длину целой части числа
    fld   st1
    fyl2x
    fldl2t
    fdivp
    fistp dword[esp-4]
    cmp   dword[esp-4],1
    adc   dword[esp-4],0
    mov   ecx,[esp-4]       ;ecx - длина целой части
    @@:fidiv [y]       ;нормализуем число (приводим к виду 0.xxx)
    loop @b
    mov   ecx,[esp-4]
    @@:fimul  [y]
       fld    st0
       fisttp word[esp-2]      ;сохраняем целую часть (SSE3)
       fisub  word[esp-2]
       mov    al,[esp-2]
       add    al,'0'
       stosb
       ftst
       fstsw  ax
       test   ax,100000000000000b
    loope @b
    mov al,'.'
    stosb
    sub ecx,1
    jc @b
    mov    byte[edi-1],0      ;завершающий ноль
retn
x      dt -3.92345678
y      dw 10
String rb 128
2
Mikl___
Заблокирован
Автор FAQ
22.10.2011, 04:49 #27
Вот, еще упростил, правда не будет работать с бесконечностью и нечислом
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
.586
.model flat
include windows.inc
includelib user32.lib
extern _imp__MessageBoxA@16:dword
.code
start:  fld x
        xchg ebx,eax      ;ebx:=0
        mov edi,offset String
        fldz
        fcomip st,st(1) ;сравниваю число с нулем
        jnz @f
        mov byte ptr [edi],'0'
        jmp b0
@@:     jb @f
        mov al,'-'      ;если отрицательное вывожу знак минус
        stosb
        fchs            ;и получаю модуль числа
@@:     fstcw control   ;устанавливаю режим "округление к нулю"
        or control,0C00h
        fldcw control
        fld st          ;дублирую содержимое st(0) в st(1)
        frndint         ;округляю до целого содержимое st(0)
        fsub st(1),st   ;в st(1) остается дробная часть
        jnz @f
        mov al,'0'
        stosb
        jmp b3
@@:     call bcd2str
        fldz
        fcomip st,st(1)
        jz b0
        mov al,'.'
        stosb
        inc ebx               ; ebx:=1
        fmul y          ;умножаю дробную часть на 1.0e17
        call bcd2str
b0:     push 0
        push 0
        push offset String
        push 0
        call _imp__MessageBoxA@16
        retn
bcd2str proc
        fbstp temp
        mov ecx,9       ;в десятом байте информация о знаке числа
        test ebx,ebx; ebx = 0?
        jnz b1
@@:     cmp byte ptr [ecx-1+temp],0
        jnz b1
        loop @b         ;пропускаем незначащие (нулевые) разряды слева
b1:     mov al,byte ptr [ecx-1+temp];загружаем первую значащую пару разрядов
        cmp al,9        ;если в старшей тетраде 0 - пропустить старшую тетраду
        ja @f
        add al,30h      ;младшую тетраду переводим в ASCII
        stosb
        dec ecx
        jz b2
@@:     movzx ax,byte ptr [ecx-1+temp];распаковываем остальные разряды числа
        ror ax,4        ;выделяем старшую и младшую тетрады
        shr ah,4
        add ax,'00'     ;переводим в ASCII-код
        stosw
        loop @b
b2:     retn
bcd2str endp
x dt -123456789.987654321
control dw ? ;переменная под содержимое регистра CWR
temp dt ?    ;переменная под BCD
y dq 1.0e17  ;множитель
String db 30 dup (0)
end start
0
zzzyyyxxx
761 / 305 / 11
Регистрация: 27.05.2011
Сообщений: 704
23.10.2011, 09:04 #28
Mikl___, решил проверить твою прогу
Assembler
1
28.            jmp b3          ;переход есть, а метка отсутствует.
0
Mikl___
Заблокирован
Автор FAQ
24.10.2011, 04:33 #29
zzzyyyxxx, sorry
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
.686
.model flat
include windows.inc
includelib user32.lib
extern _imp__MessageBoxA@16:dword
.code
start:  fld x
    xchg ebx,eax
    mov edi,offset String
    fldz
    fcomip st,st(1) ;сравниваю число с нулем
    jnz @f
    mov byte ptr [edi],'0'
    jmp b0
@@: jb @f
    mov al,'-'      ;если отрицательное вывожу знак минус
    stosb
    fchs            ;и получаю модуль числа
@@: fstcw control   ;устанавливаю режим "округление к нулю"
    or control,0C00h
    fldcw control
    fld st          ;дублирую содержимое st(0) в st(1)
    frndint         ;округляю до целого содержимое st(0)
    fsub st(1),st   ;в st(1) остается дробная часть
    fldz
    fcomip st,st(1) ;сравниваю число с нулем
    jnz @f
    mov al,'0'
    stosb
    jmp b3
@@: call bcd2str
    fldz
b3: fcomip st,st(1)
    jz b0
    mov al,'.'
    stosb
    inc ebx
    fmul y      ;умножаю дробную часть на 1.0e17
    call bcd2str
b0: push 0
    push 0
    push offset String
    push 0
    call _imp__MessageBoxA@16
    retn
bcd2str proc
    fbstp temp
    mov ecx,9   ;в десятом байте информация о знаке числа
    test ebx,ebx
    jnz b1
@@:     cmp byte ptr [ecx-1+temp],0
    jnz b1
    loop @b         ;пропускаем незначащие (нулевые) разряды слева
b1: mov al,byte ptr [ecx-1+temp];загружаем первую значащую пару разрядов
        cmp al,9    ;если в старшей тетраде 0 - пропустить старшую тетраду
    ja @f
    add al,30h  ;младшую тетраду переводим в ASCII
    stosb
    dec ecx
    jz b2
@@:     movzx ax,byte ptr [ecx-1+temp];распаковываем остальные разряды числа
    ror ax,4        ;выделяем старшую и младшую тетрады
    shr ah,4
    add ax,'00' ;переводим в ASCII-код
    stosw
    loop @b
b2: retn
bcd2str endp
x dt -0.123456789;.987654321
control dw ? ;переменная под содержимое регистра CWR
temp dt ?    ;переменная под BCD
y dq 1.0e17  ;множитель
String db 30 dup (0)
end start
1
24.10.2011, 04:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2011, 04:33
Привет! Вот еще темы с ответами:

Дана строка "ababab", из этого слова надо получить "aaa" - Assembler
Собственно сабж. Дана строка "ababab", надо удалить буквы "b" и получить слово "ааа" Спасибо)

Как реализовать рекурсию через "call" и "ret"? - Assembler
kak realizovat rekursiu 4erez "call" i "ret"? nujno predstavit naturalnoe 4islo v dvoi4nom vide ispolzuya rekursiu i stacki please...

Найти букву "m" в строке "pridmet assembler" - Assembler
2.Дана строка. Найти букву "m" в строке "pridmet assembler" . Букву и номер буквы вывести на экран

Рассматривая массив из 8 пятиразрядных слов, найти "исключающее или" всех 8 слов для выражения "10101" - Assembler
У меня дан массив из 5 байт. Рассматривая его как массив из 8 пятиразрядных слов, найти "исключающее или" всех 8 слов для выражения...


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

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

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