|
|
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток! Вот всё задание: Задан двоичный код, представляющий программу процес¬сора 8088/86. Составить программу дизассемблирования этого двоичного кода. Результат дизассемблирования должен содержать следующую информацию: - мнемонический код машинной команды (в формате отладчика типа АТ 86), - устанавливаемые машинной командой флаги, Исходный двоичный код должен быть введен в режиме ASCII (либо с помощью любого текстового редактора, либо с помощью блока ввода в составляемой программе) и сох¬ранен в виде текстового файла). Для дальнейшего дизас семблирования исходного кода он должен быть преобразован в битовый код, сохраняемый либо в ОЗУ либо в виде файла. Ограничения: В исходный двоичный код должны быть включены только арифметические команды. Я накодил, невероятно коряво, но хотя бы работало. Показал преподавателю(лучше бы не показывал). Теперь она хочет, чтобы все кодировки регистров, адресации памяти и опкоды считывались из файла, можно ли из файла считать в мапу и ключи и значения? Но это ещё пол беды, ещё она хочет, чтобы, в зависимости от опкода, вызывался метод его обрабатывающий. Было бы замечательно создать какой-нибудь Map<опкод,"что-то, что будет вызывать метод">, но ума не приложу, как это сделать и можно ли сделать вообще. Заранее огромное спасибо за любую помощь. Вот сам код(не весь). Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2016, 00:38 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
1) Правильно все она говорит. Справочники обычно кладут в файлы. Сегмент кода надо экономить. 2) Твой сорс - это идеальный строительный материал для рефакторинга. Тут даже не разбираясь в предметной области можно уже начать делать эквивалентные преобразования и улучшения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2016, 09:18 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
mycodeurnghtmr, Если тебе помогут, ты обещаешь улучшить свой код?) Держи) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2016, 09:58 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
Добавил функцию matchTo(). Возможно она позволит свернуть повторяющиеся проверки в if Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2016, 10:23 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
Как-то так Код: java 1. 2. 3. 4. 5. или можно перевернуть по правилу Де-Моргана для читаемости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2016, 14:47 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
mayton, код жесть. у меня глаза чуть не лопнули. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2016, 14:54 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
maytonКак-то так Код: java 1. 2. 3. 4. 5. или можно перевернуть по правилу Де-Моргана для читаемости. но если честно, тоже не оч, тогда уж лучше в числа перегнать и сравнивать, чем писать такое: Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2016, 14:57 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
maytonДобавил функцию matchTo(). А через intern не проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2016, 17:13 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевmaytonДобавил функцию matchTo(). А через intern не проще? Поясни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2016, 17:28 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
golovonometrно если честно, тоже не оч, тогда уж лучше в числа перегнать и сравнивать, чем писать такое: Я не против. Но автор выбрал в качестве базиса для своего алгоритма строки. И если переходить к целым числам то надо кое-чего переписать на битовые операции. Если честно мне лень. А для дизассемблирования (если я правильно понял) тут вопрос перформанса или компактности вообще не стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2016, 17:32 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
mayton, Так препод ещё хочет, чтобы все преобразования выполнялись над битовым кодом. Я бы не проч не использовать тонны if, но пока не знаю, как можно адекватно сделать. Вот самый оптимальный вариант, это сделать через ассоциативные массивы(если это возможно), но вместо значения что-то, что вызовет метод для определенного опкода. Даже и близко не представляю, как это сделать и возможно ли. На яве последний раз кодил года полтора назад, всё остальное время работали только с ассемблерами под разные платформы, а тут вдруг раз... Всем огромное спасибо за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2016, 19:29 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
авторВот самый оптимальный вариант, это сделать через ассоциативные массивы(если это возможно), но вместо значения что-то, что вызовет метод для определенного опкода. сделай массив код/имя метода по имени метода через рефлексию вызвать метод ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2016, 19:35 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
1. Загоните ваш ascii в байты и работайте с байтами. Так проще и логичней. 2. Используйте оо-подход. Сделайте интерфейс ICategoryDetector{ int tryDisasembleIfMy(buf[], int i); } и к нему кучу реализаций. Каждая реализация смотрит в нужные биты, и если видит, что команда по buf[i] ее, то она дизасемблирует и печатает ее, и возвращает индекс следующей команды. А если нее ее, то возвращает -1. и дальше циклически вызывать. А еще можно дальше пойти, завести аннотациию MatchMask("***110***1*") и ставить ее над методом. А уже метод смотрит в остальные биты и в буфер и решает какие там регистры участвуют и какие параметры. Этот метод вызывается, если байты по текущему индексу удовлетворяют маске. Но это более сложный способ(и все равно не самый лучший), вы скорей всего не сможете сделать его движок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2016, 00:44 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
вадя, Ссылки на методы есть. Нафига рефлекшн? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2016, 18:28 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
DoSOfRedRiver, А можно подробней про ссылки и как их использовать? :3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2016, 18:36 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
DoSOfRedRiverвадя, Ссылки на методы есть. Нафига рефлекшн? запуск метода по ссылке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2016, 18:36 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
mycodeurnghtmr, Даже не ссылки, а что-то такое http://stackoverflow.com/questions/4480334/how-to-call-a-method-stored-in-a-hashmap-java ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2016, 21:54 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
DoSOfRedRivermycodeurnghtmr, Даже не ссылки, а что-то такое http://stackoverflow.com/questions/4480334/how-to-call-a-method-stored-in-a-hashmap-java интересно, а как с параметрами запускать? рефлекция только более универсальна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2016, 22:43 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
вадяDoSOfRedRivermycodeurnghtmr, Даже не ссылки, а что-то такое http://stackoverflow.com/questions/4480334/how-to-call-a-method-stored-in-a-hashmap-java интересно, а как с параметрами запускать? так в runCommand(); передавай параметры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2016, 23:19 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
Всё, что смог из себя выдавить. :3 Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2016, 22:49 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
Ты в одном месте ссылки на функции толкаешь что как-бе выдает опытного кодера "восьмерки" а в другом - как глупый индус элементарный рефакторинг не сделал. Просто замени System.out.println на println и суб-стриговые операции черезе introduce temporary variable например S1.substring(14, 17) => S1_14_17 и твой код визуально просто схлопнется. Функции Integer.toHex через статик импорт тоже. Ну нельзяж так ну йомайо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2016, 23:16 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
mayton, я, кстати, даже не знал про это. так что огромное спасибо. :3 всем спасибо. замечательный форум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 00:15 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
Пошел я значит опять к преподше... В общем, теперь хочется ей, чтобы все операции дизассемблирования проводились строго над битами и никак иначе, ни байтов, ни строк в ASCII кодах. Можно ли как-то переделать? Или придётся всё заново писать? Ещё раз спасибо всем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 18:38 |
|
||
|
Дизассемблер арифметических команд под x86
|
|||
|---|---|---|---|
|
#18+
mycodeurnghtmr, На самом деле это даже еще проще. Определяешь маски, ну например Код: java 1. и далее Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 12:20 |
|
||
|
|

start [/forum/topic.php?fid=59&gotonew=1&tid=2124191]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
141ms |
get topic data: |
9ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 465ms |

| 0 / 0 |
