Получить ассемблерный листинг из кода на с++ - Assembler

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

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

Здравствуйте! Требуется написать программу на ассемблере, которая бы занималась неким преобразованием текста. По условию не возбраняется получить ассемблерный код с помощью кода, написанного на любом высокоуровневом языке. Код должен запускаться каким-то образом. Также необходимо объяснить, что и почему сделал компилятор среды, в которой программа писалась. Помогите, пожалуйста. Пробовал получать ассемблерный листинг в visual studio 2010 и затем в этой же среде запускать, но ничего не вышло.
Листинг программы
  1. #include <stdio.h>
  2. int j=0;
  3. int pravilo1(char* str) {
  4. for (int i = 0; i<100; i++) if ((str[i]>64)&&(str[i]<91)) str[i]=65+25-(str[i]-65); //здесь надо заменить каждую заглавную букву её симметричной из алфавита (A -> Z, B -> Y и т.д.)
  5. printf("modified string = %s \n \n",str);
  6. return 0;
  7. }
  8.  
  9. int pravilo2(const char* str) {
  10. char buffer2[100];
  11. for (int i = 0; i<100; i++) if (str[i]!=str[i-1]) { buffer2[j]=str[i]; j++;} //а здесь, если попадаются подряд несколько одинаковых символов, то оставить один из них.
  12. printf("modified string = %s \n \n",buffer2);
  13. return 0;
  14. }
  15. void main(void)
  16. {
  17. char buffer[100]; //на вход с клавы идёт строка не более 100 символов
  18. char c=0; // просто, чтобы пауза в конце была
  19. int pravilo=0; //есть два правила, по которым строка будет преобразовываться
  20. for (int i = 0; i<100; i++) buffer[i]=0;
  21. gets(buffer); // прочитать строку
  22. printf(" \n \nishodnaya stroka = %s \n \n",buffer); // требуется вывести исходную строку сразу
  23. for (int i = 0; i<100; i++) {if (buffer[i]==0) continue; if (((buffer[i]>47)&&(buffer[i]<58))||((buffer[i]>64)&&(buffer[i]<91))||((buffer[i]>96)&&(buffer[i]<123))) pravilo=1; else pravilo=2;} //если текст включает в себя только цифры и латинские буквы, тогда применяется правило 1, если присутствуют иные символы, тогда правило 2
  24. printf("pravilo = %d \n \n", pravilo); //необходимо сослаться на номер используемого правила
  25. if (pravilo==1) pravilo1(buffer);
  26. if (pravilo==2) pravilo2(buffer);
  27. gets(&c);
  28. }
Листинг программы
  1. ; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01
  2. TITLE C:\Users\Админ\Documents\Visual Studio 2010\Projects\2 ДЗ ПО ИНФЕ\2 ДЗ ПО ИНФЕз по инфе.cpp
  3. .686P
  4. .XMM
  5. include listing.inc
  6. .model flat
  7. INCLUDELIB MSVCRTD
  8. INCLUDELIB OLDNAMES
  9. PUBLIC ?j@@3HA ; j
  10. _BSS SEGMENT
  11. ?j@@3HA DD 01H DUP (?) ; j
  12. _BSS ENDS
  13. PUBLIC ??_C@_0BJ@DPGPACEI@modified?5string?5?$DN?5?$CFs?5?6?5?6?$AA@ ; `string'
  14. PUBLIC ?pravilo1@@YAHPAD@Z ; pravilo1
  15. EXTRN __imp__printf:PROC
  16. EXTRN __RTC_CheckEsp:PROC
  17. EXTRN __RTC_Shutdown:PROC
  18. EXTRN __RTC_InitBase:PROC
  19. ; COMDAT ??_C@_0BJ@DPGPACEI@modified?5string?5?$DN?5?$CFs?5?6?5?6?$AA@
  20. ; File c:\users\админ\documents\visual studio 2010\projects\2 дз по инфе\2 дз по инфе\дз по инфе.cpp
  21. CONST SEGMENT
  22. ??_C@_0BJ@DPGPACEI@modified?5string?5?$DN?5?$CFs?5?6?5?6?$AA@ DB 'modifie'
  23. DB 'd string = %s ', 0aH, ' ', 0aH, 00H ; `string'
  24. CONST ENDS
  25. ; COMDAT rtc$TMZ
  26. rtc$TMZ SEGMENT
  27. __RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
  28. rtc$TMZ ENDS
  29. ; COMDAT rtc$IMZ
  30. rtc$IMZ SEGMENT
  31. __RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
  32. ; Function compile flags: /Odtp /RTCsu /ZI
  33. rtc$IMZ ENDS
  34. ; COMDAT ?pravilo1@@YAHPAD@Z
  35. _TEXT SEGMENT
  36. _i$3853 = -8 ; size = 4
  37. _str$ = 8 ; size = 4
  38. ?pravilo1@@YAHPAD@Z PROC ; pravilo1, COMDAT
  39. ; Line 5
  40. push ebp
  41. mov ebp, esp
  42. sub esp, 204 ; 000000ccH
  43. push ebx
  44. push esi
  45. push edi
  46. lea edi, DWORD PTR [ebp-204]
  47. mov ecx, 51 ; 00000033H
  48. mov eax, -858993460 ; ccccccccH
  49. rep stosd
  50. ; Line 6
  51. mov DWORD PTR _i$3853[ebp], 0
  52. jmp SHORT $LN4@pravilo1
  53. $LN3@pravilo1:
  54. mov eax, DWORD PTR _i$3853[ebp]
  55. add eax, 1
  56. mov DWORD PTR _i$3853[ebp], eax
  57. $LN4@pravilo1:
  58. cmp DWORD PTR _i$3853[ebp], 100 ; 00000064H
  59. jge SHORT $LN2@pravilo1
  60. mov eax, DWORD PTR _str$[ebp]
  61. add eax, DWORD PTR _i$3853[ebp]
  62. movsx ecx, BYTE PTR [eax]
  63. cmp ecx, 64 ; 00000040H
  64. jle SHORT $LN1@pravilo1
  65. mov eax, DWORD PTR _str$[ebp]
  66. add eax, DWORD PTR _i$3853[ebp]
  67. movsx ecx, BYTE PTR [eax]
  68. cmp ecx, 91 ; 0000005bH
  69. jge SHORT $LN1@pravilo1
  70. mov eax, DWORD PTR _str$[ebp]
  71. add eax, DWORD PTR _i$3853[ebp]
  72. movsx ecx, BYTE PTR [eax]
  73. sub ecx, 65 ; 00000041H
  74. mov edx, 90 ; 0000005aH
  75. sub edx, ecx
  76. mov eax, DWORD PTR _str$[ebp]
  77. add eax, DWORD PTR _i$3853[ebp]
  78. mov BYTE PTR [eax], dl
  79. $LN1@pravilo1:
  80. ; Line 7
  81. jmp SHORT $LN3@pravilo1
  82. $LN2@pravilo1:
  83. mov esi, esp
  84. mov eax, DWORD PTR _str$[ebp]
  85. push eax
  86. push OFFSET ??_C@_0BJ@DPGPACEI@modified?5string?5?$DN?5?$CFs?5?6?5?6?$AA@
  87. call DWORD PTR __imp__printf
  88. add esp, 8
  89. cmp esi, esp
  90. call __RTC_CheckEsp
  91. ; Line 8
  92. xor eax, eax
  93. ; Line 9
  94. pop edi
  95. pop esi
  96. pop ebx
  97. add esp, 204 ; 000000ccH
  98. cmp ebp, esp
  99. call __RTC_CheckEsp
  100. mov esp, ebp
  101. pop ebp
  102. ret 0
  103. ?pravilo1@@YAHPAD@Z ENDP ; pravilo1
  104. _TEXT ENDS
  105. PUBLIC __$ArrayPad$
  106. PUBLIC ?pravilo2@@YAHPBD@Z ; pravilo2
  107. EXTRN ___security_cookie:DWORD
  108. EXTRN @__security_check_cookie@4:PROC
  109. EXTRN @_RTC_CheckStackVars@8:PROC
  110. ; Function compile flags: /Odtp /RTCsu /ZI
  111. ; COMDAT ?pravilo2@@YAHPBD@Z
  112. _TEXT SEGMENT
  113. _i$3863 = -120 ; size = 4
  114. _buffer2$ = -108 ; size = 100
  115. __$ArrayPad$ = -4 ; size = 4
  116. _str$ = 8 ; size = 4
  117. ?pravilo2@@YAHPBD@Z PROC ; pravilo2, COMDAT
  118. ; Line 12
  119. push ebp
  120. mov ebp, esp
  121. sub esp, 316 ; 0000013cH
  122. push ebx
  123. push esi
  124. push edi
  125. lea edi, DWORD PTR [ebp-316]
  126. mov ecx, 79 ; 0000004fH
  127. mov eax, -858993460 ; ccccccccH
  128. rep stosd
  129. mov eax, DWORD PTR ___security_cookie
  130. xor eax, ebp
  131. mov DWORD PTR __$ArrayPad$[ebp], eax
  132. ; Line 14
  133. mov DWORD PTR _i$3863[ebp], 0
  134. jmp SHORT $LN4@pravilo2
  135. $LN3@pravilo2:
  136. mov eax, DWORD PTR _i$3863[ebp]
  137. add eax, 1
  138. mov DWORD PTR _i$3863[ebp], eax
  139. $LN4@pravilo2:
  140. cmp DWORD PTR _i$3863[ebp], 100 ; 00000064H
  141. jge SHORT $LN2@pravilo2
  142. mov eax, DWORD PTR _str$[ebp]
  143. add eax, DWORD PTR _i$3863[ebp]
  144. movsx ecx, BYTE PTR [eax]
  145. mov edx, DWORD PTR _str$[ebp]
  146. add edx, DWORD PTR _i$3863[ebp]
  147. movsx eax, BYTE PTR [edx-1]
  148. cmp ecx, eax
  149. je SHORT $LN1@pravilo2
  150. mov eax, DWORD PTR _str$[ebp]
  151. add eax, DWORD PTR _i$3863[ebp]
  152. mov ecx, DWORD PTR ?j@@3HA ; j
  153. mov dl, BYTE PTR [eax]
  154. mov BYTE PTR _buffer2$[ebp+ecx], dl
  155. mov eax, DWORD PTR ?j@@3HA ; j
  156. add eax, 1
  157. mov DWORD PTR ?j@@3HA, eax ; j
  158. $LN1@pravilo2:
  159. jmp SHORT $LN3@pravilo2
  160. $LN2@pravilo2:
  161. ; Line 15
  162. mov esi, esp
  163. lea eax, DWORD PTR _buffer2$[ebp]
  164. push eax
  165. push OFFSET ??_C@_0BJ@DPGPACEI@modified?5string?5?$DN?5?$CFs?5?6?5?6?$AA@
  166. call DWORD PTR __imp__printf
  167. add esp, 8
  168. cmp esi, esp
  169. call __RTC_CheckEsp
  170. ; Line 16
  171. xor eax, eax
  172. ; Line 17
  173. push edx
  174. mov ecx, ebp
  175. push eax
  176. lea edx, DWORD PTR $LN9@pravilo2
  177. call @_RTC_CheckStackVars@8
  178. pop eax
  179. pop edx
  180. pop edi
  181. pop esi
  182. pop ebx
  183. mov ecx, DWORD PTR __$ArrayPad$[ebp]
  184. xor ecx, ebp
  185. call @__security_check_cookie@4
  186. add esp, 316 ; 0000013cH
  187. cmp ebp, esp
  188. call __RTC_CheckEsp
  189. mov esp, ebp
  190. pop ebp
  191. ret 0
  192. $LN9@pravilo2:
  193. DD 1
  194. DD $LN8@pravilo2
  195. $LN8@pravilo2:
  196. DD -108 ; ffffff94H
  197. DD 100 ; 00000064H
  198. DD $LN7@pravilo2
  199. $LN7@pravilo2:
  200. DB 98 ; 00000062H
  201. DB 117 ; 00000075H
  202. DB 102 ; 00000066H
  203. DB 102 ; 00000066H
  204. DB 101 ; 00000065H
  205. DB 114 ; 00000072H
  206. DB 50 ; 00000032H
  207. DB 0
  208. ?pravilo2@@YAHPBD@Z ENDP ; pravilo2
  209. _TEXT ENDS
  210. PUBLIC ??_C@_0BB@IPHDNPAM@pravilo?5?$DN?5?$CFd?5?6?5?6?$AA@ ; `string'
  211. PUBLIC ??_C@_0BO@FKFDJBJO@?5?6?5?6ishodnaya?5stroka?5?$DN?5?$CFs?5?6?5?6?$AA@ ; `string'
  212. PUBLIC __$ArrayPad$
  213. PUBLIC _main
  214. EXTRN __imp__gets:PROC
  215. ; COMDAT ??_C@_0BB@IPHDNPAM@pravilo?5?$DN?5?$CFd?5?6?5?6?$AA@
  216. CONST SEGMENT
  217. ??_C@_0BB@IPHDNPAM@pravilo?5?$DN?5?$CFd?5?6?5?6?$AA@ DB 'pravilo = %d ', 0aH
  218. DB ' ', 0aH, 00H ; `string'
  219. CONST ENDS
  220. ; COMDAT ??_C@_0BO@FKFDJBJO@?5?6?5?6ishodnaya?5stroka?5?$DN?5?$CFs?5?6?5?6?$AA@
  221. CONST SEGMENT
  222. ??_C@_0BO@FKFDJBJO@?5?6?5?6ishodnaya?5stroka?5?$DN?5?$CFs?5?6?5?6?$AA@ DB ' '
  223. DB 0aH, ' ', 0aH, 'ishodnaya stroka = %s ', 0aH, ' ', 0aH, 00H ; `string'
  224. ; Function compile flags: /Odtp /RTCsu /ZI
  225. CONST ENDS
  226. ; COMDAT _main
  227. _TEXT SEGMENT
  228. _i$3879 = -156 ; size = 4
  229. _i$3874 = -144 ; size = 4
  230. _pravilo$ = -132 ; size = 4
  231. _c$ = -117 ; size = 1
  232. _buffer$ = -108 ; size = 100
  233. __$ArrayPad$ = -4 ; size = 4
  234. _main PROC ; COMDAT
  235. ; Line 20
  236. push ebp
  237. mov ebp, esp
  238. sub esp, 352 ; 00000160H
  239. push ebx
  240. push esi
  241. push edi
  242. lea edi, DWORD PTR [ebp-352]
  243. mov ecx, 88 ; 00000058H
  244. mov eax, -858993460 ; ccccccccH
  245. rep stosd
  246. mov eax, DWORD PTR ___security_cookie
  247. xor eax, ebp
  248. mov DWORD PTR __$ArrayPad$[ebp], eax
  249. ; Line 22
  250. mov BYTE PTR _c$[ebp], 0
  251. ; Line 23
  252. mov DWORD PTR _pravilo$[ebp], 0
  253. ; Line 25
  254. mov DWORD PTR _i$3874[ebp], 0
  255. jmp SHORT $LN14@main
  256. $LN13@main:
  257. mov eax, DWORD PTR _i$3874[ebp]
  258. add eax, 1
  259. mov DWORD PTR _i$3874[ebp], eax
  260. $LN14@main:
  261. cmp DWORD PTR _i$3874[ebp], 100 ; 00000064H
  262. jge SHORT $LN12@main
  263. mov eax, DWORD PTR _i$3874[ebp]
  264. mov BYTE PTR _buffer$[ebp+eax], 0
  265. jmp SHORT $LN13@main
  266. $LN12@main:
  267. ; Line 26
  268. mov esi, esp
  269. lea eax, DWORD PTR _buffer$[ebp]
  270. push eax
  271. call DWORD PTR __imp__gets
  272. add esp, 4
  273. cmp esi, esp
  274. call __RTC_CheckEsp
  275. ; Line 27
  276. mov esi, esp
  277. lea eax, DWORD PTR _buffer$[ebp]
  278. push eax
  279. push OFFSET ??_C@_0BO@FKFDJBJO@?5?6?5?6ishodnaya?5stroka?5?$DN?5?$CFs?5?6?5?6?$AA@
  280. call DWORD PTR __imp__printf
  281. add esp, 8
  282. cmp esi, esp
  283. call __RTC_CheckEsp
  284. ; Line 28
  285. mov DWORD PTR _i$3879[ebp], 0
  286. jmp SHORT $LN11@main
  287. $LN10@main:
  288. mov eax, DWORD PTR _i$3879[ebp]
  289. add eax, 1
  290. mov DWORD PTR _i$3879[ebp], eax
  291. $LN11@main:
  292. cmp DWORD PTR _i$3879[ebp], 100 ; 00000064H
  293. jge $LN9@main
  294. mov eax, DWORD PTR _i$3879[ebp]
  295. movsx ecx, BYTE PTR _buffer$[ebp+eax]
  296. test ecx, ecx
  297. jne SHORT $LN8@main
  298. jmp SHORT $LN10@main
  299. $LN8@main:
  300. mov eax, DWORD PTR _i$3879[ebp]
  301. movsx ecx, BYTE PTR _buffer$[ebp+eax]
  302. cmp ecx, 47 ; 0000002fH
  303. jle SHORT $LN5@main
  304. mov eax, DWORD PTR _i$3879[ebp]
  305. movsx ecx, BYTE PTR _buffer$[ebp+eax]
  306. cmp ecx, 58 ; 0000003aH
  307. jl SHORT $LN6@main
  308. $LN5@main:
  309. mov eax, DWORD PTR _i$3879[ebp]
  310. movsx ecx, BYTE PTR _buffer$[ebp+eax]
  311. cmp ecx, 64 ; 00000040H
  312. jle SHORT $LN4@main
  313. mov eax, DWORD PTR _i$3879[ebp]
  314. movsx ecx, BYTE PTR _buffer$[ebp+eax]
  315. cmp ecx, 91 ; 0000005bH
  316. jl SHORT $LN6@main
  317. $LN4@main:
  318. mov eax, DWORD PTR _i$3879[ebp]
  319. movsx ecx, BYTE PTR _buffer$[ebp+eax]
  320. cmp ecx, 96 ; 00000060H
  321. jle SHORT $LN7@main
  322. mov eax, DWORD PTR _i$3879[ebp]
  323. movsx ecx, BYTE PTR _buffer$[ebp+eax]
  324. cmp ecx, 123 ; 0000007bH
  325. jge SHORT $LN7@main
  326. $LN6@main:
  327. mov DWORD PTR _pravilo$[ebp], 1
  328. jmp SHORT $LN3@main
  329. $LN7@main:
  330. mov DWORD PTR _pravilo$[ebp], 2
  331. $LN3@main:
  332. jmp $LN10@main
  333. $LN9@main:
  334. ; Line 29
  335. mov esi, esp
  336. mov eax, DWORD PTR _pravilo$[ebp]
  337. push eax
  338. push OFFSET ??_C@_0BB@IPHDNPAM@pravilo?5?$DN?5?$CFd?5?6?5?6?$AA@
  339. call DWORD PTR __imp__printf
  340. add esp, 8
  341. cmp esi, esp
  342. call __RTC_CheckEsp
  343. ; Line 30
  344. cmp DWORD PTR _pravilo$[ebp], 1
  345. jne SHORT $LN2@main
  346. lea eax, DWORD PTR _buffer$[ebp]
  347. push eax
  348. call ?pravilo1@@YAHPAD@Z ; pravilo1
  349. add esp, 4
  350. $LN2@main:
  351. ; Line 31
  352. cmp DWORD PTR _pravilo$[ebp], 2
  353. jne SHORT $LN1@main
  354. lea eax, DWORD PTR _buffer$[ebp]
  355. push eax
  356. call ?pravilo2@@YAHPBD@Z ; pravilo2
  357. add esp, 4
  358. $LN1@main:
  359. ; Line 32
  360. mov esi, esp
  361. lea eax, DWORD PTR _c$[ebp]
  362. push eax
  363. call DWORD PTR __imp__gets
  364. add esp, 4
  365. cmp esi, esp
  366. call __RTC_CheckEsp
  367. ; Line 33
  368. xor eax, eax
  369. push edx
  370. mov ecx, ebp
  371. push eax
  372. lea edx, DWORD PTR $LN20@main
  373. call @_RTC_CheckStackVars@8
  374. pop eax
  375. pop edx
  376. pop edi
  377. pop esi
  378. pop ebx
  379. mov ecx, DWORD PTR __$ArrayPad$[ebp]
  380. xor ecx, ebp
  381. call @__security_check_cookie@4
  382. add esp, 352 ; 00000160H
  383. cmp ebp, esp
  384. call __RTC_CheckEsp
  385. mov esp, ebp
  386. pop ebp
  387. ret 0
  388. npad 1
  389. $LN20@main:
  390. DD 2
  391. DD $LN19@main
  392. $LN19@main:
  393. DD -108 ; ffffff94H
  394. DD 100 ; 00000064H
  395. DD $LN17@main
  396. DD -117 ; ffffff8bH
  397. DD 1
  398. DD $LN18@main
  399. $LN18@main:
  400. DB 99 ; 00000063H
  401. DB 0
  402. $LN17@main:
  403. DB 98 ; 00000062H
  404. DB 117 ; 00000075H
  405. DB 102 ; 00000066H
  406. DB 102 ; 00000066H
  407. DB 101 ; 00000065H
  408. DB 114 ; 00000072H
  409. DB 0
  410. _main ENDP
  411. _TEXT ENDS
  412. END
Под сишный код visual studio выдаёт такой вот ассемблерный листинг. Оптимизация вроде отключена (я старался её отключить, но не уверен что она всё-таки отключилась). Подскажите, пожалуйста, что нужно редактировать в ассемблерном коде, чтобы он потом запускался? Может, использовать не visual studio?
P.S. Операционная система windows 7 x64

Решение задачи: «Получить ассемблерный листинг из кода на с++»

textual
Листинг программы
  1. org 100h
  2. jmp start
  3.  
  4. mess0   db  13,10,'Type string..: $'
  5. mess1   db  13,10,'Search signs.: $'
  6. mess2   db  13,10,'------------------------------------------'
  7.         db  13,10,'Result string: $'
  8. okey    db        'Found!',13
  9.         db  10,10,'Start Delete-duble proc..$'
  10. nSign   db        'No sign!',13
  11.         db  10,10,'Start Change-symbol proc..$'
  12.  
  13. buff    db  80
  14. len     db  0
  15. string  db  80 dup(0)
  16.  
  17. separ   db  '.,:;"/?[]{}`~!@#$%^&*()-+=\|',39
  18. sLen     =  $ - separ
  19.  
  20. start:
  21. ; Сохраняем строку юзверя ===================================//
  22.      mov   dx,mess0          ;
  23.      call  message           ;
  24.      mov   ah,0Ah            ; fn.(0Ah)
  25.      mov   dx,buff           ;
  26.      int   21h               ;
  27.  
  28. ; Ищем в ней знаки препинания ===============================//
  29.      mov   dx,mess1          ;
  30.      call  message           ;
  31.  
  32.      mov   si,separ          ; таблица символов для поиска
  33.      mov   dx,sLen           ; её длина
  34.      xor   cx,cx             ;
  35. find:                        ;
  36.      mov   di,string         ; адрес строки юзера
  37.      mov   cl,[len]          ; её длина
  38.      inc   cl                ;
  39.      lodsb                   ; AL = символ из таблицы
  40.      repne scasb             ; поиск указанного символа в DI
  41.      or    cx,cx             ; если поиск дал результаты,
  42.      jnz   ok                ;      ..то всё ОК!
  43.      dec   dx                ; иначе: уменьшаем длину таблицы
  44.      jnz   find              ; и на повтор, пока DX > 0
  45.  
  46. ; Выводим результат поиска на экран =========================//
  47.      mov   dx,nSign          ; здесь мы окажемся,
  48.      call  message           ;    ..если поиск не дал резутата
  49.      call  changeText        ; зовём функцию!
  50.      jmp   print             ;
  51. ok:                          ;
  52.      mov   dx,okey           ; поиск дал результат!
  53.      call  message           ;
  54.      call  deleteDuble       ;
  55.  
  56. ; Выводим на экран результат работы функций =================//
  57. print:
  58.      mov   dx,mess2          ; выводим изменённую строку юзера
  59.      call  message           ;
  60.      mov   si,string         ;
  61. @@:  lodsb                   ;
  62.      or    al,al             ;     ..пока не встретится нуль
  63.      jz    exit              ;
  64.      int   29h               ;           ..по-символьно.
  65.      loop  @b                ;
  66.  
  67. exit:
  68.      xor   ax,ax             ;
  69.      int   16h               ;
  70.      int   20h               ; выход!
  71.  
  72. ;eeeeeeeeeeeee{ П Р О Ц Е Д У Р Ы }eeeeeeeeeeeeeeeeeeeeeeeeeee
  73. message:                     ;
  74.      mov   ah,9              ;
  75.      int   21h               ;
  76. ret                          ;
  77. ;-------------------------------------------------------------
  78. deleteDuble:                 ; Удаляем повторные вхождения ===
  79.      mov   si,string         ; источник
  80.      mov   di,si             ; он-же приёмник
  81.      inc   si                ; первый элемент возьмёт DI
  82.      mov   cl,[len]          ; длина цикла
  83. @@:  lodsb                   ; AL = сл.элемент..
  84.      cmp   al,[di]           ;
  85.      jz    fuck              ; пропускаем если равны
  86.      inc   di                ;
  87.      xchg  al,[di]           ; иначе: ставим его предыдущим
  88. fuck:                        ;
  89.      loop  @b                ; на повтор..
  90.      xor   al,al             ; вставляем маркер конца строки
  91.      stosb                   ;
  92. ret                          ;
  93. ;-------------------------------------------------------------
  94. changeText:                  ; Меняем A->Z, B->Y, Z->A (гармошка)
  95.      mov   si,string         ;
  96.      mov   di,si             ;
  97.      mov   cl,[len]          ;
  98. @@:  lodsb                   ;
  99.      cmp   al,41h            ; фильтр заглавных
  100.      jb    mis               ;   ...
  101.      cmp   al,5Ah            ;     ...
  102.      ja    mis               ;        ...
  103.      shl   ax,8              ; отправляем символ в AH
  104.      sub   ah,41h            ; AH = его позиция от начала
  105.      mov   al,5Ah            ; AL = asc хвоста
  106.      sub   al,ah             ; вычисляем позицию от хвоста
  107. mis: stosb                   ; сохраняем изменения..
  108.      loop  @b                ;
  109.      xor   al,al             ; вставляем маркер конца строки.
  110.      stosb                   ;
  111. ret                          ;

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


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

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

9   голосов , оценка 4.333 из 5

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

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

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