Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 03.06.2012
Сообщений: 9

Поясните ТАСМ

05.06.2012, 18:43. Показов 2321. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые эксперты помогите разобраться с кодом, добавил свои но нужно по проще.
Заранее благодарен!!!
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
108
109
110
data segment para public 'data'
    mesA db "Vvedite A(ot 0 do 255): $"        ;$"означает окончание строки
    mesB db "Vvedite B(ot 0 do 255): $"
    mesAB db "A+B = $"
    mesC db "C = $"
    inErr db "Oshibka vvoda. Vvedite zanovo: $"
    endl db " ", 10, '$'
data ends
 
stk segment stack                ;сегмент стека
    db 256 dup ('?')          ;Отводим под стек 256 байт.
stk ends                         ;Закроем сегмент стека
 
code segment para public 'code' ;начало сегмента кода
 
coutStr macro a         ;вывод строки
    push ax         ;положить значение в стек ах 
    push dx         ;положить значение в стек dх  
    mov ah, 9       ;ah=9 функция 21h прерывания       
    mov dx, offset a    ;выводит строку на экран,адрес который хранится в регистре dx
    int 21h                 ;прерывание для ввода/вывода на экран   
    pop dx                  ;   извлекаем из стека очередное число
    pop ax
endm
 
calc macro                       ;вызов процедуры
    add ax, dx               ;сложение
    coutStr endl             ;массив для ввода числа
    coutStr mesAB
    call print 
    and ax, 0101010101010101b ;обнуляем нечетные биты
    coutStr endl
    coutStr mesC
    call print 
endm
 
main proc
    assume cs:code, ds:data, ss:stk
    mov ax, data           ;занести адрес сегмента данных в регистр ax
    mov ds, ax             ;переслать содержимое ах врегистр ds
    coutStr mesA           ;вывод сообщения  
    call input         ;вызов процедуры mesA db "Vvedite A (см.нач.)
    push dx                ;записать  dx в стек 
    coutStr endl           ;посчитать 
    coutStr mesB           ;посчитать 
    call input             ;вызов процедуры  
    pop ax             ;Скопировать регистр флагов... pop ax    
    calc               ;a-ax,b-dx (процедура вычисления модуля)
        
    mov ax, 4c00h           пересылка 4c00h в регистр ax
    int 21h                 ;прерывание для ввода/вывода на экран
main endp                       ; Конец процедуры main
input proc          ;ввод  числа
    jmp start
startErr:
    coutStr endl            ;окончание строки
    coutStr inErr
start:
    mov cx, 3            счетчик сработает 3 раза
    xor dx, dx           ;обнуляем регистр dx
m1:                     
    xor ax, ax       ;обнуляем регистр ax        
    mov ah, 1h
    int 21h              ;прерывание для ввода/вывода на экран 
    sub al, 30h             
    cmp al, 9            ;операция сравнения           
    ja m2               
    xor bx, bx          ; Очищаем регистр bx  
    mov bl, al          
    xor ax, ax      ; Очищаем регистр AX
    mov al, dl          
    xor dx, dx      ; Очищаем регистр dx  
    mov dl, 10
    mul dl              
    cmp ah,0         ;операция сравнения   
    ja  startErr         
    xor dx, dx           ; Очищаем регистр dX 
    mov dl, al      
    add dx, bx        ;сложение     
    cmp dh, 0         ;операция сравнения
    ja startErr       ;выводит ошибку
    loop m1               ;цикл (если выведит ошибку то переход на m1)
m2:
    ret 0
input endp
 
print proc          ;выводит ax в двоичном
    push cx
    push bx                  ;выводит ax в двоичном
    push dx
    mov bx, ax
    push ax               ; заносим в стек результат         
    mov cx, 16          
cicl:                         ;метка 
    xor dx, dx        ; Очищаем регистр dX так как потом в dl положим 30       
    sal bx, 1         ;Сдвиг влево на 1 бит с учетом флага cf(sf -флаг переноса)         
    adc dl, 30h       ;dl=dl+30h+cf (сложение с учетом флага cf)        
    mov ah, 2         ;положить в ah 2-2 выводит на экран dl     
    int 21h                  ;прерывание для ввода/вывода на экран           
    loop cicl             ;cx=cx-1 если cx не равен нулю то на метку cicl иначе на следуюющую строчку 
    
    pop ax                    ; восстанавливаем использованые регистры   
    pop dx                    ; восстанавливаем использованые регистры 
    pop bx                    ; восстанавливаем использованые регистры 
    pop cx                    ; восстанавливаем использованые регистры
    ret 0                      ;возвращение из процедуры
endp
 
code ends
end main
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.06.2012, 18:43
Ответы с готовыми решениями:

Алгоритм суммы ТАСМ
Здравствуйте все ) Нужен совет, если что не так, подправьте мой ответ, пожалуйста ... Дело вот в чем ... Если суммировать числа,...

Вывод символа ТАСМ
В общем-то идиотская проблема, но не могу понять в чём причина. Требуется вывести подряд 20 символов ascii кода, начиная с 128-го. В...

ТАСМ 5.0 Спасите новичка
Говорят,все просто, но у меня сложности начались уже с того, что я не знаю, как запустить TASM. Может, мне кто-то распишет пошагово, что...

2
202 / 168 / 11
Регистрация: 30.05.2012
Сообщений: 703
06.06.2012, 10:25
Цитата Сообщение от alekseevov Посмотреть сообщение
но нужно по проще
Наверное, нужны построчные комментарии. Вот:
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
108
109
110
data segment para public 'data';сегмент данных
    mesA db "Vvedite A(ot 0 do 255): $"        ;$"означает окончание строки
    mesB db "Vvedite B(ot 0 do 255): $"
    mesAB db "A+B = $"
    mesC db "C = $"
    inErr db "Oshibka vvoda. Vvedite zanovo: $";сообщения
    endl db " ", 10, '$';код перевода строки
data ends;конец сегмента данных
 
stk segment stack                ;сегмент стека
    db 256 dup ('?')          ;Отводим под стек 256 байт.
stk ends                         ;Закроем сегмент стека
 
code segment para public 'code' ;начало сегмента кода
 
coutStr macro a         ;вывод строки
    push ax         ;положить значение в стек ах    
    push dx         ;положить значение в стек dх    
    mov ah, 9       ;ah=9 функция 21h прерывания    
    mov dx, offset a    ;выводит строку на экран,адрес который хранится в регистре dx
    int 21h                 ;прерывание для ввода/вывода на экран   
    pop dx                  ;   извлекаем из стека очередное число
    pop ax
endm
 
calc macro                       ;вызов процедуры
    add ax, dx               ;сложение
    coutStr endl             ;массив для ввода числа
    coutStr mesAB  
    call print ;вызываем вывод
    and ax, 0101010101010101b ;обнуляем нечетные биты
    coutStr endl;выводим перевод строки
    coutStr mesC;сообщение
    call print ;вывод
endm
 
main proc;главный код
    assume cs:code, ds:data, ss:stk;настройка сегментов
    mov ax, data           ;занести адрес сегмента данных в регистр ax
    mov ds, ax             ;переслать содержимое ах врегистр ds
    coutStr mesA           ;вывод сообщения  
    call input         ;вызов процедуры mesA db "Vvedite A (см.нач.)
    push dx                ;записать  dx в стек 
    coutStr endl           ;посчитать 
    coutStr mesB           ;посчитать 
    call input             ;вызов процедуры  
    pop ax             ;Скопировать регистр флагов... pop ax    
    calc               ;a-ax,b-dx (процедура вычисления модуля)
        
    mov ax, 4c00h           пересылка 4c00h в регистр ax
    int 21h                 ;прерывание для ввода/вывода на экран
main endp                       ; Конец процедуры main
input proc          ;ввод  числа
    jmp start
startErr::блок операций при ошибке
    coutStr endl            ;окончание строки
    coutStr inErr ;'выводим сообщение
start:
    mov cx, 3            счетчик сработает 3 раза
    xor dx, dx           ;обнуляем регистр dx
m1:                     
    xor ax, ax       ;обнуляем регистр ax       
    mov ah, 1h
    int 21h              ;читаем цифру
    sub al, 30h             
    cmp al, 9            ;если не цифра, то выход из ввода         
    ja m2               
    xor bx, bx          ; Очищаем регистр bx    
    mov bl, al         ;заносим в BL введенную цифру
    xor ax, ax      ; Очищаем регистр AX
    mov al, dl          
    xor dx, dx      ; Очищаем регистр dx    
    mov dl, 10
    mul dl              ;умножаем на 10
    cmp ah,0         ;если больше 256, то ошибка 
    ja  startErr         
    xor dx, dx           ; Очищаем регистр dX 
    mov dl, al      ;восстанавливаем
    add dx, bx        ;плюсуем к старому значению
    cmp dh, 0         ;сравниваем с 65536, если больше
    ja startErr       ;выводит ошибку
    loop m1               ;цикл (если не выведет ошибку то переход на m1)
m2:
    ret 0;возврат и конец процедуры
input endp
 
print proc          ;выводит ax в двоичном
    push cx
    push bx                  ;сохраняем меняемые регистры
    push dx
    mov bx, ax
    push ax               ; заносим в стек результат         
    mov cx, 16       ;16 раз   
cicl:                         ;метка 
    xor dx, dx        ; Очищаем регистр dX так как потом в dl положим 30        
    sal bx, 1         ;Сдвиг влево на 1 бит с учетом флага cf(sf -флаг переноса)        
    adc dl, 30h       ;dl=dl+30h+cf (сложение с учетом флага cf)        
    mov ah, 2         ;положить в ah 2-2 выводит на экран dl        
    int 21h                  ;прерывание для ввода/вывода на экран          
    loop cicl             ;cx=cx-1 если cx не равен нулю то на метку cicl иначе на следуюющую строчку 
    
    pop ax                    ; восстанавливаем использованые регистры   
    pop dx                    ; восстанавливаем использованые регистры 
    pop bx                    ; восстанавливаем использованые регистры 
    pop cx                    ; восстанавливаем использованые регистры
    ret 0                      ;возвращение из процедуры
