Advertisement
Guest User

Untitled

a guest
May 26th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.52 KB | None | 0 0
  1. ;Elior
  2. IDEAL
  3. MODEL small
  4. STACK 100h
  5. DATASEG
  6. var1 dw 0
  7. var2 dw 0
  8. op db ?
  9.  
  10. power dw 1
  11.  
  12. ; buffer for var1
  13. bufferSize1 db 6 ; how many characters do I want to get as an input + 1 for enter at the end
  14. inputLength1 db 0 ; number of characters
  15. input1 db 6 dup(0) ; actual input
  16.  
  17. ;buffer for var2
  18. bufferSize2 db 6 ; how many characters do I want to get as an input + 1 for enter at the end
  19. inputLength2 db 0 ; number of characters
  20. input2 db 6 dup(0)
  21.  
  22. exitCondition db ? ; at var2 translate
  23.  
  24. res dw ?
  25. digits db 5 dup(0), '$'
  26.  
  27. modd dw ?
  28. start_msg db 10, 13, 'Welcome to my calculaotr!', 1, 10, 13, 'Enter first number, then press Enter, then operator, then second number and then Enter again', 10, 13, 'to exit press escape and then enter', 10, 13, 'supports only positive numbers as input and numbers untill 65,535', 10, 13, '$'
  29. err_msg db 'error$'
  30. CODESEG
  31. proc divide
  32. push bp
  33. mov bp,sp
  34. cmp [var2], 0
  35. je err1
  36.  
  37. xor dx, dx
  38. xor ax, ax
  39. mov ax, [var1]
  40. div [var2]
  41.  
  42. mov [res], ax
  43. mov [modd], dx
  44.  
  45. jmp print
  46. pop bp
  47. ret
  48. endp divide
  49. proc minus
  50. push bp
  51. mov bp,sp
  52. mov ax, [var1]
  53.  
  54. ; cmp ax, [var2]
  55. ; jb neg_minus
  56.  
  57. sub ax, [var2]
  58. mov [res], ax
  59. jmp print
  60. pop bp
  61. ret
  62. endp minus
  63. proc neg_minus
  64. push bp
  65. mov ah, 2
  66. mov dl, '-'
  67. int 21h
  68.  
  69. mov ax, [var2]
  70. sub ax, [var1]
  71. mov [res], ax
  72. jmp print
  73. pop bp
  74. ret
  75. endp neg_minus
  76. proc multiplay
  77. push bp
  78. mov bp,sp
  79. xor dx, dx
  80.  
  81. mov ax, [var1]
  82. mul [var2]
  83. mov [res], ax
  84.  
  85. ; if dd then err
  86. jmp print
  87. pop bp
  88. ret
  89. endp multiplay
  90. start:
  91. mov ax, @data
  92. mov ds, ax
  93. ; --------------------------
  94. ; Your code here
  95. ; --------------------------
  96. ; print starting msg
  97. mov ah, 9
  98. mov dx, offset start_msg
  99. int 21h
  100.  
  101. ; set cx=0 and start the main loop
  102. jmp get_inputs
  103. close_exit:
  104. jmp exit
  105. err1:
  106. mov dx, offset err_msg
  107. mov ah, 9
  108. int 21h
  109. jmp get_inputs
  110. get_inputs:
  111. ; reset numbers for new run
  112. mov [var1], 0
  113. mov [var2], 0
  114. mov [power], 1
  115.  
  116. ;new line
  117. mov ah, 2
  118. mov dl, 10
  119. int 21h
  120. mov dl, 13
  121. int 21h
  122.  
  123. ;get var1
  124. mov dx, offset bufferSize1 ; load our pointer to the beginning of the structure
  125. mov ah, 10
  126. int 21h
  127.  
  128. ; if escape is pressed
  129. cmp [byte ptr offset input1], 1Bh
  130. je close_exit
  131.  
  132. ;new line
  133. mov ah, 2
  134. mov dl, 10
  135. int 21h
  136. mov dl, 13
  137. int 21h
  138.  
  139. ; get op
  140. mov ah, 1
  141. int 21h
  142. mov [op], al
  143.  
  144. ;new line
  145. mov ah, 2
  146. mov dl, 10
  147. int 21h
  148. mov dl, 13
  149. int 21h
  150.  
  151. ;get var2
  152. mov ah, 9
  153. mov dx, offset bufferSize2 ; load our pointer to the beginning of the structure
  154. mov ah, 10
  155. int 21h
  156.  
  157. ;new line
  158. mov ah, 2
  159. mov dl, 10
  160. int 21h
  161. mov dl, 13
  162. int 21h
  163.  
  164.  
  165. ; translate var1
  166. ; set bl as the end of the input
  167. mov bx, offset input1
  168. add bl, [inputLength1]
  169. dec bl
  170.  
  171. ; set loop to number chracters
  172. mov cl, [inputLength1]
  173.  
  174. jmp var1loop
  175. var1loop:
  176. ; var1 += ([bl]-30h) * power
  177. ; var1 += ([bl + 8]-30h) * power
  178.  
  179. ;var1
  180. xor ax, ax
  181.  
  182. ; sub 30 from each number so it will be real number
  183. mov al, [bx]
  184. sub al, 30h
  185.  
  186. ; if not a number error
  187. cmp al, 10
  188. jae err1
  189.  
  190. ; ax = [bl] * power
  191. mul [power]
  192.  
  193. add [var1], ax
  194.  
  195. ; power *= * 10
  196. mov ax, [power]
  197. push bx ; save bx
  198. mov bx, 10
  199. mul bx
  200. mov [power], ax
  201. pop bx ; get saved bx
  202.  
  203.  
  204. ; set bl to next digit
  205. dec bl
  206.  
  207. loop var1loop
  208.  
  209. mov [power], 1
  210.  
  211. ; set bx to correct position of of input2
  212. mov bx, offset input2
  213. add bl, [inputLength2]
  214. dec bx
  215.  
  216. ; set loop to number chracters
  217. mov cl, [inputLength2]
  218. xor ax, ax
  219. var2loop:
  220. xor ax, ax
  221.  
  222. ; put number in ax
  223. mov al, [bx]
  224. ; sub 30 from each number so it will be real number
  225. sub al, 30h
  226.  
  227. ; if not a number
  228.  
  229. ; ax = [bl] * power
  230. mul [power]
  231.  
  232. add [var2], ax
  233.  
  234. ; decrese exitCondition by one to stop the second loop when needed
  235.  
  236. ; power *= * 10
  237. mov ax, [power]
  238. push bx ; save bx
  239. mov bx, 10
  240. mul bx
  241. mov [power], ax
  242.  
  243. pop bx ; get saved bx
  244.  
  245. ; set bl to next digit
  246. dec bl
  247.  
  248. loop var2loop
  249.  
  250. ; check ops
  251.  
  252. cmp [op], '-' ; if -
  253. call minus
  254.  
  255. cmp [op], '*' ; if *
  256. call multiplay
  257.  
  258. cmp [op], '/' ; if /
  259. call divide
  260.  
  261. jmp err1
  262.  
  263.  
  264. print:
  265. ; 12345
  266. ; 12345 / 1000 = 12 => 12 / 10 => d1 = (/) 1, d2 = (%) 2
  267. ; 12345 / 100 = 123 => d3 = 123 % 10 = 3
  268. ; 12345 % 100 = 45 => d4 = 45 / 10 = 4, d5 = 45 % 10 = 5
  269.  
  270. ; d1, d2
  271. ; res / 1000
  272. xor dx, dx
  273. mov ax, [res]
  274. mov bx, 1000
  275. div bx
  276.  
  277. ; (res / 1000) / 10
  278. xor dx, dx
  279. mov bx, 10
  280. div bx
  281.  
  282. ; put result as first number and mod as second number
  283. mov [offset digits], al
  284. mov [offset digits + 1], dl
  285.  
  286. ; d3
  287. ; res / 100
  288. xor dx, dx
  289. mov ax, [res]
  290. mov bx, 100
  291. div bx
  292.  
  293. push dx
  294.  
  295. ; res mod 10
  296. xor dx, dx
  297. mov bx, 10
  298. div bx
  299.  
  300. ; put mod as 3rd digit
  301. mov [offset digits + 2], dl
  302.  
  303. ; d4 d5
  304. ; res mod 100
  305. pop ax
  306. ; (res mod 100) / 10
  307. xor dx, dx
  308. mov bx, 10
  309. div bx
  310.  
  311. mov [offset digits + 3], al
  312. mov [offset digits + 4], dl
  313.  
  314. mov cx, 5
  315. xor si, si
  316.  
  317. ; check when actual number starts
  318. lo1:
  319. cmp [byte ptr offset digits + si], 0
  320. je incStart
  321. jmp done
  322.  
  323. incStart:
  324. inc si
  325. loop lo1
  326. done:
  327.  
  328. ; print zero if all digits are 0
  329. cmp si, 5
  330. je printZero
  331. jmp notZero
  332.  
  333. printZero:
  334. mov ah, 2
  335. mov dx, '0'
  336. int 21h
  337. jmp get_inputs
  338.  
  339. notZero:
  340.  
  341.  
  342. ; translate numbers
  343. mov cx, 5
  344. sub cx, si
  345. mov bx, offset digits
  346. trans:
  347. add [byte ptr bx+si], 30h
  348. inc bx
  349. loop trans
  350.  
  351. ;print numbers
  352. mov dx, offset digits
  353. add dx, si
  354. mov ah, 9
  355. int 21h
  356.  
  357. cmp [op], '/'
  358. je mod_print
  359.  
  360. ; get numbers again
  361. jmp get_inputs
  362.  
  363. mod_print:
  364. ;12345
  365. ; 12345 / 1000 = 12 => 12 / 10 => d1 = (/) 1, d2 = (%) 2
  366. ; 12345 / 100 = 123 => d3 = 123 % 10 = 3
  367. ; 12345 % 100 = 45 => d4 = 45 / 10 = 4, d5 = 45 % 10 = 5
  368.  
  369. ; d1, d2
  370. ; res / 1000
  371. xor dx, dx
  372. mov ax, [modd]
  373. mov bx, 1000
  374. div bx
  375.  
  376. ; (res / 1000) / 10
  377. xor dx, dx
  378. mov bx, 10
  379. div bx
  380.  
  381. ; put result as first number and mod as second number
  382. mov [offset digits], al
  383. mov [offset digits + 1], dl
  384.  
  385. ; d3
  386. ; res / 100
  387. xor dx, dx
  388. mov ax, [modd]
  389. mov bx, 100
  390. div bx
  391.  
  392. push dx
  393.  
  394. ; res mod 10
  395. xor dx, dx
  396. mov bx, 10
  397. div bx
  398.  
  399. ; put mod as 3rd digit
  400. mov [offset digits + 2], dl
  401.  
  402. ; d4 d5
  403. ; res mod 100
  404. pop ax
  405. ; (res mod 100) / 10
  406. xor dx, dx
  407. mov bx, 10
  408. div bx
  409.  
  410. mov [offset digits + 3], al
  411. mov [offset digits + 4], dl
  412.  
  413. mov cx, 5
  414. xor si, si
  415.  
  416. ; check when actual number starts
  417. lo2:
  418. cmp [byte ptr offset digits + si], 0
  419. je incStart1
  420. jmp done1
  421.  
  422. incStart1:
  423. inc si
  424. loop lo2
  425. done1:
  426.  
  427. ;print (
  428. mov ah, 2
  429. mov dx, '('
  430. int 21h
  431.  
  432. ; print zero if all digits are 0
  433. cmp si, 5
  434. je print0
  435. jmp not0
  436.  
  437. print0:
  438. mov ah, 2
  439. mov dx, '0'
  440. int 21h
  441. jmp after0
  442.  
  443. not0:
  444.  
  445. ; translate numbers
  446. mov cx, 5
  447. sub cx, si
  448. mov bx, offset digits
  449. trans1:
  450. add [byte ptr bx+si], 30h
  451. inc bx
  452. loop trans1
  453.  
  454. ;print numbers
  455. mov dx, offset digits
  456. add dx, si
  457. mov ah, 9
  458. int 21h
  459.  
  460. after0:
  461.  
  462. ;print )
  463. mov ah, 2
  464. mov dx, ')'
  465. int 21h
  466.  
  467. jmp get_inputs
  468. exit:
  469. mov ax, 4c00h
  470. int 21h
  471. END start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement