Ввести два 16-битовых целых числа А и В. Вычислить результат логического побитового исключающего ИЛИ чисел 10* - Assembler

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

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

Помогите найти ошибку. Все компилируется, но при запуске вылетает с ошибкой.
Листинг программы
  1. model small
  2. outmsg macro msg ; macros dlya vivoda na ekran
  3. push eax
  4. push edx
  5. mov ah,09h
  6. lea dx,msg
  7. int 21h
  8. pop edx
  9. pop eax
  10. endm
  11. .stack 100h ;zadaem razmer steka
  12. .data ;nachalo bloka peremennih
  13. MSG1 DB "Input A(0..255): ",'$'; zadaem strokovie peremennie
  14. MSG2 DB "Input B(0..255): ",'$'
  15. ERROR_MSG DB "Slishkom bolshoe chislo!",'$'
  16. .code ;nachalo bloka koda
  17. .486
  18. calc proc far ;procedura operacii
  19. ;vipolnyaem 6*B^2
  20. mov ecx,eax
  21. mov eax,ebx
  22. mul ebx
  23. mov ebx,eax
  24. mov eax,6
  25. mul ebx
  26. mov ebx,eax
  27. ; vipolnyaem A*10
  28. mov eax,10
  29. mul ecx
  30. xchg eax,ecx
  31. ;vipolnyaem pobitovoe logicheskoe ili resultat zanositsya v eax
  32. xor eax,ebx
  33. calc endp
  34. printRes proc
  35. test eax,eax
  36. jns nsig
  37. mov ecx,eax
  38. mov ah,02h
  39. mov dl,'-'
  40. int 21h
  41. mov eax,ecx
  42. neg eax
  43. nsig:
  44. xor ecx,ecx
  45. mov ebx,10
  46. nums:
  47. xor edx,edx
  48. div ebx
  49. push edx
  50. inc cx
  51. test eax,eax
  52. jnz nums
  53. mov ah,02h
  54. show:
  55. pop edx
  56. add dl,'0'
  57. int 21h
  58. loop show
  59. ret
  60. printRes endp
  61.  
  62. MAIN: ;tochka vhoda v programmu
  63. mov ax,@data ;zadaem adress segmenta dannih
  64. mov ds,ax
  65. xor eax,eax ; eax = 0
  66. xor ebx,ebx ; ebx = 0
  67. xor ecx,ecx ; ecx = 0
  68. mov edx,10 ; stepen sistemi ischisleniya
  69. outmsg MSG1 ; Daem zapros na A
  70. INPUT_A:
  71. mov ch,01h;vvod s klaviaturi
  72. int 21h ;prerivanie
  73. je NEXT ;perehod k B
  74. sub cl,30h ;perevodim simvol v chislo
  75. cbw ;rasshiryaem do word
  76. mul edx ;primenyaem systemy ischisleniya
  77. add eax,ecx ;dobavlyaem vvedennuyu cifru k predidushemy chislu
  78. jmp INPUT_A ;povtoryaem cikl
  79. NEXT:
  80. outmsg MSG2 ; Daem zapros na B
  81. INPUT_B:
  82. mov ch,01h;vvod s klaviaturi
  83. int 21h ;prerivanie
  84. je END_INPUT ;okonchanie vvoda
  85. sub cl,30h ;perevodim simvol v chislo
  86. cbw ;rasshiryaem do word
  87. mul edx ;primenyaem systemy ischisleniya
  88. add ebx,ecx ;dobavleyaem vvedennuyu cifru k predidushemy chislu
  89. jmp INPUT_B ;povtoryaem cikl
  90. END_INPUT:
  91. cmp eax,255 ;proverka na dopustimost znacheniya
  92. ja ERROR
  93. cmp ebx,255 ;proverka na dopustimost znacheniya
  94. ja ERROR
  95. call calc
  96. ERROR:
  97. outmsg ERROR_MSG
  98. jmp EXIT
  99. EXIT:
  100. mov ax,4c00h
  101. int 21h
  102. end MAIN
Заранее спасибо)

Решение задачи: «Ввести два 16-битовых целых числа А и В. Вычислить результат логического побитового исключающего ИЛИ чисел 10*»

textual
Листинг программы
  1. .model small                ;model pamati small
  2. outmsg macro msg
  3.     push eax
  4.     push edx
  5.     mov ah,09h
  6.     lea dx,msg
  7.     int 21h
  8.     pop edx
  9.     pop eax
  10. endm
  11. .stack 256              ;stek zanimaet 256 baitov
  12. .data                   ;segment dannyh
  13.     Mess1     db 'Vvedite chislo A (-224..+225): $'
  14.     Mess2     db 'Vvedite chislo B (-224..+225): $'
  15.     Exit_Mess db 10,13,'Nazhmite lubuju klavishu...$'
  16.     error db "incorrect number$"
  17.     buff    db 6,7 Dup(?)
  18. .code  
  19. .486            
  20.     ;procedura vychislaet 6*B^2  i A*10
  21.     ; Znachenie B peredaetsa cherez registr bx
  22.     ; Znachenie A peredaetsa cherez registr bp
  23. ;Rezultat vychislenij peredaetsa cherez registr ax.
  24. calc proc far
  25.     mov ax,bx; zanosim B v ax
  26.     mul bx ;umnojaem B na B
  27.     mov bx,ax ;vozvrashaem resultat v bx
  28.     mov ax,6 ;zanosim 6 v ax
  29.     mul bx ;umnojaem B^2 na 6
  30.     mov bx,ax ;vozvrashaem resultat 6*B^2
  31.    ;vipolnyaem A*10
  32.     mov ax,10 ;zanosim v ax 10
  33.     mul bp ;umnojaem A na 10
  34.     mov bp,ax ;vozvrashaem resultat  
  35.     xor bp,bx  ;vipolnyaem pobitovoe logicheskoe ili resultat zanositsya v bp
  36.     mov ax,bp ; otpravlyaem resultat v ax
  37.     ret
  38. calc endp
  39.  
  40. ;procedura vyvodit chislo iz registra ax na ekran
  41. prints proc  ;pechataet soderjimoe ax
  42.       mov cx,10         ;v cx zanosim delitel 10
  43.     xor di,di           ;ochistka di (kolichestvo cifr v chisle)
  44.     ;esli ax<0, to pechataem '-' i delaem ax polozhitelnym
  45.     or ax,ax            ;proveraem ax
  46.     jns conv            ;esli ax>0 (SF=0), to perehod na metku conv
  47.     push ax             ;pomeschaem ax v stek
  48.     mov dx,'-'          ;zanosim v dx '-'
  49.     mov ah,2                ;vyvod '-' na ekran
  50.     int 21h
  51.     pop ax              ;vosstanavlivaem ax
  52.     neg ax              ;delaem ax polozhitelnym
  53.  conv:
  54.     xor dx,dx           ;ochistka dx
  55.     div cx                      ;dl = ax mod 10,
  56.     add dl,'0'          ;perevodim ostatok v simvol
  57.     inc di              ;uvelichivaem kolichestvo cifr v chisle na 1
  58.     push dx                     ;ostatok pomeschaem v stek
  59.     or ax,ax            ;proveraem ax (chastnoe)
  60.     jnz conv            ;esli ax<>0, to perehod na metku conv
  61.                     ;i povtoraem delenie
  62.     ;vyvod cifr iz steka na ekran
  63. print:
  64.     pop dx              ;izvlekaem iz steka ocherednoj simvol
  65.     mov ah,2            ;vyvodim ego na ekran
  66.     int 21h
  67.     dec di              ;umenshaem schetchik cifr
  68.     jnz print           ;esli di<>0 (ZF=0), to perehod na metku print
  69.                     ;i povtoraem pechat' simvola
  70.     ret             ;vyhod iz procedury          
  71.     prints endp
  72.    
  73. InputInt proc
  74. INPUT: ; vvod chisla  s klaviaturi
  75. mov ah,0ah
  76.     xor di,di
  77.     mov dx,offset buff ; adres bufera
  78.     int 21h ; prinimaem stroku
  79.     mov dl,0ah
  80.     mov ah,02
  81.     int 21h ; vivodim perevodya stroku
  82.    
  83.     ; obrabativaem bufer
  84.     mov si,offset buff+2 ; berem adres nacala stroki
  85.     cmp byte ptr [si],"-" ; esli perviy simvol -
  86.     jnz ii1
  87.     mov di,1  ; ustanavlivaem flag
  88.     inc si    ; i propuskaem
  89. ii1:
  90.     xor ax,ax
  91.     mov bx,10  ; osnovanie
  92. ii2:
  93.     mov cl,[si] ; berem simvol is bufera
  94.     cmp cl,0dh  ; provaryaem ne posledniy li on
  95.     jz endin
  96.    
  97.     ; esli ne posledniy ti proveryaem na pravilnost
  98.     cmp cl,'0'  ; esli vvedenniy simvol <0
  99.     jb er
  100.     cmp cl,'9'  ; esli vvedenniy simvol >9
  101.     ja er
  102.  
  103.     sub cl,'0' ; perevodim v chislo
  104.     mul bx     ; umnojaem na 10
  105.     add ax,cx  ; dobavlyaem k ostalnim
  106.     inc si     ; ukazatel na sleduyushiy simvol
  107.     jmp ii2     ; povtoryaem
  108.  
  109.     er:   ; esli bila oshibka to soobshaem i vihodim
  110.     mov dx, offset error
  111.     mov ah,09
  112.     int 21h
  113.     int 20h
  114.  
  115.     ; vse simvoli obrabotani chislo nahoditsya v ax
  116. endin:
  117.     cmp di,1 ; esli ustanovlen flag to
  118.     jnz ii3
  119.     neg ax   ; delaem chislo otricatelnim
  120. ii3:
  121.     ret
  122. InputInt endp
  123. main:                   ;tochka vhoda v programmu
  124.     mov ax,@data        ;zanesenie adresa segmenta dannyh v ax
  125.     mov ds,ax           ;kopiruem ax v ds  
  126.     mov dx,10
  127.     outmsg Mess1
  128.     call InputInt
  129.     mov bp,ax
  130.     outmsg Mess2
  131.     call InputInt
  132.     xor bx,bx
  133.     mov bx,ax    
  134.     call calc
  135.     call prints
  136.     jmp exit
  137. exit:
  138.     lea dx,Exit_Mess        ;v dx zanosim smeschenie Exit_Mess
  139.     mov ah,09h          ;v ah zanosim 9 funkciju DOS    
  140.     int 21h             ;vyzov preryvanija 21h
  141.     ;ozhidanie nazhatija klavishi
  142.     mov ah,00h          ;v ah zanosim funkciju 00h  
  143.     int 16h             ;vyzov preryvanija 16h
  144.     ;vyhod iz programmy  
  145.     mov ah,4ch          ;v ah zanosim funkciju 4Ch DOS  
  146.     int 21h             ;vyzov preryvanija 21h    
  147.  
  148. end main                ;konec programmy main

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

  1. На строке 5 объявляется модель памяти small.
  2. На строках 7-12 объявляются макросы outmsg, который выводит сообщение на экран, соответствующие строки Mess1, Mess2 и Exit_Mess.
  3. На строке 14 объявляется стек размером 256 байт.
  4. На строке 16 объявляется сегмент данных.
  5. На строках 18-25 объявляется переменная error со значением incorrect number.
  6. На строке 26 объявляется переменная buff как массив из 6 элементов.
  7. На строке 31 начинается процедура calc, которая вычисляет результат логического побитового исключающего ИЛИ.
    • Значение переменной B передается через регистр bx.
    • Значение переменной A передается через регистр bp.
    • Результат вычислений сохраняется в регистре ax.
  8. На строке 61 начинается процедура prints, которая выводит число из регистра ax на экран.
  9. На строке 107 начинается процедура InputInt, которая считывает число с клавиатуры.
  10. На строке 171 начинается основная программа main:
    • Сначала вводится число A с помощью вызова процедуры InputInt и сохраняется в регистре bp.
    • Затем вводится число B с помощью вызова процедуры InputInt и сохраняется в регистре bx.
    • Затем вызывается процедура calc для вычисления результата логического побитового исключающего ИЛИ и результат сохраняется в регистре ax.
    • Затем вызывается процедура prints для вывода результата на экран.
    • Наконец, программа завершается с выводом сообщения Nazhmite lubuju klavishu... и ожиданием нажатия клавиши.
  11. Программа завершается с вызовом прерывания 4Ch для выхода из программы.

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


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

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

14   голосов , оценка 4.429 из 5

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

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

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