endp
 
code ends;конец сегмента кода
end main;конец программы
Добавлено через 4 часа 15 минут
Вот с комментами код:
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
.model tiny;модель памяти COM программ
.code;сегмент кода
.486;поддерживаются инструкции 486 процессора
org 100h;оставляем PSP
 
numout macro c      ;Выводит число в двоичном виде
    mov ah,2;задаем функцию ввода
        mov bx,[c];,берем элемент
        bsr cx,bx;находим единичный бит первый
    inc cx;увеличиваем на 1 (отсчет с нуля идет)
    push cx;в стек сохраняем
    neg cx;
    add cx,16;зеркальное отражение номера
    shl bx,cl;уничтожаем все биты до 1
    pop cx;достаем номер позиции (сколько разрядов есть кроме начальных нулевых).
;В результате мы выкидываем начальные нули из вывода
m1: xor dx,dx;обнуляем DX
    shl bx,1;получаем бит
    adc dl,'0';задаем что выводим: 0 или 1 (если бит был установлен, то CF = 1 '0'+1='1')
    int 21h;выводим цифру
    loop m1; и так делаем для всех оставшихся цифр
endm
 
count macro a,b,c;макрос подсчета
    mov ax,[b];достаем B
    shl ax,1;делим на 2
    add ax,[a];плюсуем A
    mov [c],ax;результат сохраняем в ячейку C
endm
 
main:;точка входа
;---------------Ввод A-------------------
    mov  ah,9           
    mov  dx,offset messageA
    int  21h;первое сообщение
    push offset a           ;Параметр для numin - адрес a.
    call numin;вызываем ввод
;---------------Ввод B-------------------
    mov  ah,9           
    mov  dx,offset messageB
    int  21h;второе сообщение
    push offset b
    call numin;вводим в переменную B
;----------------C=A+B*2
    count a,b,c;считаем по формуле
;----------------Проверка 3 бита
    mov ah,9    ;процедура вывода сообщения
        mov  cx,[c];читаем значение
    test cx,8;проверка 3 бита
    jnz @1;если не установлен пропускаем следующие строки
    shr cx,1;делим на 2
    mov dx,offset msgc_2; выводим другое сообщение
    mov [c],cx;сохраняем в C половину значения
    jmp @2;и на вывод
 
;--------------Вывод С
@1: mov dx,offset messageC;
@2: int 21h;выводим сообщение
    numout c  ;и число 
     
    mov AH, 08h
    int 21h;ожидаем нажатия клавиши, чтобы пользователь мог прочитать
 
    mov AX, 4C00h
    int 21h  ;выход из программы    
;-----------------------Выход из СОМ-программы
ret
 
numin:;ввод числа
    mov al,'0'     ;код 0 сохраняем 
    xor bx,bx;BX обнуляем
    input:cbw            ;ah=0
          sub  al,'0'        ;Преобразуем символ в цифру.
          imul bx,bx,10      ;bx=10*bx
          add  bx,ax         ;bx=bx+ax
          mov  ah,1      ;Функция символа ввода с эхом(код в al). 
          int  21h
          cmp  al,13         ;Закончили ввод(Enter)?
    jne input            ;Нет, вводим след. символ(цифру числа).
    mov bp,sp            ;В bp адрес вершины стека.  
    mov bp,ss:[bp+2]     ;В bp адрес числа.
    mov ds:[bp],bx           ;Записываем туда преобразованное число.
ret 2                ;Освобождение стека от переданного параметра и выход из подпрограммы.
 
;-----------------------Данные  
messageA db 'A=$';сообщения
messageB db 10,13,'B=$'   ;10 - ASCII-код перехода на новую строку, 13 - ASCII-код возврата каретки
messageC db 10,13,'C=A+B*2=$'
msgc_2  db 10,13,'c/2=$'
a dw 0;переменные
b dw 0
c dw 0
end main;конец кода
2
1 / 1 / 0
Регистрация: 03.06.2012
Сообщений: 9
07.06.2012, 06:36  [ТС]
Огромное спасибо!!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2012, 06:36
Помогаю со студенческими работами здесь

стал глючить тасм/тлинк
всем привет! сидел сегодня, разбирался с асм, все работало. потом начались глюки. вместо hello! пишет какие то знаки, а потом hello! . на...

Ввод вывод на ТАСМ (переделал тему)
Препод задал на завтра, а все не успеваю, нужно: 1)Написать программу для ввода с клавиатуры строчку символов и вывода его на экран с...

Перевод числа из 16-й в 10-ю систему исчисления
Доброго времени суток.Такая вот задачка: Напишите процедуру pereved (перевод), которая входной байт в шестнадцатиричной системе...

Как запустить Тасм через dosbox?
не могли бы вы написать как запустить прогу через сие чудо. Тасм лежит d:\tasm\bin

Поясните работу с потоками.
Помогите разобраться в коде ;Имеется n предметов, веса которых равны a1, a2,…,aN (целые числа от 1 до 10^8). ;Выбрать из них такое...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru