Из COM в EXE - Assembler

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

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

Пытался переделать, но при компиляции выводит предупреждение No Stack, EXЕ то запускается, но программа не работает, подскажите что исправить.Компилирую в TASM Вот код COM:
Листинг программы
  1. .model tiny
  2. .code
  3. ORG 100h
  4. .386
  5. start:
  6. MOV DX,offset mess0
  7. CALL MESSAGE
  8. ;------------------- юзер вводит имя файла,
  9. ;------------------- а мы его сохраняем --------------------------//
  10. MOV DI,offset fName ; DI для STOSB...
  11. fileName: ;
  12. MOV AH,1 ;
  13. INT 21h ; читаем символ
  14. CMP AL,13 ; выход по ENTER
  15. JE next ;
  16. STOSB ; пишем символы в "ФайлНэйм"
  17. JMP fileName ;
  18. next: ;
  19. MOV AX,3D02h ; открыть файл! -----------------------//
  20. MOV DX,offset fName ;
  21. INT 21h ;
  22. JC error ; ошибка?
  23. XCHG AX,BX ; дескриптор файла в ВХ
  24. MOV AH,3Fh ; читать файл! ------------------------//
  25. MOV DX,offset buff ; куда,
  26. MOV CX,0FFFFh ; и сколько
  27. INT 21h ;
  28. JC error ;
  29. MOV [fSize],AX ; размер файла в переменной
  30. MOV AH,3Eh ; fucking file! -----------------------//
  31. INT 21h ;
  32. JC error ;
  33. MOV DX,offset mess1 ; покажем ОК! -------------------------//
  34. CALL MESSAGE ;
  35. MOV AX,[fSize] ; ..с размером файла
  36. MOV BX,10 ; в 10-тичной системе
  37. CALL HEX2ASC ;
  38. MOV DX,offset mess2 ; запрос на ввод ключа шифрования -----//
  39. CALL MESSAGE ;
  40. CALL ASC2HEX ;
  41. MOV [key],CL ; ключ в переменной
  42. MOV CX,[fSize] ; ..байтов для шифрования
  43. MOV SI,offset buff ; источник
  44. MOV BL,[key] ; ключ шифрования
  45. crypt: ;
  46. MOV AL,BYTE[SI] ; берём байт
  47. XOR AL,BL ; "ксорим" его ключом<------------------------------------------------XOR\SUB
  48. MOV BYTE[SI],AL ; и записываем обратно на место
  49. INC SI ; следующий байт..
  50. LOOP crypt ;
  51. MOV DX,offset mess3 ; мессага ОК!
  52. CALL MESSAGE ;
  53. CALL @@01 ; создаём новый файл ------------------//
  54. DB 'DATFILE.TXT',0 ;
  55. @@01: ;
  56. MOV AH,3Ch ;
  57. POP DX ; имя файла в DX
  58. MOV CX,20h ; атрибут - архивный
  59. INT 21h ;
  60. JC error
  61. XCHG BX,AX ; дескриптор файла в BX
  62. MOV AH,40h ; запись в файл -----------------------//
  63. MOV DX,offset buff ;
  64. MOV CX,[fSize] ; кол-во выводимым символов
  65. INT 21h ;
  66. JC error ;
  67. MOV AH,3Eh ; fucking file! -----------------------//
  68. INT 21h
  69. MOV DX,offset mess4 ; мессага "Создали Файл!"
  70. CALL MESSAGE ;
  71. JMP exit ;
  72. error: ; обработка ошибки --------------------//
  73. CALL @@@
  74. DB 13,10,7,'<--ERROR FILE OPERATION!$'
  75. @@@: ;
  76. POP DX ;
  77. CALL MESSAGE ;
  78. exit:
  79. XOR AX,AX ; выход!
  80. INT 16h ;
  81. INT 20h ;
  82. ;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
  83. MESSAGE:
  84. MOV AH,9
  85. INT 21h
  86. RET
  87. ;//======= ФУНКЦИЯ ВЫВОДИТ НА ЭКРАН В РАЗЛИЧНЫХ СС ================|
  88. HEX2ASC:
  89. PUSHA ; перевод из HEX в ASCII и вывод на экран
  90. XOR CX,CX ; вход: BX = система счисления, AX = число
  91. isDiv: ; выход: на экране
  92. XOR DX,DX ;
  93. DIV BX ;
  94. PUSH DX ;
  95. INC CX ;
  96. OR AX,AX ;
  97. JNZ isDiv ;
  98. isOut: ;
  99. POP AX ;
  100. CMP AL,9 ;
  101. JLE noHex ;
  102. ADD AL,7 ; коррекция для HEX..
  103. noHex: ;
  104. ADD AL,30h ;
  105. INT 29h ; выводим символ на экран
  106. LOOP isOut ;
  107. POPA ;
  108. RET
  109. ;//========= ПРОЦЕДУРА СОХРАНЕНИЯ ВВОДА В HEX-ФОРМАТЕ =============|
  110. ASC2HEX:
  111. XOR CX,CX ; выход: CX = число
  112. @0: ;
  113. MOV AH,1 ; ввод с эхом
  114. INT 21h ;
  115. CMP AL,13 ; выход по ENTER
  116. JE stop ;
  117. SUB AL,30h ;
  118. CMP AL,9 ;
  119. JBE @2 ;
  120. SUB AL,11h ; значит HEX-буква. Отнимаем от неё фактор
  121. CMP AL,5 ; если заглавная буква, то остаток будет
  122. JBE @1 ; в пределах(5). Ниже/равно - коррекция!
  123. SUB AL,20h ; значит прописная буква. Коррекция..
  124. @1: ;
  125. ADD AL,10 ; коррекция букв "A..F", в "11..15"
  126. @2: ;
  127. SHL CX,4 ; сдвигаем мл.тетраду(CL), в старшую
  128. OR CL,AL ; в мл.тетраду(CL) запишем наше числ
  129. JMP @0 ;
  130. stop: ; результат в CX.
  131. RET
  132. mess0 DB 13,10,' READ FILE NAME......: $'
  133. mess1 DB 13,10,'<--OK! file size......: $'
  134. mess2 DB 13,10,10,' CRYPT MASK (byte)...: $'
  135. mess3 DB 13,10,'<--OPERATION COMPLETED!$'
  136. mess4 DB 13,10,'-----------------------------'
  137. DB 13,10,' CREATE "DATFILE.TXT" - OK!$'
  138. buff DB 1024 DUP(0) ; буфер для файла
  139. fName DB 16 DUP(0) ; имя файла формате 8.3)
  140. fSize DW 0
  141. key DB 0
  142. end start
