Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. Krolik

    Krolik New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    6
    Тогда главный вопрос - как? Я далек от этого, поэтому и обратился к профессионалам.
     
  2. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    IDA Pro + HexRays и вперед
    на torrents.ru есть

    либо в WASM.COMMERCE
     
  3. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    это лабораторные работы такие? )
     
  4. Krolik

    Krolik New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    6
    Спасибо большое. Рассмотрю оба варианта. :)
     
  5. Krolik

    Krolik New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    6
    Нет, это было бы слишком. Просто цель этой декомпиляции направлена как раз на выполнение лабораторной работы.
     
  6. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    ну а суть то какая?
    скорее всего - рипнуть какой-то алгоритм.
    ну так что там за алгоритм то такой
    в основном проще аналогичное реализовать
    чем браться за восстановление кода
     
  7. Krolik

    Krolik New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    6
    Да, скорее всего проще с нуля написать программу. Но для начала попробую так.
     
  8. Krolik

    Krolik New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    6
    А работать с IDA Pro и HexRays тяжело? Реально сделать без знания ассемблера?
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Krolik
    для начала глянь это :)) А проще всего нагуглить готовый пример нужного алгоритма - в лабах не задают того, что никто не делал.
     
  10. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    Krolik
    если, что аська в ПМ
     
  11. AHAPXUCT

    AHAPXUCT New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    8
    Добрый всем День ! Задача такая : нужен примитивный текстовый редактор на ассемблере, то есть : стрелки, бэкспэйс, Ентер, Спэйс и сохронение
    В общем больше всего мне здоровья съела кнопка ентер - но с горем по полам - справился. Но возникла проблема с сохронением:
    Во первых оно дублтрует биты, хотя может это изза того что файл сохроняется как Бинарный (быть может ктото знает как его сделать простым текстовым)
    Но самое главное : в файл сохроняются ровно первые 46 символов ! в место 47го появляется знак Пики (от карт) а дальше крыша едет (у редактора) :)
    Ктото понимает в чем прикол ? почему дохнет на 47ом бите ? тыкал и в TD и в Emu8086, но глюка не понял
    вот код :
    Код (Text):
    1. ; редактор
    2.  
    3. .model small
    4.  
    5. .stack 100h
    6.  
    7. .data
    8.  
    9. InfoMess db 'Text editor.',0ah,0dh
    10.  
    11. db 'Any key - run programm',0ah,0dh,'$'
    12.  
    13. Xmax equ 80
    14.  
    15. Ymax equ 25
    16.  
    17. entr  db     0ah,0dh,'$'
    18.  
    19. tab             equ     09h
    20.  
    21. cOff db 10,13,'saving... !','$',10,13
    22.  
    23. FileName db 'asm_file.txt',0
    24.  
    25. beginMessage DB 10,13,'enter file name !$',10,13
    26.  
    27. Handle   DW ?
    28.  
    29.  
    30. .code
    31.  
    32.  
    33.  
    34.  
    35.  
    36.  
    37.  
    38.  
    39.  
    40.  
    41.  
    42.  
    43.  
    44. MoveCursor proc
    45.  
    46. cmp dl,0
    47.  
    48. jge mc_next1
    49.  
    50. mov dl,Xmax-1
    51.  
    52. dec dh
    53.  
    54. cmp dh,0
    55.  
    56. jge test_cur
    57.  
    58. xor dx,dx
    59.  
    60. jmp test_cur
    61.  
    62. mc_next1:
    63.  
    64. cmp dl,Xmax-1
    65.  
    66. jle mc_next2
    67.  
    68. xor dl,dl
    69.  
    70. inc dh
    71.  
    72. cmp dh,Ymax-1
    73.  
    74. jle mov_cur
    75.  
    76. mov dl,Xmax-1
    77.  
    78. mov dh,Ymax-1
    79.  
    80. jmp test_cur
    81.  
    82. mc_next2:
    83.  
    84. cmp dh,0
    85.  
    86. jge mc_next3
    87.  
    88. xor dh,dh
    89.  
    90. jmp test_cur
    91.  
    92. mc_next3:
    93.  
    94. cmp dh,Ymax-1
    95.  
    96. jle test_cur
    97.  
    98. mov dh,Ymax-1
    99.  
    100. test_cur:
    101.  
    102. call AddrSym
    103.  
    104. cmp si,bp
    105.  
    106. jg no_move
    107.  
    108. mov_cur:
    109.  
    110. xor bx,bx
    111.  
    112. mov ax,0200h
    113.  
    114. int 10h
    115.  
    116. ret
    117.  
    118. no_move:
    119.  
    120. mov dx,bx
    121.  
    122. ret
    123.  
    124. MoveCursor endp
    125.  
    126.  
    127.  
    128.  
    129. DelSym proc
    130.  
    131. call AddrSym
    132.  
    133. dec bp
    134.  
    135. mov cx,bp
    136.  
    137. sub cx,si
    138.  
    139. mov di,si
    140.  
    141. inc si
    142.  
    143. shl si,1
    144.  
    145. shl di,1
    146.  
    147. push ds
    148.  
    149. push es
    150.  
    151. pop ds
    152.  
    153. cld
    154.  
    155. rep movsw
    156.  
    157. pop ds
    158.  
    159. mov word ptr es:[di],0720h
    160.  
    161. ret
    162.  
    163. DelSym endp
    164.  
    165.  
    166.  
    167. InsSym proc
    168.  
    169. cmp bp, 80*25
    170.  
    171. jae exit_InsSym
    172.  
    173. call AddrSym
    174.  
    175. push cx
    176.  
    177. mov cx,bp
    178.  
    179. sub cx,si
    180.  
    181.  
    182.  
    183. jcxz no_sym
    184.  
    185. push si
    186.  
    187. mov di,bp
    188.  
    189. mov si,bp
    190.  
    191. dec si
    192.  
    193. shl si,1
    194.  
    195. shl di,1
    196.  
    197. push ds
    198.  
    199. push es
    200.  
    201. pop ds
    202.  
    203. std
    204.  
    205. rep movsw
    206.  
    207. pop ds
    208.  
    209. pop si
    210.  
    211. no_sym:
    212.  
    213. shl si,1
    214.  
    215. mov word ptr es:[si],ax
    216.  
    217. inc dl
    218.  
    219. inc bp
    220.  
    221. call MoveCursor
    222.  
    223. pop cx
    224.  
    225. exit_InsSym:
    226.  
    227. ret
    228.  
    229. InsSym endp
    230.  
    231.  
    232.  
    233.  
    234.  
    235.  
    236.  
    237.  
    238.  
    239.  
    240.  
    241.  
    242.  
    243. AddrSym proc
    244.  
    245. push cx
    246.  
    247. push ax
    248.  
    249. push bx
    250.  
    251.  
    252.  
    253. mov si,dx
    254.  
    255. xor ax,ax; =0
    256.  
    257. xor bx,bx; =0
    258.  
    259. and si,00ffh
    260.  
    261. mov bl,dh
    262.  
    263. mov al,dh
    264.  
    265. shl al,1
    266.  
    267. shl al,1
    268.  
    269. mov cx,4
    270.  
    271. add ax, bx ;
    272.  
    273. shl ax, cl
    274.  
    275.  
    276.  
    277. add si,ax
    278.  
    279.  
    280.  
    281. pop bx
    282.  
    283. pop ax
    284.  
    285. pop cx
    286.  
    287. ret
    288.  
    289. AddrSym endp
    290.  
    291.  
    292.  
    293. label1:
    294. push ax
    295. push bx
    296. push cx
    297. push dx
    298. push si
    299. push di
    300.  
    301.  
    302. xor ax,ax
    303.  
    304.  
    305.     mov ah,09h
    306.  
    307.     mov dx,offset cOff;beginMessage
    308.  
    309.     int 21h
    310.  
    311.    
    312.          
    313.  
    314.    ; mov ah,3fh
    315.  
    316.    ; mov bx,0
    317.  
    318.    ; lea dx,FileName
    319.  
    320.    ; int 21h
    321.  
    322.  
    323.  
    324.    
    325.  
    326.      
    327.  
    328.     mov ah,3Ch         ;Функция создания файла
    329.  
    330.     mov dx,offset FileName
    331.  
    332.     xor cx,cx         ;Атрибуты обычные
    333.  
    334.     int 21h          
    335.  
    336.    
    337.  
    338.     mov dx,offset FileName      ; put offset of filename in dx
    339.  
    340.     mov al,2            ; access mode -read and write
    341.  
    342.     mov ah,3Dh          ; function 3Dh - open the file
    343.  
    344.     int 21h    
    345.  
    346.  
    347.  
    348.        
    349.        push 0b800h  
    350.  
    351.        pop ds
    352.        mov handle,ax
    353.  
    354.      
    355.  
    356.        mov ah,40h
    357.        mov bx,handle    ;В BX - номер файла
    358.  
    359.         xor si,si
    360.         mov si,bp
    361.         add si,bp  
    362.                          
    363.        xor dx,dx      
    364.  
    365.        mov cx,si      
    366.  
    367.        int 21h        
    368.  
    369.  
    370.  
    371.                                            
    372.                        
    373.  
    374.        mov ah,3Eh
    375.  
    376.        mov bx,handle
    377.  
    378.        int 21h
    379.        
    380.        
    381.      
    382.        pop di
    383.        pop si
    384.        pop dx
    385.        pop cx
    386.        pop bx
    387.        pop ax
    388.        
    389.  
    390.  
    391. jmp getchar
    392.  
    393.  
    394.  
    395.  
    396.  
    397. .startup
    398.  
    399. mov dx,offset InfoMess
    400.  
    401. mov ax,0900h
    402.  
    403. int 21h
    404.  
    405. mov ax,0c07h
    406.  
    407. int 21h
    408.  
    409. run:
    410.  
    411. mov ax,0f00h
    412.  
    413. int 10h
    414.  
    415. mov ah,bh
    416.  
    417. push ax
    418.  
    419.  
    420.  
    421. mov ax,0003h
    422.  
    423. int 10h
    424.  
    425.  
    426.  
    427. ;--------->>>
    428.  
    429. mov ax,0b800h
    430.  
    431. mov es,ax
    432.  
    433. ;--------->>>
    434.  
    435. xor dx,dx
    436.  
    437. xor bp,bp
    438.  
    439.  
    440.  
    441. getchar:
    442.  
    443. mov ax,0700h
    444.  
    445. int 21h
    446.  
    447.  
    448.  
    449. cmp al,0dh;enter
    450.  
    451. jne save
    452.  
    453. jmp endl
    454.  
    455.  
    456.  
    457. save:
    458. cmp al,9h
    459. jne esc
    460. jmp label1
    461.  
    462.  
    463.  
    464.  
    465.  
    466. hz2:
    467.  
    468. call MoveCursor
    469.  
    470. call InsSym
    471.  
    472. dec ch
    473.  
    474. jmp hz1
    475.  
    476.  
    477.  
    478.  
    479.  
    480. esc:
    481.  
    482. cmp al,27;Esc
    483.  
    484. jne edit
    485.  
    486.  
    487.  
    488. jmp exit
    489.  
    490.  
    491.  
    492.  
    493.  
    494.  
    495.  
    496. endl:
    497.  
    498.  
    499.  
    500. mov ch,80
    501.  
    502. sub ch,dl
    503.  
    504. mov bx,dx
    505.  
    506. hz1:
    507.  
    508. cmp ch,0
    509.  
    510. jne hz2
    511.  
    512.  
    513.  
    514. jmp getchar
    515.  
    516.  
    517.  
    518.  
    519.  
    520. edit:
    521.  
    522. mov bx,dx
    523.  
    524. cmp al,8
    525.  
    526. jne edit0
    527.  
    528. test dx,dx
    529.  
    530. jz getchar
    531.  
    532.  
    533.  
    534. dec dl;сдвинуть курсор влево
    535.  
    536. call MoveCursor
    537.  
    538.  
    539.  
    540. call DelSym;удалить символ под курсором
    541.  
    542. jmp getchar
    543.  
    544. edit0:
    545.  
    546. cmp al,20h
    547.  
    548. jb edit1
    549.  
    550. cmp al,7dh
    551.  
    552. ja edit1
    553.  
    554. call InsSym
    555.  
    556. jmp getchar
    557.  
    558.  
    559.  
    560. edit1:
    561.  
    562. cmp al,0; расширенный ASCII
    563.  
    564. jne getchar
    565.  
    566.  
    567. mov ax,0700h
    568.  
    569. int 21h
    570.  
    571.  
    572.  
    573. ;mov bx,dx;запомнить старое положение курсора
    574.  
    575. ;cmp al,53;Del
    576.  
    577.  
    578.  
    579. cmp al,48h; стрелка вверх
    580.  
    581. jne kDown
    582.  
    583. dec dh
    584.  
    585. jmp lSetCursor
    586.  
    587. kDown:
    588.  
    589. cmp al,50h; стрелка вниз
    590.  
    591. jne kLeft
    592.  
    593. inc dh
    594.  
    595. jmp lSetCursor
    596.  
    597. kLeft:
    598.  
    599. cmp al,4bh; стрелка влево
    600.  
    601. jne kRigth
    602.  
    603. dec dl
    604.  
    605. jmp lSetCursor
    606.  
    607. kRigth:
    608.  
    609. cmp al,4dh; стрелка вправо
    610.  
    611. jne getchar
    612.  
    613. inc dl
    614.  
    615.  
    616.  
    617. lSetCursor:
    618.  
    619. call MoveCursor
    620.  
    621. jmp getchar ; вернутся к опросу клавиатуры
    622.  
    623. exit:
    624.  
    625. pop dx
    626.  
    627. mov ax,0000h
    628.  
    629. mov al,dl
    630.  
    631. int 10h
    632.  
    633. mov ax,0500h
    634.  
    635. mov al,dh
    636.  
    637. int 10h
    638.  
    639. exit1:
    640.  
    641. mov ax, 4c00h ; закончить программу
    642.  
    643. int 21h
    644.  
    645. end
    Заранее спасибо !
     
  12. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Не уверен, но по-моему функции прерывания 21h не всегда правильно работают если менять регистр bp.

    PS.
    Использование видеопамяти в качестве буфера для храненя текста - не очень удачная идея.
     
  13. AHAPXUCT

    AHAPXUCT New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    8
    Насчет видеобуфера частично согласен, но при его использовании удобнее с остальным работать. А насчет Бп не думаю так как я же его на протижении всей программы изменяю - и все как не странно работает :)
    Другие идеи ?
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    AHAPXUCT
    Ужас, а не код... хоть бы как-нибудь по-удачнее код оформили. Нечитабелен вообще.
    А надо не частично, а полностью. В видеобуфере под каждый символ отводится не один, а два байта (собственно символ и его цвет). Соответственно в файл попадёт куча-мала.
    Для начала это не бит, а символ. Или, как я упомянул выше, слово (два байта). Перед сохранением в файл Вы передаёте в ds адрес видеобуфера. Дальнейшие операции с памятью (включая mov handle,ax) будут по умолчанию проводиться относительно новой базы (т.е. как обычно через регистр ds). Следовательно значение хэндла файла посредством инструкции mov handle,ax попадёт прямо в видеопамять. Т.к. смещение переменной handle в сегменте данных будет равно 5Fh, хэндл попадёт как раз по адресам 5F/2 = 47-го и 48-го символов. Причём у 47-го символа будет изменён цвет, а 48-й получит скорее всего нуль в качестве ASCII-кода символа (знак пики).

    Ещё раз повторю, что код ужасный. Но не только в плане оформления. Например, неясно, какой скрытый смысл несут в себе переходы на новую строку после (!) конца выводимой строки (т.е. после символа $). Кроме того, после создания файла в ax попадает хэндл созданного файла, который успешно затирается следующими несколькими инструкциями и соответственно не закрывается. Ну и не вернуть ds на место (если даже забыть о полном отсутствии целесообразности его установки на видеопамять) - это вообще варварство.
     
  15. AHAPXUCT

    AHAPXUCT New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    8
    l_inc я понимаю что для твоего (по всему видимо) опытного глаза все это очень не красиво смотрится, но поверь для человека который занимается ассемблером около месяца он терпим.
    Насчет "$" и "скрытого смысла" все просто - cтавил все подряд чтоб работало

    Теперь по порядку : в ds я забросил видеопамять, так как при обычном сохронении в dх надо ставить offset строки которую пишешь.
    Как сделать иначе я не знаю !
    Убрал я полностью хэндлы и вернул ds - естесвенно "пики" НЕТ , но теперь после нажатия таба(это у меня сохронение) сразу появляется напечатанный текст но файл остаётся пустым
    Кстати че текст появляется ? я же не вызываю функцию печати, и уже чо не записывается ?
     
  16. AHAPXUCT

    AHAPXUCT New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    8
    то есть вот что получилось :
    label1:

    push ax

    push bx

    push cx

    push dx

    push si

    push di



    xor ax,ax



    mov ah,09h

    mov dx,offset cOff;beginMessage

    int 21h





    ; mov ah,3fh

    ; mov bx,0

    ; lea dx,FileName

    ; int 21h







    mov ah,3Ch ;Функция создания файла

    mov dx,offset FileName

    xor cx,cx ;Атрибуты обычные

    int 21h



    mov dx,offset FileName ; put offset of filename in dx

    mov al,2 ; access mode -read and write

    mov ah,3Dh ; function 3Dh - open the file

    int 21h



    push ds

    push 0b800h

    pop ds




    mov ah,40h

    xor si,si
    mov si,bp
    add si,bp

    xor dx,dx ;DS:lol: X должны указывать на буфер, где находятся данные

    mov cx,si

    int 21h







    mov ah,3Eh

    int 21h





    pop ds

    pop di

    pop si

    pop dx

    pop cx

    pop bx

    pop ax





    jmp getchar
     
  17. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    AHAPXUCT
    Мда нет... уверен, Вам разбираться со своим плохо оформленным кодом ещё труднее, чем мне.
    В самой установке ds на видеопамять ничего плохого нет. Плохо то, что Вы буфер видеопамяти прямо в файл пишете. А там, ещё раз повторяю: не обычная ASCII-строка, там один байт на код символа и один байт на цвет. Более удачным решением было бы "умно" (т.е. через байт) переписать из видеопамяти текст в отдельную память, например, выделив её 48h-й функцией, а потом уже сохранять в файл из этой отдельной памяти.
    Эм... а зачем? Теперь, разумеется, с файлами Вы работать не сможете, т.к. обращение к открытому файлу можно производить только по его хэндлу. Если хэндл в функцию не передаёте, то в файл, разумеется, ничего записываться не будет. Я говорил о том, что после открытия хэндла его нужно закрывать. Теперь Вы открываете два хэндла и ни один не закрываете. Т.е. стало ещё хуже, не говоря уже о том, что и в файл Вы теперь ничего не запишете. Короче говоря, открытие файла не нужно, т.к. Вы сразу после его создания получили хэндл. Дальше можно уже сразу писать в файл, не открывая его повторно.
    Что же до записи данных в переменную handle, то это, разумеется, нужно сделать, но до (!) того, как Вы подмените ds.
     
  18. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    2 AHAPXUCT, модераторы
    Предлагаю отдельную тему создать. И перенести туда все начиная с #1551. Редактор делается просто, за неделю можно закончить и вылизать :)

    1. Буффер в обычной памяти, однозначно. Никакой видеопамяти трогать не надо вообще.
    2. Стрелки и энтер - это САМОЕ простое. Энтер - добавить в массив 0dh 0ah и перейти на 1 строку вниз, в начало. Стрелки - переместить место ввода на 1 позицию вправо, влево.
    3. Самое сложное - это вставка в массив, и отображение на экране :) Как ни странно... Быстрее всего вставлять в память, а экран полностью перерисовывать.
    4. Естественно, вывод на экран делается не "весь набранный текст подряд", а "умещающийся на экране кусок от текущей позиции отображения". То есть, надо хранить а) строку, с которой начинается экран; б) строку и столбец, местонахождение курсора; в) большой массив, содержащий набранный текст; г) примерно такой же массив, для возможного отката изменений и копирования фрагментов при вставке. В видеопамять можно после этого писать и напрямую, хотя лучше - штатными функциями дос, из соображений совместимости. И вообще, надо сначала подумать, а потом писать :))) Все нарисовать на листе бумаги, без команд ассемблера, с русскими словами и стрелочками - а потом переводить
     
  19. AHAPXUCT

    AHAPXUCT New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    8
    FatMoon Насчет создания темы я не против, тем более что по началу я перерыл весь Нэт в поисках готового редактора и ничего не нашел. Думаю последующим поколениям пригодится :)
    Насчет кнопок согласен, но с ентером не так просто (по крайней мере для меня было) , ведь перекинуть курсор в начало нового ряда это и ежу понятно как сделать, а как переместить весь текст за ним ? вот в чем дело

    l_inc оброщяюсь уже к вам , вообщем понимаю что лучше сделать красиво и умно (сам за это когда работаю на С/С++), но хочется уже любой ценой избавится от Этого !
    Значит так : когда я ставил ах а хэндл после запихивания видеобуфера а ds , хэндл становился частью буфера и чтение на нем обрывалось, Но сейчас я запоминаю хэндл доработы с DSом и все работает гладко толькл вот в файл остается пустым !
    Ведь раз он записывался тогда и сейчас вроде как должен ....
     
  20. AHAPXUCT

    AHAPXUCT New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    8
    То есть вот :
    Код (Text):
    1. label1:
    2. push ax
    3. push bx
    4. push cx
    5. push dx
    6. push si
    7. push di
    8. push ds
    9.  
    10.  
    11.     xor ax,ax
    12.     mov ah,09h
    13.     mov dx,offset cOff;beginMessage
    14.     int 21h
    15.      
    16.  
    17.     mov ah,3Ch         ;Функция создания файла
    18.     mov dx,offset FileName
    19.     xor cx,cx         ;Атрибуты обычные
    20.     int 21h
    21.  
    22.     mov handle,ax          
    23.  
    24.    mov dx,offset FileName      ; put offset of filename in dx
    25.    mov al,2            ; access mode -read and write
    26.    mov ah,3Dh          ; function 3Dh - open the file
    27.    int 21h    
    28.    
    29.  
    30.   push,0b800h
    31.   pop ds
    32.  
    33.        
    34.   mov ah,40h
    35.   mov bx,handle    ;В BX - номер файла
    36.   xor si,si
    37.   mov si,bp
    38.   add si,bp  
    39.   xor dx,dx      
    40.   mov cx,si      
    41.   int 21h        
    42.  
    43.  
    44.  
    45.  mov ah,3Eh
    46.  mov bx,handle
    47.  int 21h
    48.        
    49.      
    50.        pop ds
    51.        pop di
    52.        pop si
    53.        pop dx
    54.        pop cx
    55.        pop bx
    56.        pop ax
    57.  
    58.   jmp getchar