Advertisement
Guest User

Untitled

a guest
May 5th, 2019
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;посчитать емкость стека
  2. .model small
  3. .code
  4. org 100h            ;смещение в COM на 256
  5.  
  6. start:
  7.    
  8.     lea ax,endgame  ;узнаем адрес конца
  9.     mov bx,sp      
  10.     sub bx,ax       ;разница адресов
  11.     sub bx,4        ;учет, что займем место в стеке его размером (x2)
  12.     push bx         ;запись в стек доступного размера байт
  13.     sub bx,12       ;12 каких то символов ??? каких?
  14.     ;UPD по словам Чернова стек использует дебагер сам код и еще какая-то хрень. забить и не обращать внимания
  15.     push bx         ;пуш в стек с учетом этих символов
  16.     mov cx,bx       ;записываем в cx кол-во свободных байт в стека
  17.  
  18.     mov ah,09       ;9 фкнкция 21 прерывания (вывод сообщения)
  19.     mov dx,offset string
  20.     int 21h
  21.     push ss:[-4]    ;пуш в стек параметра для функции print (значение размера доступого размера стека)
  22.     call print
  23.    
  24.     shr cx,1        ;подготовка к 2 байтовой записи (деление на 2, т.к. push/pop работает с 2 байтами)
  25.    
  26.     mov ax,8888h    ;что записывем (просто восьмерки)
  27. lp:
  28.     push ax         ;записываем в стек содержимое AX
  29.     loop lp
  30.  
  31.     mov ax,4c00h    ;завершение программы (по дебагеру можно посмотреть сколько занял стек)
  32.     int 21h
  33.  
  34. print proc
  35.     push ax
  36.     push bp
  37.     mov bp,sp                   ;сохраняем указаетль стека в BP
  38.    
  39.     mov ax,[bp+6]               ;получение параметра
  40.     push cx    
  41.     push bx
  42.     push dx
  43.    
  44.    
  45.     mov bx, offset HexTabl      ;указатель на таблицу
  46.     mov di, offset asHex        ;указатель на представление
  47.     mov cx,ax                   ;сохранение ax
  48.     and al,0Fh                  ;работа с первой тетрадой
  49.        
  50.     xlat                        ;записываем в al соответсвие строки по bx по индексу al
  51.     mov [di+3],al               ;запись в символа в hex
  52.    
  53.     mov al,cl                   ;восстановление al
  54.     and al,0F0h                 ;работа со старшей тетрадой
  55.     shr al,4                    ;смещение вправо
  56.     xlat                        ;записываем в al соответсвие в bx по индексу al
  57.     mov[di+2],al                ;запись в символа в hex
  58.    
  59. ;работа со старшим байтом (ax был сохранен в cx)
  60.     mov al,ch
  61.     and al,0Fh
  62.     xlat
  63.     mov [di+1],al
  64.    
  65.     mov al,ch
  66.     and al,0F0h
  67.     shr al,4
  68.     xlat
  69.     mov[di],al
  70.    
  71.    
  72.    
  73.     mov ah,09h             
  74.     mov dx, offset asHex
  75.     int 21h     ;вывод строки
  76.    
  77.     ;восстановление испозованных регистров
  78.     pop dx
  79.     pop bx
  80.     pop cx
  81.     pop bp
  82.     pop ax
  83.     ret 2                       ;сброс стека на 2 байта (были передан входным параметром)
  84. endp
  85. string db 'Available stack size is $'
  86.  
  87. HexTabl  db     '0123456789ABCDEF'  ;таблица для сравнения
  88. asHex    db     '0000h ', '$'       ;место для вывода hex числа
  89. label endgame word                  ;метка для конца кода
  90. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement