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

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

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

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

Есть строка. Нужно сделать так, чтобы "re" и "not" заменялись на "***".
Есть строка. Нужно сделать так, чтобы "re" и "not" заменялись на "***". Data...

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

Необходимо строку тип ""str1" "str2"",0 преобразовать в строку типа
Необходимо строку тип ""str1" "str2"",0 преобразовать в строку типа "str2",0...

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

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

Как реализовать рекурсию через "call" и "ret"?
kak realizovat rekursiu 4erez "call" i "ret"? nujno predstavit naturalnoe...

28
zzzyyyxxx
763 / 307 / 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
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
20.10.2011, 18:03 #22
zzzyyyxxx, mov bx,ax - лишнее. mul ax достаточно.
1
zzzyyyxxx
763 / 307 / 11
Регистрация: 27.05.2011
Сообщений: 704
20.10.2011, 18:15 #23
хм..., спасибо за замечание. я как, когда-то запомнил, что в справочнике(по примерам) при умножении AX и BX и всё, думал, что так и надо, а тут оказывается и такой вариант есть.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
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
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
20.10.2011, 19:12 #25
Цитата Сообщение от zzzyyyxxx Посмотреть сообщение
спасибо за замечание
Не за что.
0
murderer
3314 / 1461 / 133
Регистрация: 06.10.2010
Сообщений: 3,215
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
11375 / 5918 / 535
Регистрация: 11.11.2010
Сообщений: 10,934
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
763 / 307 / 11
Регистрация: 27.05.2011
Сообщений: 704
23.10.2011, 09:04 #28
Mikl___, решил проверить твою прогу
Assembler
1
28.            jmp b3          ;переход есть, а метка отсутствует.
0
Mikl___
Автор FAQ
11375 / 5918 / 535
Регистрация: 11.11.2010
Сообщений: 10,934
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
Привет! Вот еще темы с решениями:

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

Занести в стек "x" и "y". Внести "y" в bx (внести "x" в bx)
Препод задолбал своими вопросами, приходится снова просить помощи у вас. Вот...

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

Есть такие приколы, в которых задаётся вопрос, требующий ответ "ДА" или "НЕТ" (нет убегает).
Есть такие приколы, в которых задаётся вопрос, требующий ответ "ДА" или "НЕТ"....


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

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

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