Вот EXE, который я пытался сделать:
Листинг программы
  1. .model tiny
  2. ORG 100h
  3. .386
  4. .data
  5. mess0 DB 13,10,' READ FILE NAME......: $'
  6. mess1 DB 13,10,'<--OK! file size......: $'
  7. mess2 DB 13,10,10,' CRYPT MASK (byte)...: $'
  8. mess3 DB 13,10,'<--OPERATION COMPLETED!$'
  9. mess4 DB 13,10,'-----------------------------'
  10. DB 13,10,' CREATE "DATFILE.TXT" - OK!$'
  11. buff DB 1024 DUP(0) ; буфер для файла
  12. fName DB 16 DUP(0) ; имя файла формате 8.3)
  13. fSize DW 0
  14. key DB 0
  15. .code
  16. start:
  17. MOV AX,@DATA
  18. MOV DS,AX
  19. MOV DX,offset mess0
  20. CALL MESSAGE
  21. ;------------------- юзер вводит имя файла,
  22. ;------------------- а мы его сохраняем --------------------------//
  23. MOV DI,offset fName ; DI для STOSB...
  24. fileName: ;
  25. MOV AH,1 ;
  26. INT 21h ; читаем символ
  27. CMP AL,13 ; выход по ENTER
  28. JE next ;
  29. STOSB ; пишем символы в "ФайлНэйм"
  30. JMP fileName ;
  31. next: ;
  32. MOV AX,3D02h ; открыть файл! -----------------------//
  33. MOV DX,offset fName ;
  34. INT 21h ;
  35. JC error ; ошибка?
  36. XCHG AX,BX ; дескриптор файла в ВХ
  37. MOV AH,3Fh ; читать файл! ------------------------//
  38. MOV DX,offset buff ; куда,
  39. MOV CX,0FFFFh ; и сколько
  40. INT 21h ;
  41. JC error ;
  42. MOV [fSize],AX ; размер файла в переменной
  43. MOV AH,3Eh ; fucking file! -----------------------//
  44. INT 21h ;
  45. JC error ;
  46. MOV DX,offset mess1 ; покажем ОК! -------------------------//
  47. CALL MESSAGE ;
  48. MOV AX,[fSize] ; ..с размером файла
  49. MOV BX,10 ; в 10-тичной системе
  50. CALL HEX2ASC ;
  51. MOV DX,offset mess2 ; запрос на ввод ключа шифрования -----//
  52. CALL MESSAGE ;
  53. CALL ASC2HEX ;
  54. MOV [key],CL ; ключ в переменной
  55. MOV CX,[fSize] ; ..байтов для шифрования
  56. MOV SI,offset buff ; источник
  57. MOV BL,[key] ; ключ шифрования
  58. crypt: ;
  59. MOV AL,BYTE[SI] ; берём байт
  60. XOR AL,BL ; "ксорим" его ключом<------------------------------------------------XOR\SUB
  61. MOV BYTE[SI],AL ; и записываем обратно на место
  62. INC SI ; следующий байт..
  63. LOOP crypt ;
  64. MOV DX,offset mess3 ; мессага ОК!
  65. CALL MESSAGE ;
  66. CALL @@01 ; создаём новый файл ------------------//
  67. DB 'DATFILE.TXT',0 ;
  68. @@01: ;
  69. MOV AH,3Ch ;
  70. POP DX ; имя файла в DX
  71. MOV CX,20h ; атрибут - архивный
  72. INT 21h ;
  73. JC error
  74. XCHG BX,AX ; дескриптор файла в BX
  75. MOV AH,40h ; запись в файл -----------------------//
  76. MOV DX,offset buff ;
  77. MOV CX,[fSize] ; кол-во выводимым символов
  78. INT 21h ;
  79. JC error ;
  80. MOV AH,3Eh ; fucking file! -----------------------//
  81. INT 21h
  82. MOV DX,offset mess4 ; мессага "Создали Файл!"
  83. CALL MESSAGE ;
  84. JMP exit ;
  85. error: ; обработка ошибки --------------------//
  86. CALL @@@
  87. DB 13,10,7,'<--ERROR FILE OPERATION!$'
  88. @@@: ;
  89. POP DX ;
  90. CALL MESSAGE ;
  91. exit:
  92. XOR AX,AX ; выход!
  93. INT 16h ;
  94. INT 20h ;
  95. ;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
  96. MESSAGE:
  97. MOV AH,9
  98. INT 21h
  99. RET
  100. ;//======= ФУНКЦИЯ ВЫВОДИТ НА ЭКРАН В РАЗЛИЧНЫХ СС ================|
  101. HEX2ASC:
  102. PUSHA ; перевод из HEX в ASCII и вывод на экран
  103. XOR CX,CX ; вход: BX = система счисления, AX = число
  104. isDiv: ; выход: на экране
  105. XOR DX,DX ;
  106. DIV BX ;
  107. PUSH DX ;
  108. INC CX ;
  109. OR AX,AX ;
  110. JNZ isDiv ;
  111. isOut: ;
  112. POP AX ;
  113. CMP AL,9 ;
  114. JLE noHex ;
  115. ADD AL,7 ; коррекция для HEX..
  116. noHex: ;
  117. ADD AL,30h ;
  118. INT 29h ; выводим символ на экран
  119. LOOP isOut ;
  120. POPA ;
  121. RET
  122. ;//========= ПРОЦЕДУРА СОХРАНЕНИЯ ВВОДА В HEX-ФОРМАТЕ =============|
  123. ASC2HEX:
  124. XOR CX,CX ; выход: CX = число
  125. @0: ;
  126. MOV AH,1 ; ввод с эхом
  127. INT 21h ;
  128. CMP AL,13 ; выход по ENTER
  129. JE stop ;
  130. SUB AL,30h ;
  131. CMP AL,9 ;
  132. JBE @2 ;
  133. SUB AL,11h ; значит HEX-буква. Отнимаем от неё фактор
  134. CMP AL,5 ; если заглавная буква, то остаток будет
  135. JBE @1 ; в пределах(5). Ниже/равно - коррекция!
  136. SUB AL,20h ; значит прописная буква. Коррекция..
  137. @1: ;
  138. ADD AL,10 ; коррекция букв "A..F", в "11..15"
  139. @2: ;
  140. SHL CX,4 ; сдвигаем мл.тетраду(CL), в старшую
  141. OR CL,AL ; в мл.тетраду(CL) запишем наше числ
  142. JMP @0 ;
  143. stop: ; результат в CX.
  144. RET
  145. end start

Решение задачи: «Из COM в EXE»

textual
Листинг программы
  1. exit:
  2.   XOR   AX,AX             ; выход!
  3.   INT   16h
  4.   MOV AH,4Ch               ;
  5.   INT   21h

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

  1. XOR AX,AX — Код вычисляет логическое ИЛИ между регистрами AX и AX и сохраняет результат в обоих регистрах. Результат этого выражения всегда будет равен 0, потому что мы сравниваем одинаковые значения.
  2. INT 16h — Это команда прерывания, которая передает управление компьютеру для обработки функции, связанной с номером прерывания 16h. В IBM PC и совместимых системах номер прерывания 16h обычно используется для обращения к BIOS, чтобы выполнить действия, такие как загрузка операционной системы или выполнение операций ввода/вывода.
  3. MOV AH,4Ch — Эта команда перемещает значение 4Ch (что эквивалентно десятичному числу 72) в регистр AH. Регистр AH обычно используется в кодах прерываний для передачи информации в BIOS.
  4. INT 21h — Это еще одна команда прерывания, которая передает управление компьютеру для обработки функции, связанной с номером прерывания 21h. В IBM PC и совместимых системах номер прерывания 21h обычно используется для обращения к BIOS, чтобы выполнить действия, такие как загрузка операционной системы или выполнение операций ввода/вывода. Код, представленный здесь, является простым примером и не выполняет какую-либо конкретную задачу. Он состоит из четырех команд:
    • XOR AX,AX — выход из программы
    • INT 16h — передача управления BIOS
    • MOV AH,4Ch — передача значения 72 в регистр AH
    • INT 21h — передача управления BIOS

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


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

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

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

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

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

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