57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 452
1
TASM

Проверить правильность написаной программы ,написать \исправить комментарии к коду

29.12.2019, 05:30. Показов 1212. Ответов 4
Метки нет (Все метки)

Зравстуйте , задача:
Создать * .exe программу, которая реализует вычисления, заданного вариантом выражения и сохраняет результат в памяти.
Входные операнды А, В, С, D, E, F считать беззнаковыми и длиной в байтах, согласно индекса;
К - константа, длина которой определяется значением (согласно варианту). Для ее описания следует использовать директиву EQU.
Само выражение , которое необходимо посчитать на скрине.
только начал изучать тасм , есть такой код:

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
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
K dw 7AA0h, 2023h
A dw 016h
B dw 012h
C db 08h
D dw 0002,2000h
E dw 0200h
Temp1 dw 0000h,0000h    ; A*B - 2 байт *на  2 байт, результат - 4 байт
Temp2 dw 0000h,0000h    ; Temp1-С - ,4 байт - 1 байт, результат - 4 байт
Temp4 dw 0000h               ; (D/E) - 4 байт \ на 2 байт, результат - 2 байт
Temp5 dw 0000h,0000h    ; K+Temp4 - 4 байт + 2 байт, результат - 5 байт
X dw  0000h,0000h,0000h ;промежуточный(4)+К(4 байт+  4 байти,результат-8 байт)
 
.CODE
Start:
 mov ax, @data                                           ;созд. переменных
 mov ds, ax                                                 ;п. в сегмент данных
                                                                  ;A*B                1 операция
 mov ax, A                                                   ;помещение в регистр ах 1 опеперанда
 mov bx, B                                                   ;п. в р. бх  2 оп. 
 mul bx                                                        ;умн. п. р-т в бх
 mov Temp1,ax                                            ;п. знач. ах в нов . перем.
 mov Temp1+2,dx                                        ;п. во 2 ячейку. пер. Temp1 знач. р. дх
 mov ax,0                                                    ;  занул. ах
 mov bx,0                                                    ; занул. бх
                                                                  ;Temp1-C            2 операция
 mov ax, Temp1                                           ; п. знач. в ах
 mov dx, Temp1+2                                       ;п. в дх знач. 2 яч. переменной Temp1
 mov bl,C                                                     ;  переход на  адрес  переменной с 
 sub ax,bx                                                   ;  вычит. без заема  значения c рег. бх от значения с ах 
 sbb dx,cx                                                    ;  вычит. с заемом значения c рег. сх от значения с дх 
 mov Temp2,ax                                            ; п . рез. с ах в 1 яч. темп2  
 mov Temp2+2,dx                                        ; п.  рез с дх во 2 яч. темп2                
 mov ax,0                                                    ;ах занул. регистров
 mov dx,0                                                    ;дх
 mov bx,0                                                    ;бх
                                                                   ;D/E             3 операция
 mov ax,D+2                                                ;п. перем. д которая раздел. на 2 ч.
 mov dx,D                                                    ;  DX:AX 00022000h;
 mov bx,E                                                   ;п. перем. e в бх
 div bx                                               ;выполн. деления, р-т в  АX, остаток в DX
 mov Temp4,ax                                            ;п .промежут. р-т в темп4     
 mov ax,0                                                    ;занул .рег. 
 mov dx,0                                                    ;
 mov bx,0                                                     ;
                                                                   ;Temp2+Temp4      4 операция
 mov ax,Temp2                                             ;
 mov dx,Temp2+2                                         ;
 mov bx,Temp4                                             ;
 mov cx,Temp4+2                                          ;
 add ax,bx                                                     ;
 adc dx,cx                                                     ;
 mov Temp5,ax                                             ;
 mov Temp5+2,dx;
                                                                   ;Temp5+K
 mov ax,Temp5;
 mov bx,K+2;
 mov cx,K;
 add ax,bx;
 adc dx,cx;
 mov X,ax;
 mov X+2,dx;
 mov ah,4Ch;
 int 21h;
end Start;
Не могли б , вы , дописать\исправить комментарии и объяснить мне что происходит в этих строках :
Assembler
1
sbb dx,cx
разве в сх есть уже есть какое-то значение?
Assembler
1
mov Temp1+2,dx
+2 это вторая ячейка\переменная ?почему для обращения к ней не используется "+1"?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Миниатюры
Проверить правильность написаной программы ,написать \исправить комментарии к коду  
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2019, 05:30
Ответы с готовыми решениями:

Написать комментарии к коду программы.
var Form1: TForm1; s1,s2 :string; i:Integer; implementation {$R *.dfm} procedure...

Написать комментарии к коду программы.
Помогите пожалуйста объяснить строчки в программе Program doc; var n,m,k,p,s :integer; begin...

Проверить правильность написания блок-схемы к имеющемуся коду
Я каждую процедуру не писал отдельно, как это принято, а объединил все процедуры в одну общую...

Комментарии к коду программы на Delphi
Здравствуйте! Скажите пожалуйста, можно ли на Delphi разработать программу по автоматическому...

4
Модератор
Эксперт по электронике
7651 / 3815 / 1483
Регистрация: 01.02.2015
Сообщений: 11,813
Записей в блоге: 2
29.12.2019, 23:18 2
Лучший ответ Сообщение было отмечено plzvtl как решение

Решение

Нет, код неправильный.
Вы правильно умножаете A*B, сохраняете результат. Но дальше не очень корректно выполняете вычитание (A*B-C). Нужно учитывать перенос.
Из-за условия Входные операнды А, В, С, D, E, F считать беззнаковыми и длиной в байтах, согласно индекса код несколько упрощается, иначе пришлось бы выполнять расширение размеров операндов с учётом знака.
Итак, (A*B-C)
Assembler
1
2
3
4
5
mov ax, [A]
mul [B]
sub al, [C]
sbb ah, 0
sbb dx, 0
И теперь можете временно сохранить результат из dx:ax или в переменную или в другие регистры, т.к. при делении D/E будут задействованы dx:ax.

Когда вы загружаете D в dx:ax учтите, что в процессорах Intel по младшим адресам - младшие разряды, т.е.
Assembler
1
2
mov ax, [D]
mov dx, [D+2]
После деления получите результат размером со слово (2 байта). При сложении D/E с (A*B-C) потребуется учесть перенос в старший разряд.

Константу K вы определили не по заданию - не через EQU.
При сложении с константой K потребуется брать старшее и младшее слова от K и при сложении старшего слова учесть перенос.
Воспользуйтесь директивами LOW и HIGH.
1
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 452
29.12.2019, 23:46  [ТС] 3
ФедосеевПавел, спасибо учту , пожалуйста , подскажите еще с вопросом о
Assembler
1
2
 
sbb dx,cx
и еще одно , это переход на адрес С ?
Assembler
1
mov bl,C
а то в методичке дан код , я гуглю отдельные инструкции и что-то сложить все вместе не получается.

Добавлено через 12 минут
а , похоже понял , С тут db , и мы используем мув для 8 младших байт С (всего в данном случае).Но для чего оно тут не понял все ровно.
0
Модератор
Эксперт по электронике
7651 / 3815 / 1483
Регистрация: 01.02.2015
Сообщений: 11,813
Записей в блоге: 2
29.12.2019, 23:47 4
А где определена метка C, чтобы на неё переходить?
Разве sbb - переход на метку?
Разве mov - переход на метку?

Я вам показал один из правильных вариантов, как выполнить (A*B-C). Прочтите.
Зачем вы снова подсовываете ошибочные строки. Да, вы правильно отметили, что cx неинициализирован и не заполняется неявно в ходе вычислений (как dx при умножении).
Видимо, вы некорректно скопировали или что-то не учитываете, но строка 34 из кода сообщения #1, действительно неуместна. Может быть в методичке вычитание было двух регистровых пар.
1
Модератор
Эксперт по электронике
7651 / 3815 / 1483
Регистрация: 01.02.2015
Сообщений: 11,813
Записей в блоге: 2
05.01.2020, 22:35 5
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
.model small
 
.stack 200h
 
.data
        A       dw      1234
        B       dw      2345
        C       db      45
        D       dd      123456
        E       dw      1234
        K_low   =       2023h
        K_high  =       7AA0h
.data?
        X       dd      ?
.code
 
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
 
        ;A*B
        mov     ax,     [A]
        mul     [B]
        ;A*B-C
        sub     al,     [C]
        sbb     ah,     0
        sbb     dx,     0
 
        mov     bx,     ax
        mov     cx,     dx
        ;D/E
        mov     ax,     word ptr[D]
        mov     dx,     word ptr[D+2]
        div     [E]
        ;A*B-C + D/E
        add     bx,     ax
        adc     cx,     0
        ;A*B-C + D/E + K
        add     bx,     K_low
        adc     cx,     K_high
        ;
        mov     word ptr[X],    bx
        mov     word ptr[X+2],  cx
        ;завершение программы
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2020, 22:35

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Нужны комментарии к коду программы
Вот код: #include <iostream> using namespace std; int main() { int n,...

Написать комментарии к коду
#include "stdafx.h" #include "iostream" #include "string.h" using namespace std; class...

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

Написать комментарии к коду
Огромная просьба написать комментарии К КАЖДОЙ СТРОЧКЕ кода. Заранее благодарю. package...


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

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

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