Важная информация
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 11

Тема: Заменить команды на альтернативы (без использования директивы)

  1. #1 Заменить команды на альтернативы (без использования директивы) 
    Новичок
    Регистрация
    23.12.2015
    Сообщений
    17
    Сказал(а) спасибо
    6
    Поблагодарили 0 раз(а) в 0 сообщениях
    Всем доброго времени суток,

    Задание такое (делается в emu8086): Пользователь вводит координаты левого верхнего (x1, y1) и правого нижнего (x2, y2) углов прямоугольника. Программа должна нарисовать прямоугольник на экране и вывести его периметр (P) и площадь (S).
    Примечание: Для ввода/вывода использовать прерывания (INT). Не использовать никакие команды "emu, macro" и т.п.

    Вот код:

    Assembler Code:
    1.  
    2. include 'emu8086.inc' ; подключение директивы
    3. org 100h
    4. ; приветствие
    5. mov dx, offset msg1
    6. mov ah, 9
    7. int 21h  
    8. call scan_num          
    9. ; очистка экрана
    10. call CLEAR_SCREEN
    11.  
    12. ; вывод значений
    13. mov dx, offset msg2
    14. mov ah, 9
    15. int 21h
    16. call scan_num
    17.  
    18. mov xkord, cx
    19.  
    20. call CLEAR_SCREEN
    21.  
    22. mov dx, offset msg3
    23. mov ah, 9
    24. int 21h
    25. call scan_num
    26.  
    27. mov ykord, cx
    28.  
    29. call CLEAR_SCREEN
    30.  
    31. mov dx, offset msg4
    32. mov ah, 9
    33. int 21h
    34. call scan_num
    35.  
    36. mov shirina, cx
    37.  
    38.  
    39. call CLEAR_SCREEN
    40.  
    41. mov dx, offset msg5
    42. mov ah, 9
    43. int 21h
    44. call scan_num
    45.  
    46. mov dlina, cx
    47.  
    48. ; вычисляем площадь и периметр прямоугольника          
    49. ; площадь прямоугольника
    50. mov ax, dlina
    51. mul shirina
    52. mov plosiad, ax
    53.  
    54. ; периметр прямоугольника
    55. mov bx, shirina
    56. add bx, dlina
    57. add bx, bx
    58. mov perimetr, bx
    59.  
    60. call CLEAR_SCREEN
    61.  
    62. mov dx, offset msg6
    63. mov ah, 9
    64. int 21h
    65.  
    66. mov dx, offset msg7
    67. mov ah, 9
    68. int 21h
    69.  
    70. mov dx, offset msg8
    71. mov ah, 9
    72. int 21h
    73.  
    74. mov ah, 0
    75. int 16h
    76.  
    77. ; находим правый верхний угол прямоугольника
    78. mov ax, xkord
    79. mov bl, 2
    80. div bl
    81. mov b.[xkord], al
    82.  
    83. mov ax, ykord
    84. mov bl, 2
    85. div bl
    86. mov b.[ykord], al
    87.  
    88. ; выставляем видео режим 640x480, 16 цветов
    89. mov al, 12h    
    90. mov ah, 0
    91. int 10h
    92.  
    93. mov cx, xkord
    94. mov dx, ykord
    95.  
    96. mov bx,dlina
    97. add bx,xkord
    98. mov p1, bx
    99.  
    100. ; чертим верхнюю линию
    101. mov al, 50  
    102.  
    103. VerhLinia:
    104.  
    105. mov ah, 0ch
    106. int 10h
    107.  
    108. inc cx
    109.  
    110. cmp cx,p1
    111.  
    112. JNAE VerhLiniia
    113.  
    114. mov cx, xkord
    115. mov dx, ykord
    116.  
    117. mov bx, ykord
    118. add bx, shirina
    119. mov p2, bx
    120.  
    121. ; чертим левую линию
    122.  
    123. LevLinia:
    124.  
    125.  
    126. mov ah,0ch
    127. ; левая линия фиолетового цвета
    128. mov al, 5
    129. int 10h
    130.  
    131. inc dx
    132.  
    133. cmp dx,p2
    134.  
    135. JNAE LevLinia
    136.  
    137. mov bx, cx
    138. add bx, dlina
    139. mov p3, bx
    140.  
    141. ; чертим нижнюю линию
    142.  
    143. NiznLinija:
    144.  
    145.  
    146. mov ah,0ch  
    147. ; нижняя линия красного цвета
    148. mov al, 4
    149. int 10h
    150.  
    151. inc cx
    152.  
    153. cmp cx,p3
    154.  
    155. JNAE NiznLinia
    156.  
    157. mov bx,ykord
    158. mov p4, bx      
    159.  
    160. ; чертим правую линию
    161.  
    162. PravLinija:
    163.  
    164.  
    165. mov ah,0ch  
    166. ; правая линия голубого цвета
    167. mov al, 3
    168. int 10h
    169.  
    170. dec dx
    171.  
    172. cmp dx,p4
    173.  
    174. JNB PravLinia
    175.  
    176. ret    
    177.  
    178. dlina dw 0
    179. shirina dw 0
    180. xkord dw 0
    181. ykord dw 0
    182. plosiad dw 0
    183. perimetr dw 0  
    184. msg1 db 'Pogrammu napisal: Imia Familija. Nazmite <Enter> ', '$'
    185. msg2 db 'Vvedite X koordinatu centra priamougolnika: ', '$'
    186. msg3 db 'Vvedite Y koordinatu centra priamougolnika: ', '$'
    187. msg4 db 'Vvedite shirinu priamougolnika (max 480): ', '$'
    188. msg5 db 'Vvedite dlinu priamougolnika (max 640): ', '$'
    189. msg6 db 'Plosiad Vashego priamougolnika: ', '$'
    190. msg7 db 'Perimetr vashego priamougolnika: ', '$'
    191. msg8 db 'Dlia sozdanija priamougolnika nazmite <ENTER>', '$'
    192.  
    193.  
    194. p1 dw 0 ;конец верхней линии x
    195. p2 dw 0 ;конец левой линии y
    196. p3 dw 0 ;конец нижней линии x
    197. p4 dw 0 ;конец правой линии y
    198.  
    199. DEFINE_SCAN_NUM
    200. DEFINE_CLEAR_SCREEN
    201. end


    А можно ли чем то заменить директиву "include emu8086.inc"? Просто препод хочет,чтоб не использовались директивы и всякие команды macro.
    Чем тогда можно заменить "call scan_num" и "call CLEAR_SCREEN"? Чтоб убрать из программы emu8086.inc?

    Заранее благодарю за ответ.
    Ответить с цитированием  
     

  2. #2  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,931
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    Просто препод хочет,чтоб не использовались директивы и всякие команды macro.
    Вставьте этот emu8086.inc файл на место той строки где include, макросы меняем на процедуры.
    И пусть препод хавает свой быдлокод.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  3. Пользователь сказал cпасибо:

    Oxidous (29.12.2015)

  4. #3  
    Новичок
    Регистрация
    23.12.2015
    Сообщений
    17
    Сказал(а) спасибо
    6
    Поблагодарили 0 раз(а) в 0 сообщениях
    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    Вставьте этот emu8086.inc файл на место той строки где include, макросы меняем на процедуры.
    И пусть препод хавает свой быдлокод.
    Благодарю Вас за ответ С Clear_screen' ом разобрался,а вот никак не могу вставить scan_num Быть может есть альтернатива SCAN_NUM? Потому как там внутри макрос и как его вытащить я не представляю...

    Вот вытащенный код CAN_NUM из emu8086.inc:

    Assembler Code:
    1.  
    2. DEFINE_SCAN_NUM         MACRO
    3. LOCAL make_minus, ten, next_digit, set_minus
    4. LOCAL too_big, backspace_checked, too_big2
    5. LOCAL stop_input, not_minus, skip_proc_scan_num
    6. LOCAL remove_not_digit, ok_AE_0, ok_digit, not_cr
    7.  
    8. ; protect from wrong definition location:
    9. JMP     skip_proc_scan_num
    10.  
    11. SCAN_NUM        PROC    NEAR
    12.         PUSH    DX
    13.         PUSH    AX
    14.         PUSH    SI
    15.       
    16.         MOV     CX, 0
    17.  
    18.         ; reset flag:
    19.         MOV     CS:make_minus, 0
    20.  
    21. next_digit:
    22.  
    23.         ; get char from keyboard
    24.         ; into AL:
    25.         MOV     AH, 00h
    26.         INT     16h
    27.         ; and print it:
    28.         MOV     AH, 0Eh
    29.         INT     10h
    30.  
    31.         ; check for MINUS:
    32.         CMP     AL, '-'
    33.         JE      set_minus
    34.  
    35.         ; check for ENTER key:
    36.         CMP     AL, 13  ; carriage return?
    37.         JNE     not_cr
    38.         JMP     stop_input
    39. not_cr:
    40.  
    41.  
    42.         CMP     AL, 8                   ; 'BACKSPACE' pressed?
    43.         JNE     backspace_checked
    44.         MOV     DX, 0                   ; remove last digit by
    45.         MOV     AX, CX                  ; division:
    46.         DIV     CS:ten                  ; AX = DX:AX / 10 (DX-rem).
    47.         MOV     CX, AX
    48.         PUTC    ' '                     ; clear position.
    49.         PUTC    8                       ; backspace again.
    50.         JMP     next_digit
    51. backspace_checked:
    52.  
    53.  
    54.         ; allow only digits:
    55.         CMP     AL, '0'
    56.         JAE     ok_AE_0
    57.         JMP     remove_not_digit
    58. ok_AE_0:        
    59.         CMP     AL, '9'
    60.         JBE     ok_digit
    61. remove_not_digit:      
    62.         PUTC    8       ; backspace.
    63.         PUTC    ' '     ; clear last entered not digit.
    64.         PUTC    8       ; backspace again.        
    65.         JMP     next_digit ; wait for next input.      
    66. ok_digit:
    67.  
    68.  
    69.         ; multiply CX by 10 (first time the result is zero)
    70.         PUSH    AX
    71.         MOV     AX, CX
    72.         MUL     CS:ten                  ; DX:AX = AX*10
    73.         MOV     CX, AX
    74.         POP     AX
    75.  
    76.         ; check if the number is too big
    77.         ; (result should be 16 bits)
    78.         CMP     DX, 0
    79.         JNE     too_big
    80.  
    81.         ; convert from ASCII code:
    82.         SUB     AL, 30h
    83.  
    84.         ; add AL to CX:
    85.         MOV     AH, 0
    86.         MOV     DX, CX      ; backup, in case the result will be too big.
    87.         ADD     CX, AX
    88.         JC      too_big2    ; jump if the number is too big.
    89.  
    90.         JMP     next_digit
    91.  
    92. set_minus:
    93.         MOV     CS:make_minus, 1
    94.         JMP     next_digit
    95.  
    96. too_big2:
    97.         MOV     CX, DX      ; restore the backuped value before add.
    98.         MOV     DX, 0       ; DX was zero before backup!
    99. too_big:
    100.         MOV     AX, CX
    101.         DIV     CS:ten  ; reverse last DX:AX = AX*10, make AX = DX:AX / 10
    102.         MOV     CX, AX
    103.         PUTC    8       ; backspace.
    104.         PUTC    ' '     ; clear last entered digit.
    105.         PUTC    8       ; backspace again.        
    106.         JMP     next_digit ; wait for Enter/Backspace.
    107.       
    108.       
    109. stop_input:
    110.         ; check flag:
    111.         CMP     CS:make_minus, 0
    112.         JE      not_minus
    113.         NEG     CX
    114. not_minus:
    115.  
    116.         POP     SI
    117.         POP     AX
    118.         POP     DX
    119.         RET
    120. make_minus      DB      ?       ; used as a flag.
    121. ten             DW      10      ; used as multiplier.
    122. SCAN_NUM        ENDP
    123.  
    124. skip_proc_scan_num:
    125.  
    126. DEFINE_SCAN_NUM         ENDM


    А препод просто молодой, потому и ерундой страдает В прошлом году он не пропустил девушку, сказав ей, что девушкам нечего делать в IT ))) Скандал был ещё тот, но он продолжает работать почему-то и страдают от него все )))

    Сейчас программа имеет такой вид:

    Assembler Code:
    1.  
    2. include 'emu8086.inc' ; подключение директивы
    3. org 100h
    4. ; приветствие
    5. mov dx, offset msg1
    6. mov ah, 9
    7. int 21h  
    8. call scan_num          
    9. ; очистка экрана
    10. call CLEAR_SCREEN
    11.  
    12. ; вывод значений
    13. mov dx, offset msg2
    14. mov ah, 9
    15. int 21h
    16. call scan_num
    17.  
    18. mov xkord, cx
    19.  
    20. call CLEAR_SCREEN
    21.  
    22. mov dx, offset msg3
    23. mov ah, 9
    24. int 21h
    25. call scan_num
    26.  
    27. mov ykord, cx
    28.  
    29. call CLEAR_SCREEN
    30.  
    31. mov dx, offset msg4
    32. mov ah, 9
    33. int 21h
    34. call scan_num
    35.  
    36. mov shirina, cx
    37.  
    38.  
    39. call CLEAR_SCREEN
    40.  
    41. mov dx, offset msg5
    42. mov ah, 9
    43. int 21h
    44. call scan_num
    45.  
    46. mov dlina, cx
    47.  
    48. ; вычисляем площадь и периметр прямоугольника          
    49. ; площадь прямоугольника
    50. mov ax, dlina
    51. mul shirina
    52. mov plosiad, ax
    53.  
    54. ; периметр прямоугольника
    55. mov bx, shirina
    56. add bx, dlina
    57. add bx, bx
    58. mov perimetr, bx
    59.  
    60. call CLEAR_SCREEN
    61.  
    62. mov dx, offset msg6
    63. mov ah, 9
    64. int 21h
    65.  
    66. mov dx, offset msg7
    67. mov ah, 9
    68. int 21h
    69.  
    70. mov dx, offset msg8
    71. mov ah, 9
    72. int 21h
    73.  
    74. mov ah, 0
    75. int 16h
    76.  
    77. ; находим правый верхний угол прямоугольника
    78. mov ax, xkord
    79. mov bl, 2
    80. div bl
    81. mov b.[xkord], al
    82.  
    83. mov ax, ykord
    84. mov bl, 2
    85. div bl
    86. mov b.[ykord], al
    87.  
    88. ; выставляем видео режим 640x480, 16 цветов
    89. mov al, 12h    
    90. mov ah, 0
    91. int 10h
    92.  
    93. mov cx, xkord
    94. mov dx, ykord
    95.  
    96. mov bx,dlina
    97. add bx,xkord
    98. mov p1, bx
    99.  
    100. ; чертим верхнюю линию
    101. mov al, 50  
    102.  
    103. VerhLinia:
    104.  
    105. mov ah, 0ch
    106. int 10h
    107.  
    108. inc cx
    109.  
    110. cmp cx,p1
    111.  
    112. JNAE VerhLiniia
    113.  
    114. mov cx, xkord
    115. mov dx, ykord
    116.  
    117. mov bx, ykord
    118. add bx, shirina
    119. mov p2, bx
    120.  
    121. ; чертим левую линию
    122.  
    123. LevLinia:
    124.  
    125.  
    126. mov ah,0ch
    127. ; левая линия фиолетового цвета
    128. mov al, 5
    129. int 10h
    130.  
    131. inc dx
    132.  
    133. cmp dx,p2
    134.  
    135. JNAE LevLinia
    136.  
    137. mov bx, cx
    138. add bx, dlina
    139. mov p3, bx
    140.  
    141. ; чертим нижнюю линию
    142.  
    143. NiznLinija:
    144.  
    145.  
    146. mov ah,0ch  
    147. ; нижняя линия красного цвета
    148. mov al, 4
    149. int 10h
    150.  
    151. inc cx
    152.  
    153. cmp cx,p3
    154.  
    155. JNAE NiznLinia
    156.  
    157. mov bx,ykord
    158. mov p4, bx      
    159.  
    160. ; чертим правую линию
    161.  
    162. PravLinija:
    163.  
    164.  
    165. mov ah,0ch  
    166. ; правая линия голубого цвета
    167. mov al, 3
    168. int 10h
    169.  
    170. dec dx
    171.  
    172. cmp dx,p4
    173.  
    174. JNB PravLinia
    175.  
    176. ret    
    177. ; процедура CLEAR_SCREEN
    178. CLEAR_SCREEN PROC NEAR
    179. PUSH    AX      ; store registers...
    180. PUSH    DS      ;
    181. PUSH    BX      ;
    182. PUSH    CX      ;
    183. PUSH    DI      ;
    184.  
    185. MOV     AX, 40h
    186. MOV     DS, AX  ; for getting screen parameters.
    187. MOV     AH, 06h ; scroll up function id.
    188. MOV     AL, 0   ; scroll all lines!
    189. MOV     BH, 07  ; attribute for new lines.
    190. MOV     CH, 0   ; upper row.
    191. MOV     CL, 0   ; upper col.
    192. MOV     DI, 84h ; rows on screen -1,
    193. MOV     DH, [DI] ; lower row (byte).
    194. MOV     DI, 4Ah ; columns on screen,
    195. MOV     DL, [DI]
    196. DEC     DL      ; lower col.
    197. INT     10h
    198.  
    199. ; set cursor position to top
    200. ; of the screen:
    201. MOV     BH, 0   ; current page.
    202. MOV     DL, 0   ; col.
    203. MOV     DH, 0   ; row.
    204. MOV     AH, 02
    205. INT     10h
    206.  
    207. POP     DI      ; re-store registers...
    208. POP     CX      ;
    209. POP     BX      ;
    210. POP     DS      ;
    211. POP     AX      ;
    212.  
    213. RET
    214. CLEAR_SCREEN ENDP
    215.  
    216. dlina dw 0
    217. shirina dw 0
    218. xkord dw 0
    219. ykord dw 0
    220. plosiad dw 0
    221. perimetr dw 0  
    222. msg1 db 'Pogrammu napisal: Imia Familija. Nazmite <Enter> ', '$'
    223. msg2 db 'Vvedite X koordinatu centra priamougolnika: ', '$'
    224. msg3 db 'Vvedite Y koordinatu centra priamougolnika: ', '$'
    225. msg4 db 'Vvedite shirinu priamougolnika (max 480): ', '$'
    226. msg5 db 'Vvedite dlinu priamougolnika (max 640): ', '$'
    227. msg6 db 'Plosiad Vashego priamougolnika: ', '$'
    228. msg7 db 'Perimetr vashego priamougolnika: ', '$'
    229. msg8 db 'Dlia sozdanija priamougolnika nazmite <ENTER>', '$'
    230.  
    231.  
    232. p1 dw 0 ;конец верхней линии x
    233. p2 dw 0 ;конец левой линии y
    234. p3 dw 0 ;конец нижней линии x
    235. p4 dw 0 ;конец правой линии y
    236.  
    237. DEFINE_SCAN_NUM
    238. end
    Последний раз редактировалось Oxidous; 24.12.2015 в 20:13.
    Ответить с цитированием  
     

  5. #4  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,931
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    В прошлом году он не пропустил девушку, сказав ей, что девушкам нечего делать в IT )))
    Ситуации разные бывают. Преподы не любят когда им хамят, они дичайше не любят когда им подсовывают
    задание, выполненное другим человеком, также они не любят когда человек ничерта не делает. По своему
    опыту. Если препод увидит потуги студента, даже слабо результативные, он скорее всего не станет жёстко
    валить.

    А препод просто молодой, потому и ерундой страдает
    По описанию задания подумал, что это горбатый полу старик лет 60-ти в очках. Ха ха... Мда...
    Просто нет ничего бесполезнее чем учить ассемблеру на эмуляторе 8086-го компа, используя функции BIOS.

    Вот вытащенный код CAN_NUM
    Что он делает? Компилятор какой? Понятно одно: препод хочет вас заставить написать код с нуля.
    Судя по всему долго будет мучить.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  6. #5  
    Новичок
    Регистрация
    23.12.2015
    Сообщений
    17
    Сказал(а) спасибо
    6
    Поблагодарили 0 раз(а) в 0 сообщениях
    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    Что он делает? Компилятор какой? Понятно одно: препод хочет вас заставить написать код с нуля.
    Судя по всему долго будет мучить.
    SCAN_NUM предназначен для проверки введённых пользователем данных и запоминания их. Пользователь вводит числа и по ним уже строится геометрическая фигура.

    Я просто смысла не понимаю,зачем запрещать использовать макросы и т.п. ? Я как-то всегда считал,что если человек использует что-то для выполнения задания, то это только в плюс
    Ответить с цитированием  
     

  7. #6  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,931
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    SCAN_NUM предназначен для проверки введённых пользователем данных и запоминания их.
    Посмотрел код. Перевёл вам комментарии, переформатировал для большей читабельности, разбирайтесь,
    не знаю что это за компилятор, да и времени скажу честно сейчас нет, тут нужно днями сидеть, чтобы эту
    задачу по-человечески сделать(перекодить), забыл уже весь DOS, мне уже многие прерывания ни о чём
    не говорят, последний раз я в 2008-м году к MASM-у подходил, так что уж простите.

    Assembler Code:
    1. SCAN_NUM     PROC NEAR
    2. PUSH DX
    3. PUSH AX
    4. PUSH SI
    5.  
    6. MOV CX, 0
    7.  
    8. ;  Сбрасываем flag:
    9. MOV CS:make_minus, 0
    10.  
    11. next_digit:
    12.  
    13. ;  Символ с клавиатуры
    14. ; в регистр AL:
    15.     MOV  AH, 00h
    16.     INT  16h
    17. ; и печатаем его:
    18.     MOV  AH, 0Eh
    19.     INT  10h
    20.  
    21. ;  проверяем на знак МИНУС:
    22.     CMP  AL, '-'
    23.     JE   set_minus
    24.  
    25. ;  проверяем на клавишу ENTER:
    26.     CMP  AL, 13      ;  Возврат каретки?
    27.     JNE  not_cr
    28.     JMP  stop_input
    29.  
    30. not_cr:
    31.  
    32.  
    33.     CMP  AL, 8       ;  Нажат ли 'BACKSPACE'?
    34.     JNE     backspace_checked
    35.     MOV  DX, 0       ;  Удалим последний символ через
    36.     MOV  AX, CX      ;  деление:
    37.     DIV  CS:ten                  ;  AX = DX:AX / 10 (DX-rem).
    38.     MOV  CX, AX
    39.        PUTC    ' '   ;  Сброс позиции.
    40.        PUTC    8     ;  Бекспейс ещё раз.
    41.     JMP  next_digit
    42.  
    43.  
    44. backspace_checked:
    45.  
    46.  
    47. ;  Пропускаем только цифры
    48.     CMP  AL, '0'
    49.     JAE  ok_AE_0
    50.     JMP  remove_not_digit
    51.  
    52. ok_AE_0:     CMP  AL, '9'
    53.              JBE  ok_digit
    54.  
    55. remove_not_digit:   PUTC    8     ;  Бекспейс
    56.                     PUTC    ' '   ;  Очистить последнюю введённую не цифру.
    57.                     PUTC    8     ;  Бекспейс ещё раз.
    58.     JMP  next_digit               ;  Ждём следующего ввода
    59.  
    60.  
    61. ok_digit:
    62.  
    63.  
    64. ;  Умножим CX на 10 (первичный результат равен нулю)
    65.     PUSH AX
    66.     MOV  AX, CX
    67.     MUL  CS:ten                  ;  DX:AX = AX*10
    68.     MOV  CX, AX
    69.     POP  AX
    70.  
    71. ;  Проверка если число слишком большое
    72. ;  (Результат должен быть 16 битный)
    73.     CMP  DX, 0
    74.     JNE  too_big
    75.  
    76. ;  Конвертируем из ASCII кода в число
    77.     SUB  AL, 30h
    78.  
    79. ;  Прибавим AL к CX:
    80.     MOV  AH, 0
    81.     MOV  DX, CX            ;  Запомним, в варианте, когда результат будет слишком большой.
    82.     ADD  CX, AX
    83.     JC   too_big2          ;  Прыгаем, если число слишком большое.
    84.  
    85.     JMP  next_digit
    86.  
    87. set_minus:   MOV  CS:make_minus, 1
    88.              JMP  next_digit
    89.  
    90. too_big2:    MOV  CX, DX   ;  Восстанавливает сохранённое значение перед добавлением.
    91.              MOV  DX, 0    ;  DX был нулём перед запоминанием!
    92.  
    93. too_big:     MOV  AX, CX
    94.              DIV  CS:ten   ;  Возвращаем последний DX:AX = AX*10, делаем AX = DX:AX / 10
    95.              MOV  CX, AX
    96.         PUTC    8          ;  Бекспейс.
    97.         PUTC    ' '        ;  Очистить последнюю введённую не цифру.
    98.         PUTC    8          ;  Бекспейс ещё раз.      
    99. JMP     next_digit        ;  Ждём Enter/Backspace.
    100.  
    101.  
    102. stop_input:
    103.  
    104.  
    105. ;  check flag:
    106. CMP  CS:make_minus, 0
    107. JE   not_minus
    108. NEG  CX
    109.  
    110. not_minus:
    111.  
    112. POP  SI
    113. POP  AX
    114. POP  DX
    115. RET
    116. make_minus  DB  ?          ;  Используется как флаг.
    117. ten         DW 10          ;  Используется как множитель.
    118. SCAN_NUM     ENDP


    По хорошему для студентов, для простоты нужно брать режим 13h. Давать все эти процедуры ввода\вывода.
    А требовать только всякие вычислительные формулы. Так люди хотя бы инструкции выучат.
    Но дрючить на написание кода с нуля - это бред, да ещё и в "слоистых" EGA режимах.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  8. Пользователь сказал cпасибо:

    Oxidous (26.12.2015)

  9. #7  
    Новичок
    Регистрация
    23.12.2015
    Сообщений
    17
    Сказал(а) спасибо
    6
    Поблагодарили 0 раз(а) в 0 сообщениях
    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    По хорошему для студентов, для простоты нужно брать режим 13h. Давать все эти процедуры ввода\вывода.
    А требовать только всякие вычислительные формулы. Так люди хотя бы инструкции выучат.
    Но дрючить на написание кода с нуля - это бред, да ещё и в "слоистых" EGA режимах.
    Ну,с преподом ведь не поспоришь,а потому нужно выполнять его требования Благодарю Вас за ответ

    Я решил поставленную задачу таким способом:

    Assembler Code:
    1.  
    2.     MY_SCAN_NUM PROC NEAR
    3.      mov AH, 2
    4.      mov DL, '>'    ; приглашение
    5.      int 21h ; выводим приглашение
    6.      xor DI, DI     ; итоговое число, - пока ноль
    7.     my_input:
    8.      mov AH, 8      ; ввод символа без показа
    9.      int 21h
    10.      cmp AL, 13     ; Enter нажали ?
    11.      je Oxid_vihod  ; да - уходим
    12.      cmp AL, '9'
    13.      ja my_input    ; какую-то бОльшую букву ввели - игнорируем
    14.      cmp AL, '0'
    15.      jb my_input    ; какую-то меньшую букву ввели - игнорируем
    16.     
    17.      mov AH, 2
    18.      mov DL, AL     ; цифра
    19.      int 21h        ; выводим цифру
    20.      sub AL, '0'    ; преобразуем символ в число 0..9
    21.      xor AH, AH     ; AH = 0
    22.      mov CX, AX     ; цифра теперь в CX
    23.      mov AX, DI     ; в AX наш итог
    24.      mov BX, 10     ; десятичная у нас система ввода
    25.      mul BX         ; AX = AX*10
    26.      add AX, CX     ; добавим нашу цифру
    27.      mov DI, AX     ; результат в DI
    28.      jmp my_input   ; на следующую цифру
    29.     Oxid_vihod:
    30.      mov CX, DI     ; запишем результат
    31.      RET ; валим
    32.     MY_SCAN_NUM ENDP


    Вот только почему-то не выводятся значения периметра и площади в msg6 и msg7. Вычисляться - вычисляется ведь, но вместо значений там просто пустота
    Ответить с цитированием  
     

  10. #8  
    Новичок
    Регистрация
    23.12.2015
    Сообщений
    17
    Сказал(а) спасибо
    6
    Поблагодарили 0 раз(а) в 0 сообщениях
    Вот, выкладываю код, может кому пригодится:

    Assembler Code:
    1.  
    2.         org 100h
    3.         ; приветствие
    4.         mov dx, offset msg1
    5.         mov ah, 9
    6.         int 21h  
    7.         call MY_SCAN_NUM        
    8.         ; очистка экрана
    9.         call CLEAR_SCREEN
    10.     
    11.         ; вывод значений
    12.         mov dx, offset msg2
    13.         mov ah, 9
    14.         int 21h
    15.         call MY_SCAN_NUM
    16.     
    17.         mov xkord, cx
    18.     
    19.         call CLEAR_SCREEN
    20.     
    21.         mov dx, offset msg3
    22.         mov ah, 9
    23.         int 21h
    24.         call MY_SCAN_NUM
    25.     
    26.         mov ykord, cx
    27.     
    28.         call CLEAR_SCREEN
    29.     
    30.         mov dx, offset msg4
    31.         mov ah, 9
    32.         int 21h
    33.         call MY_SCAN_NUM
    34.     
    35.         mov shirina, cx
    36.     
    37.     
    38.         call CLEAR_SCREEN
    39.     
    40.         mov dx, offset msg5
    41.         mov ah, 9
    42.         int 21h
    43.         call MY_SCAN_NUM
    44.     
    45.         mov dlina, cx
    46.     
    47.         ; вычисляем площадь и периметр прямоугольника          
    48.         ; площадь прямоугольника
    49.         mov ax, dlina
    50.         mul shirina
    51.         mov plosiad, ax
    52.     
    53.         ; периметр прямоугольника
    54.         mov bx, shirina
    55.         add bx, dlina
    56.         add bx, bx
    57.         mov perimetr, bx
    58.     
    59.         call CLEAR_SCREEN
    60.     
    61.         mov dx, offset msg6
    62.         mov ah, 9
    63.         int 21h
    64.         mov AX, plosiad  
    65.         call vivod_cisla
    66.     
    67.         mov dx, offset msg7
    68.         mov ah, 9
    69.         int 21h
    70.         mov AX, perimetr
    71.         call vivod_cisla
    72.     
    73.         mov dx, offset msg8
    74.         mov ah, 9
    75.         int 21h
    76.     
    77.         mov ah, 0
    78.         int 16h
    79.     
    80.         ; находим правый верхний угол прямоугольника
    81.         mov ax, xkord
    82.         mov bl, 2
    83.         div bl
    84.         mov b.[xkord], al
    85.     
    86.         mov ax, ykord
    87.         mov bl, 2
    88.         div bl
    89.         mov b.[ykord], al
    90.     
    91.         ; выставляем видео режим 640x480, 16 цветов
    92.         mov al, 12h    
    93.         mov ah, 0
    94.         int 10h
    95.     
    96.         mov cx, xkord
    97.         mov dx, ykord
    98.     
    99.         mov bx,dlina
    100.         add bx,xkord
    101.         mov p1, bx
    102.     
    103.         ; чертим верхнюю линию
    104.         mov al, 50  
    105.     
    106.         VerhLinia:
    107.     
    108.         mov ah, 0ch
    109.         int 10h
    110.     
    111.         inc cx
    112.     
    113.         cmp cx,p1
    114.     
    115.         JNAE VerhLinia
    116.     
    117.         mov cx, xkord
    118.         mov dx, ykord
    119.     
    120.         mov bx, ykord
    121.         add bx, shirina
    122.         mov p2, bx
    123.     
    124.         ; чертим левую линию
    125.     
    126.         LevLinia:
    127.     
    128.     
    129.         mov ah,0ch
    130.         ; левая линия фиолетового цвета
    131.         mov al, 5
    132.         int 10h
    133.     
    134.         inc dx
    135.     
    136.         cmp dx,p2
    137.     
    138.         JNAE LevLinia
    139.     
    140.         mov bx, cx
    141.         add bx, dlina
    142.         mov p3, bx
    143.     
    144.         ; чертим нижнюю линию
    145.     
    146.         NiznLinia:
    147.     
    148.     
    149.         mov ah,0ch  
    150.         ; нижняя линия красного цвета
    151.         mov al, 4
    152.         int 10h
    153.     
    154.         inc cx
    155.     
    156.         cmp cx,p3
    157.     
    158.         JNAE NiznLinia
    159.     
    160.         mov bx,ykord
    161.         mov p4, bx      
    162.     
    163.         ; чертим правую линию
    164.     
    165.         PravLinia:
    166.     
    167.     
    168.         mov ah,0ch  
    169.         ; правая линия голубого цвета
    170.         mov al, 3
    171.         int 10h
    172.     
    173.         dec dx
    174.     
    175.         cmp dx,p4
    176.     
    177.         JNB PravLinia
    178.     
    179.         ret    
    180.         MY_SCAN_NUM PROC NEAR
    181.          mov AH, 2
    182.          mov DL, '>'    ; приглашение
    183.          int 21h ; выводим приглашение
    184.          xor DI, DI     ; итоговое число, - пока ноль
    185.         my_input:
    186.          mov AH, 8      ; ввод символа без показа
    187.          int 21h
    188.          cmp AL, 13     ; Enter нажали ?
    189.          je Oxid_vihod  ; да - уходим
    190.          cmp AL, '9'
    191.          ja my_input    ; какую-то бОльшую букву ввели - игнорируем
    192.          cmp AL, '0'
    193.          jb my_input    ; какую-то меньшую букву ввели - игнорируем
    194.     
    195.          mov AH, 2
    196.          mov DL, AL     ; цифра
    197.          int 21h        ; выводим цифру
    198.          sub AL, '0'    ; преобразуем символ в число 0..9
    199.          xor AH, AH     ; AH = 0
    200.          mov CX, AX     ; цифра теперь в CX
    201.          mov AX, DI     ; в AX наш итог
    202.          mov BX, 10     ; десятичная у нас система ввода
    203.          mul BX         ; AX = AX*10
    204.          add AX, CX     ; добавим нашу цифру
    205.          mov DI, AX     ; результат в DI
    206.          jmp my_input   ; на следующую цифру
    207.         Oxid_vihod:
    208.          mov CX, DI     ; запишем результат
    209.          RET ; валим
    210.         MY_SCAN_NUM ENDP
    211.     ;------------
    212.     
    213.     ; процедура CLEAR_SCREEN
    214.         CLEAR_SCREEN PROC NEAR
    215.         PUSH    AX      ; store registers...
    216.         PUSH    DS      ;
    217.         PUSH    BX      ;
    218.         PUSH    CX      ;
    219.         PUSH    DI      ;
    220.     
    221.         MOV     AX, 40h
    222.         MOV     DS, AX  ; for getting screen parameters.
    223.         MOV     AH, 06h ; scroll up function id.
    224.         MOV     AL, 0   ; scroll all lines!
    225.         MOV     BH, 07  ; attribute for new lines.
    226.         MOV     CH, 0   ; upper row.
    227.         MOV     CL, 0   ; upper col.
    228.         MOV     DI, 84h ; rows on screen -1,
    229.         MOV     DH, [DI] ; lower row (byte).
    230.         MOV     DI, 4Ah ; columns on screen,
    231.         MOV     DL, [DI]
    232.         DEC     DL      ; lower col.
    233.         INT     10h
    234.     
    235.         ; set cursor position to top
    236.         ; of the screen:
    237.         MOV     BH, 0   ; current page.
    238.         MOV     DL, 0   ; col.
    239.         MOV     DH, 0   ; row.
    240.         MOV     AH, 02
    241.         INT     10h
    242.     
    243.         POP     DI      ; re-store registers...
    244.         POP     CX      ;
    245.         POP     BX      ;
    246.         POP     DS      ;
    247.         POP     AX      ;
    248.     
    249.         RET
    250.         CLEAR_SCREEN ENDP
    251.     
    252.     vivod_cisla proc
    253.     
    254.     xor cx, cx
    255.     mov bx, 10
    256.     oi2:
    257.     xor dx,dx
    258.     div bx
    259.     push dx
    260.     inc  cx
    261.     test ax, ax
    262.     jnz oi2
    263.     mov ah, 02h
    264.     oi3:
    265.     pop dx
    266.     add dl, '0'
    267.     int 21h
    268.     loop oi3
    269.     
    270.     ret
    271.     
    272.     vivod_cisla endp
    273.     
    274.         dlina dw 0
    275.         shirina dw 0
    276.         xkord dw 0
    277.         ykord dw 0
    278.         plosiad dw 0
    279.         perimetr dw 0  
    280.         msg1 db 'Pogrammu napisal: Imia Familija. Nazmite <Enter> ', '$'
    281.         msg2 db 'Vvedite X koordinatu centra priamougolnika: ', '$'
    282.         msg3 db 'Vvedite Y koordinatu centra priamougolnika: ', '$'
    283.         msg4 db 'Vvedite shirinu priamougolnika (max 480): ', '$'
    284.         msg5 db 'Vvedite dlinu priamougolnika (max 640): ', '$'
    285.         msg6 db 'Plosiad Vashego priamougolnika: ', '$'
    286.         msg7 db 'Perimetr vashego priamougolnika: ', '$'
    287.         msg8 db 'Dlia sozdanija priamougolnika nazmite <ENTER>', '$'
    288.     
    289.         p1 dw 0 ;конец верхней линии x
    290.         p2 dw 0 ;конец левой линии y
    291.         p3 dw 0 ;конец нижней линии x
    292.         p4 dw 0 ;конец правой линии y
    293.     
    294.         end


    Есть ещё одно задание:

    Для ввода\ вывода использовать прерывание (INT). Не использовать никаких emu, macro и т.п. команд.
    2 вариант: Пользователь вводит координаты верхнего левого (x1, y1) и правого нижнего (x2, y2)углов прямоугольника. Нужно начертить на экране прямоугольник и вывести на экран его площадь (S) и периметр (P).

    Как бы код, который я выложил, переделать под 2 вариант?
    Ответить с цитированием  
     

  11. #9  
    Новичок
    Регистрация
    23.12.2015
    Сообщений
    17
    Сказал(а) спасибо
    6
    Поблагодарили 0 раз(а) в 0 сообщениях
    Ну вот, вроде как переделал задание под 2 вариант. Заменил длину и ширину (вводимые с клавиатуры) на координаты x2kord и y2kord. Быть может кто-нить мог бы проверить, правильно ли я сделал? Ибо прямоугольник чертится и площадь с периметром так же выводятся, но правильно ли я сделал задание?

    Assembler Code:
    1.  
    2.     org 100h
    3.         ; приветствие
    4.         mov dx, offset msg1
    5.         mov ah, 9
    6.         int 21h  
    7.         call MY_SCAN_NUM        
    8.         ; очистка экрана
    9.         call CLEAR_SCREEN
    10.     
    11.         ; вывод значений
    12.         mov dx, offset msg2
    13.         mov ah, 9
    14.         int 21h
    15.         call MY_SCAN_NUM
    16.     
    17.         mov xkord, cx
    18.     
    19.         call CLEAR_SCREEN
    20.     
    21.         mov dx, offset msg3
    22.         mov ah, 9
    23.         int 21h
    24.         call MY_SCAN_NUM
    25.     
    26.         mov ykord, cx
    27.     
    28.         call CLEAR_SCREEN
    29.     
    30.         mov dx, offset msg4
    31.         mov ah, 9
    32.         int 21h
    33.         call MY_SCAN_NUM
    34.     
    35.         mov x2kord, cx
    36.     
    37.     
    38.         call CLEAR_SCREEN
    39.     
    40.         mov dx, offset msg5
    41.         mov ah, 9
    42.         int 21h
    43.         call MY_SCAN_NUM
    44.     
    45.         mov y2kord, cx
    46.     
    47.         ; вычисляем площадь и периметр прямоугольника          
    48.         ; площадь прямоугольника
    49.         mov ax, y2kord
    50.         mul x2kord
    51.         mov plosiad, ax
    52.     
    53.         ; периметр прямоугольника
    54.         mov bx, x2kord
    55.         add bx, y2kord
    56.         add bx, bx
    57.         mov perimetr, bx
    58.     
    59.         call CLEAR_SCREEN
    60.     
    61.         mov dx, offset msg6
    62.         mov ah, 9
    63.         int 21h
    64.         mov AX, plosiad  
    65.         call vivod_cisla
    66.     
    67.         mov dx, offset msg7
    68.         mov ah, 9
    69.         int 21h
    70.         mov AX, perimetr
    71.         call vivod_cisla
    72.     
    73.         mov dx, offset msg8
    74.         mov ah, 9
    75.         int 21h
    76.     
    77.         mov ah, 0
    78.         int 16h
    79.     
    80.         ; находим правый верхний угол прямоугольника
    81.         mov ax, xkord
    82.         mov bl, 2
    83.         div bl
    84.         mov b.[xkord], al
    85.     
    86.         mov ax, ykord
    87.         mov bl, 2
    88.         div bl
    89.         mov b.[ykord], al
    90.     
    91.         ; выставляем видео режим 640x480, 16 цветов
    92.         mov al, 12h    
    93.         mov ah, 0
    94.         int 10h
    95.     
    96.         mov cx, xkord
    97.         mov dx, ykord
    98.     
    99.         mov bx,y2kord
    100.         add bx,xkord
    101.         mov p1, bx
    102.     
    103.         ; чертим верхнюю линию
    104.         mov al, 50  
    105.     
    106.         VerhLinia:
    107.     
    108.         mov ah, 0ch
    109.         int 10h
    110.     
    111.         inc cx
    112.     
    113.         cmp cx,p1
    114.     
    115.         JNAE VerhLinia
    116.     
    117.         mov cx, xkord
    118.         mov dx, ykord
    119.     
    120.         mov bx, ykord
    121.         add bx, x2kord
    122.         mov p2, bx
    123.     
    124.         ; чертим левую линию
    125.     
    126.         LevLinia:
    127.     
    128.     
    129.         mov ah,0ch
    130.         ; левая линия фиолетового цвета
    131.         mov al, 5
    132.         int 10h
    133.     
    134.         inc dx
    135.     
    136.         cmp dx,p2
    137.     
    138.         JNAE LevLinia
    139.     
    140.         mov bx, cx
    141.         add bx, y2kord
    142.         mov p3, bx
    143.     
    144.         ; чертим нижнюю линию
    145.     
    146.         NiznLinia:
    147.     
    148.     
    149.         mov ah,0ch  
    150.         ; нижняя линия красного цвета
    151.         mov al, 4
    152.         int 10h
    153.     
    154.         inc cx
    155.     
    156.         cmp cx,p3
    157.     
    158.         JNAE NiznLinia
    159.     
    160.         mov bx,ykord
    161.         mov p4, bx      
    162.     
    163.         ; чертим правую линию
    164.     
    165.         PravLinia:
    166.     
    167.     
    168.         mov ah,0ch  
    169.         ; правая линия голубого цвета
    170.         mov al, 3
    171.         int 10h
    172.     
    173.         dec dx
    174.     
    175.         cmp dx,p4
    176.     
    177.         JNB PravLinia
    178.     
    179.         ret    
    180.         MY_SCAN_NUM PROC NEAR
    181.          mov AH, 2
    182.          mov DL, '>'    ; приглашение
    183.          int 21h ; выводим приглашение
    184.          xor DI, DI     ; итоговое число, - пока ноль
    185.         my_input:
    186.          mov AH, 8      ; ввод символа без показа
    187.          int 21h
    188.          cmp AL, 13     ; Enter нажали ?
    189.          je Oxid_vihod  ; да - уходим
    190.          cmp AL, '9'
    191.          ja my_input    ; какую-то бОльшую букву ввели - игнорируем
    192.          cmp AL, '0'
    193.          jb my_input    ; какую-то меньшую букву ввели - игнорируем
    194.     
    195.          mov AH, 2
    196.          mov DL, AL     ; цифра
    197.          int 21h        ; выводим цифру
    198.          sub AL, '0'    ; преобразуем символ в число 0..9
    199.          xor AH, AH     ; AH = 0
    200.          mov CX, AX     ; цифра теперь в CX
    201.          mov AX, DI     ; в AX наш итог
    202.          mov BX, 10     ; десятичная у нас система ввода
    203.          mul BX         ; AX = AX*10
    204.          add AX, CX     ; добавим нашу цифру
    205.          mov DI, AX     ; результат в DI
    206.          jmp my_input   ; на следующую цифру
    207.         Oxid_vihod:
    208.          mov CX, DI     ; запишем результат
    209.          RET ; валим
    210.         MY_SCAN_NUM ENDP
    211.     ;------------
    212.     
    213.     ; процедура CLEAR_SCREEN
    214.         CLEAR_SCREEN PROC NEAR
    215.         PUSH    AX      ; store registers...
    216.         PUSH    DS      ;
    217.         PUSH    BX      ;
    218.         PUSH    CX      ;
    219.         PUSH    DI      ;
    220.     
    221.         MOV     AX, 40h
    222.         MOV     DS, AX  ; for getting screen parameters.
    223.         MOV     AH, 06h ; scroll up function id.
    224.         MOV     AL, 0   ; scroll all lines!
    225.         MOV     BH, 07  ; attribute for new lines.
    226.         MOV     CH, 0   ; upper row.
    227.         MOV     CL, 0   ; upper col.
    228.         MOV     DI, 84h ; rows on screen -1,
    229.         MOV     DH, [DI] ; lower row (byte).
    230.         MOV     DI, 4Ah ; columns on screen,
    231.         MOV     DL, [DI]
    232.         DEC     DL      ; lower col.
    233.         INT     10h
    234.     
    235.         ; set cursor position to top
    236.         ; of the screen:
    237.         MOV     BH, 0   ; current page.
    238.         MOV     DL, 0   ; col.
    239.         MOV     DH, 0   ; row.
    240.         MOV     AH, 02
    241.         INT     10h
    242.     
    243.         POP     DI      ; re-store registers...
    244.         POP     CX      ;
    245.         POP     BX      ;
    246.         POP     DS      ;
    247.         POP     AX      ;
    248.     
    249.         RET
    250.         CLEAR_SCREEN ENDP
    251.     
    252.     vivod_cisla proc
    253.     
    254.     xor cx, cx
    255.     mov bx, 10
    256.     oi2:
    257.     xor dx,dx
    258.     div bx
    259.     push dx
    260.     inc  cx
    261.     test ax, ax
    262.     jnz oi2
    263.     mov ah, 02h
    264.     oi3:
    265.     pop dx
    266.     add dl, '0'
    267.     int 21h
    268.     loop oi3
    269.     
    270.     ret
    271.     
    272.     vivod_cisla endp
    273.     
    274.         y2kord dw 0
    275.         x2kord dw 0
    276.         xkord dw 0
    277.         ykord dw 0
    278.         plosiad dw 0
    279.         perimetr dw 0  
    280.         msg1 db 'Pogrammu napisal: Imia Familija. Nazmite <Enter> ', '$'
    281.         msg2 db 'Vvedite koordinatu x1: ', '$'
    282.         msg3 db 'Vvedite koordinatu y1: ', '$'
    283.         msg4 db 'Vvedite koordinatu x2: ', '$'
    284.         msg5 db 'Vvedite koordinatu y1: ', '$'
    285.         msg6 db 'Plosiad Vashego priamougolnika: ', '$'
    286.         msg7 db 'Perimetr vashego priamougolnika: ', '$'
    287.         msg8 db 'Dlia sozdanija priamougolnika nazmite <ENTER>', '$'
    288.     
    289.         p1 dw 0 ;конец верхней линии x
    290.         p2 dw 0 ;конец левой линии y
    291.         p3 dw 0 ;конец нижней линии x
    292.         p4 dw 0 ;конец правой линии y
    293.     
    294.         end


    И ещё такой вопрос по второму варианту задания:

    Периметр и площадь, вроде как, некорректно считаются для второго варианта, а потому нужно, чтоб из координат второй точки вычитались координаты первой точки.
    Допустим, пусть координаты первой точки (x1, y1) будут 10 и 10, а координаты второй точки (x2, y2) 100 и 100. Тогда вычитаем первую точку из второй (100-10 и 100-10), получаем 90 и 90, и уже по этим полученным значениям считаем периметр и площадь по.

    Вот код вводимых координат первой точки:

    Код asm:
    ; вводим значения первой координаты
    ; x1
    mov dx, offset msg2
    mov ah, 9
    int 21h
    call scan_num
     
    mov xkord, cx
     
    call clear_screen
    ; y1
    mov dx, offset msg3
    mov ah, 9
    int 21h
    call scan_num
     
    mov ykord, cx

    Код asm:
    ; вводим значения второй координаты
    ; x2
    mov dx, offset msg4
    mov ah, 9
    int 21h
    call scan_num
     
    mov x2kord, cx
     
    call clear_screen
     
    ; y2
    mov dx, offset msg5
    mov ah, 9
    int 21h
    call scan_num
     
    mov y2kord, cx

    Вот код периметра и площади прямоугольника:

    Код asm:
    ; периметр прямоугольника
    mov bx, x2kord
    add bx, y2kord
    add bx, bx
    mov perimetr, bx 
     
    ; площадь прямоугольника
    mov ax, y2kord
    mul x2kord
    mov plotas, ax

    Как я понимаю, первые координаты записываются в CX регистр. Как в мне в периметре и площади прямоугольника вычесть из значений второй координаты значения первой координаты?
    Я понимаю, что это делается командой SUB CX, BX, но при работе программы периметр и площаль остаются такими же, как при умножении значений второй координаты для площади(a*b)и 2*(a+b) - для периметра.
    Последний раз редактировалось Oxidous; 28.12.2015 в 12:09.
    Ответить с цитированием  
     

  12. #10  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,931
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    но правильно ли я сделал задание?
    Для ввода\ вывода использовать прерывание (INT).
    Так в процедурах EMU и используются прерывания. Что-то препод чудной какой-то.

    Как в мне в периметре и площади прямоугольника вычесть из значений второй координаты значения первой координаты?
    SUB, но после смотрим, чтобы было положительно(OR рег, рег \ JNL метка \ NEG рег \ метка: ) т.к. mul работает с числами без знака.


    Функции DOS тут:
    http://www.codenet.ru/progr/dos/int_0026.php

    Функции клавиатуры INT 16h:
    http://webpages.charter.net/danrolli...hhelp/0228.HTM
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  13. Пользователь сказал cпасибо:

    Oxidous (29.12.2015)

Страница 1 из 2 12 ПоследняяПоследняя
Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Проблема использования лицензий GNU GPL в России
    от >Quiet Snow< в разделе Юридические вопросы
    Ответов: 8
    Последнее сообщение: 17.08.2014, 04:27
  2. Поздравление от команды iforum
    от Dispetcher14 в разделе Флейм
    Ответов: 9
    Последнее сообщение: 01.01.2014, 20:13
  3. Ответов: 0
    Последнее сообщение: 08.05.2012, 19:30
  4. Ответов: 4
    Последнее сообщение: 29.02.2012, 00:59
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •