Напечатать "да", если введенное число делится на 3 и на 2 одновременно... - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, уже не первый день пытаюсь написать программу по заданию: "Напечатать "да", если введенное число делится на 3 и на 2 одновременно, "или", если делится или на 3 или на 2, "нет", если не делится ни на 3, ни на 2." Все время ошибка во время компиляции, но никак не могу ее найти и исправить, надеюсь Вы мне поможете. P.S. Pascal с Assembler-вставкой.

Решение задачи: «Напечатать "да", если введенное число делится на 3 и на 2 одновременно...»

textual
Листинг программы
  1. ;
  2. ; MASM Forever
  3. ;
  4. .186
  5. .MODEL TINY, STDCALL
  6. OPTION CASEMAP: NONE
  7. ;
  8. CHAR  TYPEDEF     Byte
  9. PCHAR TYPEDEF     Ptr CHAR
  10. PSTR  TYPEDEF     PCHAR
  11. PW    TYPEDEF     Ptr Word
  12. PSKB  TYPEDEF     Ptr KBINP
  13. ;
  14. CR          EQU   0Dh
  15. LF          EQU   0Ah
  16. MaxChars    EQU   80
  17. KbInpLen    EQU   MaxChars
  18. MaxNumbLen  EQU   MaxChars/4
  19. ;
  20. KBINP STRUCT
  21. nbMax Byte  ?
  22. nbInp Byte  ?
  23. chBuf CHAR  KbInpLen Dup (?)
  24. KBINP ENDS
  25. ;
  26. decStr2BinNum     PROTO pStrDec:PSTR, lenStrDec:Word, pwNumb:PW, lenwNumb:Word
  27. binNum2DecStr     PROTO pwNumb:PW, lenwNumb:Word, pCharBuf:PCHAR
  28. stdIn2Sc          PROTO psKb:PSKB, KbLen:Word
  29. s$2StdOut         PROTO pSd:PSTR
  30. ;
  31. .DATA
  32. s$AppInfo   CHAR  "Cascade Multiplication/Division Demo Program", CR, LF
  33.             CHAR  "Coded in Masm by KyberMax  (C:) TeraHard Labs  2016"
  34. s$CrLf      CHAR  CR, LF, "$"
  35. s$Input     CHAR  "Input Dec.Number (empty string - exit)", CR, LF, "$"
  36. s$Output    CHAR  "Dec.Number after DecStr->BinNum->DecStr", CR, LF, "$"
  37. s$WrongCh   CHAR  " wrong char", CR, LF, "$"
  38. ;
  39. .DATA?
  40. nwNumb      DW    MaxNumbLen  Dup (?)
  41. sKbInp      KBINP <>
  42. chDecOut    CHAR  MaxChars    Dup (?)
  43. ;
  44. .CODE
  45.       ORG   100h
  46. START:
  47.       INVOKE s$2StdOut, Addr s$AppInfo
  48. DEMO_LOOP:
  49.       INVOKE s$2StdOut, Addr s$Input
  50.       INVOKE stdIn2Sc, Addr sKbInp, KbInpLen
  51.       INVOKE s$2StdOut, Addr s$CrLf
  52.       JCXZ  EXIT
  53.       INVOKE decStr2BinNum, BX, CX, Addr nwNumb, LengthOf nwNumb
  54.       JNC   NUM2DEC
  55.       INVOKE s$2StdOut, Addr s$WrongCh
  56.       JMP   DEMO_LOOP
  57. NUM2DEC:
  58.       INVOKE s$2StdOut, Addr s$Output
  59.       INVOKE binNum2DecStr, Addr nwNumb, LengthOf nwNumb, Addr chDecOut
  60.       MOV   CHAR Ptr [BX], "$"
  61.       INVOKE s$2StdOut, Addr chDecOut
  62.       INVOKE s$2StdOut, Addr s$CrLf
  63.       JMP   DEMO_LOOP
  64. EXIT:
  65.       RET
  66. ;
  67. decStr2BinNum PROC Uses AX BX DX DI SI pstdec:PSTR, lstdec:Word, pwnumb:PW, lwnumb:Word
  68. ; Output: if error CF = 1
  69. ;         else     CX = word number
  70. LOCAL lwcur:Word
  71.       XOR   AX, AX
  72.       MOV   DI, pwnumb
  73.       MOV   CX, lwnumb  ; Length in words
  74.       REP STOSW         ; Numb = 0
  75.       MOV   lwcur, 1    ; Start with 1 word
  76.       MOV   SI, pstdec
  77.       MOV   BX, 10
  78. numloop:
  79.       XOR   AH, AH
  80.       LODSB
  81.       SUB   AL, "0"
  82.       JC    exit
  83.       CMP   AL, 10
  84.       CMC
  85.       JC    exit
  86.       PUSH  SI
  87.       PUSHF
  88.       MOV   SI, AX
  89.       MOV   DI, pwnumb
  90.       MOV   CX, lwcur
  91. mulloop:
  92.       MOV   AX, [DI]
  93.       MUL   BX
  94.       XCHG  DX, SI
  95.       POPF
  96.       ADC   AX, DX
  97.       PUSHF
  98.       STOSW
  99.       LOOP  mulloop
  100.       POPF
  101.       ADC   [DI], SI
  102.       JZ    nextchar
  103.       INC   lwcur
  104. nextchar:
  105.       POP   SI
  106.       DEC   lstdec
  107.       JNZ   numloop
  108.       CLC
  109.       MOV   CX, lwcur
  110. exit:
  111.       RET
  112. decStr2BinNum ENDP
  113. ;
  114. binNum2DecStr PROC Uses AX DX DI SI pwnumb:PW, lwnumb:Word, pchbuf:PCHAR
  115. ; Output: CX = number of chars
  116. ;         BX = pointer to next char
  117. ; Notice: destroys wnumb
  118.       MOV   AX, lwnumb  ; Length in words
  119.       DEC   AX
  120.       SHL   AX, 1
  121.       ADD   pwnumb, AX  ; Pointer to most signif.word
  122.       MOV   BX, 10
  123.       MOV   SI, pchbuf
  124.       STD
  125. numloop:
  126.       XOR   DX, DX
  127.       MOV   CX, lwnumb
  128.       MOV   DI, pwnumb
  129. skip0loop:
  130.       CMP   [DI], DX
  131.       JNZ   savelp
  132.       SUB   DI, SizeOf Word
  133.       LOOP  skip0loop
  134.       CMP   SI, pchbuf
  135.       JNE   reverstring
  136.       CALL  savedigit
  137.       JMP   reverstring
  138. savelp:
  139.       PUSH  numloop
  140.       MOV   lwnumb, CX
  141.       MOV   pwnumb, DI
  142. divloop:
  143.       MOV   AX, [DI]
  144.       DIV   BX
  145.       STOSW
  146.       LOOP  divloop
  147. savedigit:
  148.       ADD   DL, "0"
  149.       MOV   [SI], DL
  150.       INC   SI
  151.       RETN
  152. reverstring:
  153.       CLD
  154.       MOV   BX, SI      ; Save pointer to next char
  155.       MOV   CX, SI
  156.       DEC   SI          ; Pointer to last digit
  157.       MOV   DI, pchbuf  ; Pointer to first digit
  158.       SUB   CX, DI      ; Number of digits
  159.       MOV   DX, CX      ; Save for exit
  160.       SHR   CX, 1       ; /2
  161.       JCXZ  exit        ; 1 digit
  162. reverloop:
  163.       MOV   AL, [DI]
  164.       XCHG  [SI], AL
  165.       STOSB
  166.       DEC   SI
  167.       LOOP  reverloop
  168. exit:
  169.       MOV   CX, DX
  170.       RET
  171. binNum2DecStr ENDP
  172. ;
  173. stdIn2Sc PROC Uses AX DX pskb:PSKB, kblen:Word
  174. ; Output: BX = poitner to keyboard buffer
  175. ;         CX = chars.numb.
  176.       MOV   BX, pskb
  177.  ASSUME BX: Ptr KBINP
  178.       MOV   AL, Byte Ptr kblen
  179.       MOV   [BX].nbMax, AL
  180.       MOV   DX, BX
  181.       MOV   AH, 0Ah
  182.       INT   21h
  183.       XOR   CH, CH
  184.       MOV   CL, [BX].nbInp
  185.       LEA   BX, [BX].chBuf
  186.  ASSUME BX: Nothing
  187.       RET
  188. stdIn2Sc ENDP
  189. ;
  190. s$2StdOut PROC Uses AX DX ps$:PCHAR
  191.       MOV   DX, ps$
  192.       MOV   AH, 9
  193.       INT   21h
  194.       RET
  195. s$2StdOut ENDP
  196. ;
  197. END START
  198. ;

Объяснение кода листинга программы

Код написан на языке ассемблера (MASM) и реализует программу, которая выполняет следующую задачу:

  1. Определение и инициализация необходимых констант и типов данных.
    • Определение констант CR (каретка), LF (перевод строки), MaxChars (максимальная длина строки), KbInpLen (максимальная длина ввода числа), MaxNumbLen (максимальная длина введенного числа в десятичной системе счисления).
    • Определение пользовательских типов данных CHAR, PCHAR, PSTR, PW, PSKB.
    • Определение структуры KBINP, содержащей информацию о вводе с клавиатуры.
  2. Объявление необходимых переменных.
    • Объявление и инициализация строковых переменных s$AppInfo, s$CrLf, s$Input, s$Output, s$WrongCh.
    • Объявление числовых переменных nwNumb, sKbInp, chDecOut.
  3. Определение процедур и функций.
    • Определение процедур decStr2BinNum и binNum2DecStr для конвертации числа из десятичной системы счисления в двоичную и наоборот.
    • Определение процедур stdIn2Sc и s$2StdOut для чтения данных с клавиатуры и вывода данных на экран.
  4. Описывается логика работы программы.
    • Инициализация программы и вывод информации о программе.
    • Бесконечный цикл демонстрации программы.
      • Вывод просьбы о вводе числа и получение введенных данных с клавиатуры.
      • Если введенная строка пуста, программа завершается.
      • Конвертация введенного числа из строкового представления в двоичное число.
      • Если введенное число содержит недопустимые символы, выводится сообщение о некорректном символе и цикл продолжается.
      • Конвертация двоичного числа обратно в строковое представление.
      • Вывод строки исходного числа и полученного числа.
    • Завершение программы. Описанный код является примером программы на языке ассемблера (MASM) для выполнения задачи по конвертации числа из десятичной системы счисления в двоичную и наоборот.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы