Advertisement
Guest User

Untitled

a guest
May 26th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; main.asm   головна програма
  2. ; X=A4/B2-C1*(D1+E2-K) K=202 (Decimal K = 516)
  3.  
  4. DOSSEG
  5. EXTRN    Input :FAR, Calculation :FAR, Output :FAR
  6. PUBLIC   erFlag
  7. STACKSG         SEGMENT PARA STACK 'Stack'
  8. DW      127 DUP(0)
  9. STACKSG         ENDS
  10. DATASG  SEGMENT PARA PUBLIC 'Data'
  11.           erFlag  DB      0
  12. DATASG  ENDS
  13. CODESG  SEGMENT PARA PUBLIC 'Code'
  14. main:
  15. ASSUME  CS:CODESG,DS:DATASG,SS:STACKSG
  16. MOV     AX,DATASG
  17. MOV     DS,AX
  18.  
  19. CALL    Input
  20.     cmp erFlag,0
  21.     jne A30    
  22. CALL    Calculation    
  23.     cmp erFlag,0
  24.     jne A30    
  25. CALL    Output
  26.     cmp erFlag,0
  27.     jne A30    
  28. A30:
  29.         mov ah,4Ch
  30.     int 21h
  31. CODESG  ENDS
  32. END   main          
  33.  
  34.  
  35.  
  36. ;Input.asm   модуль вводу даних            
  37. DOSSEG
  38. EXTRN    erFlag:BYTE
  39. PUBLIC A,B,C,D,E,
  40.  
  41. MY_MUL   MACRO   X,Y,Z  
  42.                   mov z,0
  43.                   mov z+2,0
  44.                  MOV     AX,X  
  45.                  MUL     Y    
  46.                  MOV    Z,AX  
  47.                  MOV    Z+2,DX
  48.                  MOV     AX,X+2
  49.                  MUL     Y    
  50.                  ADD    Z+2,AX
  51.                  mov ax,Z
  52.                  mov dx,Z+2
  53.                  
  54. ENDM  
  55. DATASG  SEGMENT PARA PUBLIC 'Data'
  56.  
  57. A   dd  00h
  58. B   dw  00h
  59. C   dd  00h
  60. D   db  00h
  61. E   db  00h
  62.  
  63. FlagSign dw 0
  64. TempStr db     10 dup (0)
  65. TempBin dw     0,0
  66. MaxLen  dw       0
  67. Mult10   dw 1,0
  68. my_z dw 0,0
  69. MESSG_X  DB     13,10,'X=A4/B2+C3-D1*E1+K   K=202 (Decimal K = 514)','$'
  70. MESSG_A  DB     13,10,'A= ','$'
  71. MESSG_B  DB     13,10,'B= ','$'
  72. MESSG_C  DB     13,10,'C= ','$'
  73. MESSG_D  DB     13,10,'D= ','$'
  74. MESSG_E  DB     13,10,'E= ','$'
  75. MESSG_X1  DB     13,10,'X= ','$'
  76. erStr1  db  13,10,'Data not input_variable',13,10,'$'
  77. erStr2  db  13,10,'Incorrectly data ',13,10,'$'
  78. erStr2_1  db  13,10,' B =0 --> divide by zero ',13,10,'$'
  79. erStr3  db  13,10,'Data is too long ',13,10,'$'
  80. DATASG  ENDS
  81.  
  82. CODESG  SEGMENT PARA PUBLIC 'CODE'
  83. ASSUME  DS:DATASG, CS:CODESG
  84.  
  85.  
  86. input proc  FAR
  87. public Input
  88. LEA     DX,MESSG_X    
  89. MOV     AH,09
  90. INT     21H
  91.  
  92. LEA     DX,MESSG_A    
  93. MOV     AH,09
  94. INT     21H
  95. mov di,offset A
  96. mov MaxLen,3
  97. mov cx,MaxLen
  98. call input_variable
  99.  
  100.  
  101. LEA     DX,MESSG_B    
  102. MOV     AH,09
  103. INT     21H
  104. mov di,offset B
  105. mov MaxLen,3
  106. mov cx,MaxLen
  107. call input_variable
  108.  
  109. cmp B,0
  110. jne dali
  111. mov erFlag,1
  112. mov ah,09
  113. mov dx, offset erStr2_1
  114. int 21h
  115. mov ah,4Ch
  116. int 21h
  117.  
  118.  
  119. dali:LEA     DX,MESSG_C    
  120. MOV     AH,09
  121. INT     21H
  122. mov di,offset C
  123. mov MaxLen,5
  124. mov cx,MaxLen
  125. call input_variable
  126.  
  127.  
  128. LEA     DX,MESSG_D    
  129. MOV     AH,09
  130. INT     21H
  131. mov di,offset D
  132. mov MaxLen,3
  133. mov cx,MaxLen
  134. call input_variable
  135.  
  136.  
  137. LEA     DX,MESSG_E    
  138. MOV     AH,09
  139. INT     21H
  140. mov MaxLen,3
  141. mov cx,MaxLen
  142. call input_variable
  143.  
  144.  
  145. ret
  146. input endp
  147.  
  148. input_variable PROC
  149. mov si,0
  150. In_00:mov ah,01
  151. int 21h
  152. cmp al,0Dh
  153. je In_1
  154. cmp al,'-'
  155. jne In_0
  156. mov FlagSign,1
  157. jmp In_00
  158. In_0:  mov dl,al
  159. call CHECK_BYTE
  160. mov TempStr[si],dl
  161. inc si
  162. loop In_00
  163. In_1:   push si
  164. dec si
  165. cmp cx,MaxLen
  166. jne In_2
  167. LEA     DX,erSTR1
  168. MOV     AH,09
  169. INT     21H
  170. mov erFlag,1
  171. jmp  In_5
  172. In_2:   mov bh,0
  173. mov bl,TempStr[si]
  174. MY_MUL Mult10,bx,my_z
  175. add  TempBin,ax
  176. adc  TempBin+2,dx
  177. mov  bh,0
  178. mov bl,10
  179. MY_MUL Mult10,bx,my_z
  180. mov Mult10,ax
  181. mov Mult10+2,dx
  182. dec si
  183. cmp si,0
  184. jge In_2
  185. mov ax,TempBin
  186. mov dx,TempBin+2
  187. pop si
  188. cmp si,MaxLen
  189. jl In_3
  190. cmp MaxLen,10
  191. jl  In_2_1
  192. js  In_Err
  193. cmp dx,0FFFFh
  194. ja In_Err
  195. jmp In_3
  196. In_2_1:cmp MaxLen,5
  197. jl  In_2_2
  198. cmp dx,00
  199. ja In_Err
  200. cmp ah,0FFh
  201. ja In_Err
  202. jmp In_3
  203. In_2_2:cmp ax,00FFh
  204. jbe In_3
  205. In_Err:LEA     DX,erSTR3
  206. MOV     AH,09
  207. INT     21H
  208. mov erFlag,1
  209. jmp  In_5
  210. In_3:cmp FlagSign,1
  211. jne In_4
  212. mov bx,0
  213. sub bx,ax
  214. mov ax,bx      
  215. mov bx,0
  216. sbb bx,dx
  217. mov dx,bx
  218. In_4:   mov [di],ax
  219. mov [di+2],dx
  220. mov TempBin,0
  221. mov TempBin+2,0
  222. mov Mult10,1
  223. mov Mult10+2,0
  224. mov FlagSign,0
  225. In_5:  RET  
  226. input_variable  ENDP
  227.  
  228. CHECK_BYTE  PROC
  229. sub dl,30h
  230. cmp dl,00
  231. jl ErS
  232. cmp dl,0Ah
  233. jl GO
  234. ErS:    LEA     DX,erSTR2
  235. MOV     AH,09
  236. INT     21H
  237. GO:    RET
  238. CHECK_BYTE ENDP
  239.  
  240. CODESG  ENDS
  241. END  
  242.  
  243. ; calc.asm  модуль обчислень
  244. DOSSEG
  245.  
  246. EXTRN   A:BYTE,B:BYTE,C:WORD,D:BYTE,E:BYTE
  247. PUBLIC  X;,MESSG_Sign
  248.  
  249. DATASG  SEGMENT PARA PUBLIC 'Data'
  250.  
  251. K EQU 202h
  252. Temp1   dw  00h,00h
  253. Temp2   dw  00h
  254. Temp3   dw  00h
  255. Temp4   dw  00h,00h
  256. X   dw  00h,00h
  257.  
  258. DATASG  ENDS
  259.  
  260.  
  261. CODESG  SEGMENT PARA PUBLIC 'CODE'
  262. ASSUME  DS:DATASG, CS:CODESG
  263. MOV     AX,DATASG
  264. MOV     DS,AX
  265.  
  266. calculation proc Far
  267. public calculation
  268. xor ax,ax
  269. xor bx,bx
  270. xor cx,cx
  271. xor dx,dx
  272. ;Temp1 <- A4/B2   ; в цьому блоці виконуємо операцію ділення
  273. mov ax,word ptr A+2 ; переміщуємо старшу частину змінної А в регістр ах
  274. mov bx,1 ; переміщуємо 1 в регістр bx
  275. mul bx ; робимо множення на 1
  276. div B ; виконуємо ділення
  277. mov Temp1+2,ax ; записуємо частку старшої частини в Temp1 зі зміщенням на 2 байти
  278. mov ax,word ptr A ; переміщуємо молодшу частину змінної А у регістр ах
  279. div B ; виконуємо ділення
  280. mov Temp1,ax ; записуємо частку в Temp1
  281. ;Temp2 <- D1*E1      ; в цьому блоці виконуємо операцію множення
  282. mov ax,0 ; онулюємо регістр ах
  283. mov ax,word ptr D ; переносимо значення змінної D в регістр ax
  284. mul E ; виконуємо множення
  285. mov Temp2,ax ; молодший результат множення записуємо в Temp2
  286. mov Temp2+2,dx ; старший результат множення записуємо в Temp2 зі зміщення у 2 байти
  287. ;Temp1 + C3 - Temp2 – K ; в цьому блоці виконуємо операцію додавання та віднімання з використанням
  288. ; проміжних результатів та змінних
  289. mov ax,0  ; онулюємо регістр ах
  290. mov ax, word ptr C ; переносимо значення зміноої С в регістр ах
  291. add ax,Temp1 ; виконуємо додавання
  292. adc dx,Temp1+2 ; виконуємо додавання з врахуванням переносу
  293. sub ax,Temp2 ; виконуємо віднімання
  294. sbb dx,0 ; виконуємо віднімання з запозиченням
  295. add ax,K ; виконуємо додавання
  296. mov X,ax ; переміщаємо молодшу частину результату з регістру ах у змінну Х
  297. mov X+2,dx ; переміщаємо старшу частину результату з регістру dх у змінну Х зі зміщенням на 2 байти
  298.  
  299. ret
  300. calculation endp
  301.  
  302. CODESG  ENDS
  303. END  
  304.  
  305. ;Output.asm   модуль виводу результату
  306. DOSSEG
  307. EXTRN  X:DWORD;, MESSG_Sign :BYTE
  308.  
  309. DATASG  SEGMENT PARA PUBLIC 'Data'
  310. X_Str    db     10 dup (0)
  311. MESSG_X1  DB     13,10,'X= ','$'
  312. X_div2   dw   0,0
  313. Y_div2   dw   0
  314. DATASG  ENDS
  315. CODESG  SEGMENT PARA PUBLIC 'CODE'
  316. ASSUME  DS:DATASG, CS:CODESG
  317. MOV     AX,DATASG
  318. MOV     DS,AX
  319. output PROC FAR
  320. Public output
  321. mov di,0
  322. mov Y_div2,10
  323. mov cx,word ptr X
  324. mov bx,word ptr X+2
  325. O_1:mov X_div2,cx
  326. mov X_div2+2,bx
  327. call my_div2
  328. add dl,30h
  329. mov X_Str[di],dl
  330. inc di
  331. cmp bx,0
  332. ja O_1
  333. cmp cx,10
  334. jae O_1
  335. add cl,30h
  336. mov X_Str[di],cl
  337. mov dx,offset MESSG_X1
  338. mov ah,09
  339. int 21h
  340. O_2:    mov dl,X_Str[di]
  341. mov ah,02h
  342. int 21h
  343. dec di
  344. jge O_2
  345. ret
  346. output ENDP
  347.  
  348. MY_DIV2 proc
  349. sub cx,cx
  350. sub bx,bx
  351. mov dx,X_div2+2
  352. mov ax,X_div2
  353.  M2_D1:
  354. cmp dx,Y_div2
  355. jb M2_D3
  356. sub ax,Y_div2
  357. sbb dx,00
  358. add cx,01
  359. adc bx,0
  360. jmp M2_D1
  361. M2_D3:
  362. div Y_div2
  363. add cx,ax
  364. adc bx,00
  365. ret
  366. MY_DIV2 ENDP
  367.  
  368. CODESG  ENDS
  369. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement