Организация и функционирование ЭВМ\Лекции по организации и функционированию IBM PC - 2004\Дополнительные сведения по разработке программ на ассемблере IBM PC\
Дополнительные сведения по разработке программ на ассемблере IBM PC

Дополнительные сведения по разработке программ на ассемблере IBM PC

Простейшие функции работы с дисплеем

 Очистка экрана    MOV CH,0      ; номер верхней строки окна                  
   или фрагмента   MOV CL,0      ; номер левого столбца окна                  
   экрана(окна)    MOV DH,24     ; номер нижней  строки окна                  
                   MOV DL,79     ; номер правого столбца окна                 
                   MOV AH,6      ; код функции - переместить окно вверх       
                   MOV AL,0      ; количество строк , 0 - очистить окно       
                   MOV BH,7      ; атрибут заполнителя                        
                   INT 1Oh                                                    
                                                                              
 Перемещение       MOV DH,1      ; строка                                     
   курсора         MOV DL,0      ; столбец                                    
                   MOV BH,0      ; номер страницы памяти                      
                   MOV AH,2      ; код функции - установить позицию курсора   
                   INT 1Oh                                                    
 Вывод строки   st db  'строка ...',13,10,'$'                                 
   с $ в конце     .                                                     
   на экран        LEA DX,ST     ; загрузить адрес выодимой строки с $ в конце
                   MOV AH,9      ; код функции - вывод символьной строки до $ 
                   INT 21h                                                                            

Простейшие функции работы с файлами : открыть,закрыть

 Открыть  NAME DB  'FILE.DOC',0                                               
               .                                                              
               LEA DX,NAME                                                    
               MOV AL,0          ; AL - код доступа                           
                                 ; 0  - чтение                              
                                 ; 1  - запись                                
                                 ; 2  - чтение и запись                       
               MOV AH,3Dh        ; код функции - открыть                      
                                 ; в AX принимаем системный номер открытого   
                                 ; файла                                      
               INT 21h                                                        
               mov snom,ax       ; сохранить системный номер  файла         
                                                                              
 Закрыть       MOV BX,SNOM       ; восстановить в BX системный номер  файла   
               MOV AH,3Eh        ; код функции - закрыть                     
               INT 21h         

Простейшие функции работы с файлами : читать, писать

 Читать    ST DB  100 DUP(?)                                                  
              .                                                               
              MOV BX,0    ; системный номер файла ( 0 - клавиатура )        
              MOV CX,80   ; количество вводимых байтов                        
              LEA DX,ST   ; адрес строки для ввода                            
              MOV AH,3Fh  ; код функции - читать                              
              INT 21h     ; в AX число введенных символов с учетом CR,LF      
                                                                              
 Писать    ST DB  ' текст вывода '                                            
              .                                                               
              MOV BX,1    ; системный номер файла ( 1 - экран )               
              MOV CX,30   ; количество байт в выводимой записи                
              LEA DX,ST   ; адрес выводимой строки                            
              MOV AH 40h  ; код функции - писать                              
              INT 21h                          

Примеры простейшего использования макрокоманд : PRINT

            PRINT  MACRO I1,I2                                                
                   PUSH  AX                                                   
                   PUSH  BX                                                   
                   PUSH  CX                                                   
                   PUSH  DX                                                   
                   MOV   AH,40h    ;  вывод                                   
                   MOV   BX,1      ;  на экран                                
                   MOV   CX,I2     ;  I2 - количество символов                
                   LEA   DX,I1     ;  I1 - адрес начала строки                
                   INT   21h                                                 
                   POP   DX                                                   
                   POP   CX        ;  вызов                                   
                   POP   BX        :             PRINT  STR,15                
                   POP   AX                                                   
                   ENDM                                                       

Примеры простейшего использования макрокоманд : INPUT,GOTOXY

        INPUT  MACRO  I1,I2                                                   
               PUSH   CX                                                      
               MOV    AH,3Fh  ; ввод                                          
               MOV    BX,0    ; с клавиатуры                                  
               MOV    CX,I2   ; I2 - количество символов                      
               LEA    DX,I1   ; I1 - имя(адрес строки буфера ввода            
               INT    21h     ;                                               
               POP    CX      ; вызов                                         
               ENDM                                         INPUT STR,10      
                                                                             
        GOTOXY MACRO  I1,I2                                                   
               MOV    AH,2    ; позиционирование курсора                      
               MOV    BH,0    ;                                               
               MOV    DL,I2   ; I2 - номер столбца                            
               MOV    DH,I1   ; I1 - номер строки                             
               INT    10h     ;                                               
               ENDM             вызов                       GOTOXY  10,30     

Примеры простейшего использования макрокоманд : CLRSCR

       CLRSCR  MACRO I1,I2,I3,I4    ; очистка экрана в указанных позициях     
               MOV   CH,I1          ; номер верхней строки окна               
               MOV   CL,I2          ;       левого  столбца                   
               MOV   DH,I3          ;       нижней  строки                    
               MOV   DL,I4          ;       правого столбца                   
               MOV   AH,6           ; функция - скроллинг строк               
               MOV   AL,0           ; количество строк скроллинга (0-очистка) 
               MOV   BH,7           ; атрибут заполнителя                     
               INT   10h            ;                                         
               ENDM                 ; вызов                CLRSCR 0,0,24,79                  

Пример структуры ASM-программы

    ; назначение , макроопределения                                            
   STACK SEGMENT PARA STACK 'STACK'                    СЕГМЕНТ СТЕКА          
         DB      64 DUP(?)                                                    
   STACK ENDS                                                                 
                                                                              
   DSEG  SEGMENT PARA PUBLIC 'DATA'                    СЕГМЕНТ ДАННЫХ         
   D1    DW      5                                                            
   ZAG   DB      'заголовок'                                                  
         .                                                                    
         данные                                                               
         .                                                                    
   DSEG  ENDS                                                                 
                                                                              
   CSEG  SEGMENT                                       СЕГМЕНТ КОДА           
         ASSUME  CS:CSEG,DS:DSEG,SS:STACK                                     
   ENTR  PROC    FAR                                                          
         PUSH    DS            ;  сохранение значения DS                      
         MOV     AX,0          ;        для возврата в систему                
         PUSH    AX            ;                                             
         MOV     AX,DSEG       ;  сделать DS указателем                       
         MOV     DS,AX         ;        на сегмент данных DSEG                
         MOV     AX,STACK      ;  сделать SS указателем                       
         MOV     SS,AX         ;        на сегмент стека  STACK               
         .                                                                    
         ТЕЛО ГЛАВНОЙ ПРОГРАММЫ                                               
         .                                                                    
         RET                                                                  
   ENTR  ENDP                                                                                                                                              
   OBR   PROC                                                                 
         .                                                                    
         ТЕЛО ПОДПРОГРАММЫ  OBR                                               
         .                                                                    
         RET                                                                  
   OBR   ENDP                                                                 
   MES   PROC                                                                 
         .                                                                    
         ТЕЛО ПОДПРОГРАММЫ  MES                                               
         .                                                                    
         RET                                                                  
   MES   ENDP                                                                 
   CSEG  ENDS                                                                 
         END  ENTR                                                                                          

Короткий формат ассемблерных программ

  
   .286           ; если использовать команды   процессора 80286              
   .287           ;                           сопроцессора 80287              
   .model small                                                               
   .stack 100h                                                                
   .data                                                                      
           Данные                                                             
   .code                                                                      
   start:                                                                     
           mov     ax, @Data                                                  
           mov     ds, ax                                                     
                                                                              
           Код программы ( и call pr1 )                                       
                                                                              
           mov     ax,4C00h                                                   
           int     21h                                                        
   pr1     proc                                                               
           код подпрограммы                                                   
           endp                                                               
   end start                                                                  

Как писать программу на ассемблере

Для того, чтобы написать программу на ассемблере необходимо:

  1. В начале программы написать следующие строки:
    
    .286           		
    .287
    .model small
    .stack 100h
    .data
    
  2. После них описать входной и выходной файлы, указанные в вашей задаче. Например:
    
    InFile	DB	"input.txt", 0
    OutFile	DB	"output.txt", 0
    
    затем описать исходную строку, указанную в вашей задаче, и результирующую строку, также указанную в задаче. Например:
    
    IN_STR  DB      100 DUP (?)
    OUT_STR DB      100 DUP (?)
    	DB   	 0ah, 0dh
    
  3. Затем вставить строки:
    
    .code
    
    start:
      	MOV     AX, @Data
      	MOV     DS, AX
    
  4. Далее нам необходимо открыть фаил (InFile) для чтения, прочитать и закрыть. Для этого пишем следующее:
    
    ;	Открываем для чтения
    	lea	DX, InFile
    	mov	ah, 3dH
    	mov	al, 0
    	int	21h
    	push	ax
    
    ;	Читаем
    	mov	bx, ax
    	mov	ah, 3fH
    	mov	cx, 100 ; сколько байт читать
    	lea	DX, IN_STR     ; куда читать
    	int	21h
    
    ;	Закрываем
    	mov	ah, 3eH
    	pop	bx
    	int	21h
    
  5. После этого надо написать решение своей задачи.
  6. После решения надо открыть фаил (OutFile) для записи, записать, закрыть и выйти из программы. Для этого надо написать:
    
     ;	Отрываем для записи
    	lea	DX, IN_STR 
            mov	bx, DX
    	lea	DX, OutFile
    	mov	ah, 3cH
    	mov	cx, 0
    	int	21h
    	push	ax
    
    ;	Пишем
    	mov	DX, bx
    	dec	DX
    	mov	bx, ax
    	mov	ah, 40H
    	mov	cx, dx ; сколько байт писать
    	lea	DX, OUT_STR  ; откуда писать
    	int	21h
    
    ;	Закрываем
    	mov	ah,4ch
    	mov	al,0
    	int	21h
    
    	MOV     AX, 4C00h
            INT     21h
    	
    end start
    

Задача по переводу из строковой информации в числовую

При нажатии клавиши "3" на экране появляется цифра 3. Однако, это не та 3, которую мы нажали. Так как мы вводим текстовую информацию (строку), а на мониторе появляется число. Данная программа позволяет переводить строку символов (максимальной длины 5 символов) в положительное число.

jmp beg
in_s db '16785#'   
out_s dw 0		

beg:
;Считаем количество символов в строке.
    lea bx,in_s    	
    mov cx, 0
    dec bx
    mov ax, '#'
len:
    inc bx	
    inc cx	
    cmp ax, [bx]
    jne len

;В cx содержится кол-во символов встроке, включая #. 
;bx указывает на #.В di будет содержаться out_s.
    dec cx	;cx содержит кол-во символов без #.
    dec bx	;bx указывает на последний символ (5)
    mov bp, 1	;В bp записываем 1
    mov di,0	;В di записываем 0
    mov si, 10	;В si записываем 10 

cirkl:
    mov al, [bx] ;В al загружаем тот байт из ОП, 
                 ;адрес которого записан в bx (символ 5)

    sub al, 48   ;Символ 5 представлен в ОП как двоичное число
		 ;00110101, а число 5 - 00000101. Значит нам
		 ;надо из регистра al вычесть 00110000, а это и 
		 ;есть число 48. (После этой операции в al запишется число 5)

    cbw		 ;Распространяем знак из байта в слово. (В ax число 5)
    imul bp	 ;Умножаем ax на содержимое регистра bp. (В ax 5*1=5)
    add di, ax	 ;Складываем ax и di. (В di число 5)
    mov ax, bp	 ;Записываем содержимое bp в ax. (В ах 1)
    imul si	 ;Умножаем ах на si. (В ах 1*10=10)
    mov bp, ax	 ;Записываем содержимое ах в bp. (В bp 10)
    dec bx	 ;Отнимаем 1 от bx. После этого bx указывает 
		 ;на предпоследний символ (символ 8)

    loop cirkl	 ;Продолжаем цикл пока сх<>0, т.е. 
    		 ;пока не переберём все символы.

halt:
    mov out_s, di 
    jmp halt;$e
;После завершения прграммы в out_s запишется число 16785

Возможный план разработки ASM-программ

         1. Разработка тестовых примеров ( крайние случаи ! )                 
                                                                             
         2. Разработка программы на языке высокого уровня ( ЯВУ )             
            ( алгоязык , PASCAL , C )                                         
                                                                              
       [ 3. ] Отладка программы на ЯВУ                                        
                                                                             
         4. Переход от ЯВУ к ассемблеру                                         

Примеры перехода от ЯВУ к ассемблеру ( :=, IF, FOR )

  A[I]:=B[J]                 MOV  AX,B[SI]                                   
                             MOV  A[DI],AX                                    
                                                                              
  IF A[I] < B[J] THEN        MOV  AX,B[SI]                                    
                             CMP  A[DI],AX                                    
                             JNL  MET                                         
                             .                                                
                             .    здесь то,что THEN                           
                                                                              
  FOR I:=1 TO 10 DO          MOV  CX,10                                       
                        M:                                                    
                             .                                                
                             .                                                
                             LOOP M                                           

Примеры перехода от ЯВУ к ассемблеру ( Двойной цикл, CALL )

   
  FOR I:=1 TO 5 DO           MOV  CX,5                                       
    FOR J:=1 TO 10 DO    M2: PUSH CX                                          
                             MOV  CX,10                                       
                         M1:                                                  
                             .         ТЕЛО ЦИКЛА                             
                             LOOP M1                                          
                             POP  CX                                          
                             LOOP M2                                          
                                                                              
  CALL PR(A,B,C)             CALL PR    ; A,B,C передаются ка глобальные      
                       либо                     через ОП или регистры,или стек
                                                                             
                             MOV  AX,A                                        
                             MOV  BX,B                                        
                             MOV  CX,C                                        
                             CALL PR    ; всегда через регистры AX,BX,CX   

Способы записи операндов

   
      INC  AL                        ВМЕСТО BX,SI могут быть                  
      INC  AX                                                                 
      INC  BYTE PTR [BX+SI]                 BX,DI    по умолчанию             
      INC  WORD PTR [BX+SI]                 BX          сегментный регистр DS 
      INC  BYTE PTR [BX][SI]                   SI                            
      INC  BYTE PTR 7[BX][SI]                  DI                             
      INC  MAS[BX+SI]                                                         
      INC  MAS[BX][SI]                                                        
      INC  ES:MAS[BX][SI]                    BP,SI   по умолчанию             
      INC  [SI+5]                            BP,DI      сегментный регистр SS 
      INC  [BX-21]                                                               

Примеры записи операндов

   
   FNAM   DB    60 DUP(?)                                                     
   ADDR   DW    0                                                             
          .                                                                   
          MOV   SI,AX                                                         
          MOV   FNAM[SI],' '                                                  
          .                                                                   
          MOV   DI,0                                                          
          MOV   FNAM[DI],AL                                                   
          .                                                                   
          INC   DI                                                            
          MOV   FNAM[DI],'$'                                                  
          .                                                                   
          CALL  KURS                                                          
          CALL  MESSAGE                                                       
          .                                                                 
          MOV   FNAM[DI+1],BH                                                 
          .                                                                   
          MOV   AX,[BX][SI]                                                   

Примеры записи макровызовов

   
   S003  DB  'ВВОД ДАННЫХ'                                                    
   LS003 DW  $-S003                                                           
   MWORD DB  40 DUP(?)                                                        
   ISPOS DB  320 DUP(?)                                                       
                                                                             
         .                                                                    
         PRINT S003,LS003                                                     
         .                                                                    
         GOTOXY 2,0                                                           
         .                                                                    
         INPUT  MWORD,10                                                      
         .                                                                    
         PRINT  ISPOS,80                                                      
         PRINT  ISPOS[80],80                                                  
         PRINT  ISPOS[160],80                                                 
         PRINT  ISPOS[240],80        

Алгоритм работы процесора

   
          /   читать                                                          
    U =  <    писать                                                          
          \   хранить                                                         
                                                                              
             /команды                                                         
    A = адрес                                                                 
             \данных                                                          
                                                                              
        / команда - результат чтения ОП по  указанному адресу                
    D = - данные  -   -"-                     -"-                             
        \ данные  - для записи   в   ОП       -"-                             
                                                                              
 ЗАМЕЧАНИЕ                                                                    
                                                                              
   команда  в машинных кодах - двоичное представление , а ОТОБРАЖЕНИЕ         
   данные                                                    ЕС,PC - 16       
                                                             СМ    - 8        

4 этапа технологического маршрута разработки программ

   
 ВОПРОС : Как появляются в ОП машинные коды программ и данные ?              
                                                                             
 ОТВЕТ  : За 4 этапа технологического маршрута разработки программ           
                                                                              
    1. Создание / редактирование исходных текстов программ.                   
                                                                             
    2. Синтаксический контроль и создание машинных кодов для                  
       синтаксически корректных программ.                                     
                                                                              
    3. Обьединение своих машинных кодов с машинными кодами системных          
       подпрограмм ( например  SIN,COS ) и своими ранее созданными            
       машинными кодами.                                                      
                                                                              
    4. Выполнение / отладка  программ                                         

Схема технологического маршрута разработки программ


Таблица синонимов для обьектов ТМРП


План изучения простейших приемов работы по отладке программ на ЭВМ

   
   1. Вход в систему.                                                         
   2. Редактирование исходных текстов                                        
       - запуск программы редактора исходных текстов                          
       - создание нового текста                                               
       - чтение ранее созданного исходного текста                             
       - переход между командным и экранным режимом                           
       - экранное редактирование                                              
                удаление           символа                                    
                вставка            строки                                     
                копирование        блока                                      
                перенос                                                      
       - запись модифицированного / вновь созданного текста                   
       - выход из редактора                                                   
   3. Компиляция                                                              
       - запуск программы - компилятора                                       
       - просмотр,распечатка  листинга компиляции                             
       - руководство программиста с перечнем сообщений об ошибках             
                                                                              
   4. Создание исполняемого кода                                              
       - запуск программы создания исполняемого кода                          
       - руководство программиста с перечнем сообщений об ошибках            
                                                                              
   5. Работа в отладчике                                                      
       - запуск отладчика с нужной программой                                 
       - установка,удаление точек останова                                    
       - запуск / останов программы                                           
       - просмотр / редактирование переменных                                 
         ( регистров и ячеек ОП для ассемблера )                              
                                                                              
   6. Получение распечаток результатов                                        
       - запуск своей программы на выполнение                                 
       - средства вывода результатов                                          
   7. Работа с файлами                                                        
       - вывести файл на экран / печать                                       
       - вывести список группы файлов на экран / печать                       
       - скопировать / переименовать / удалить  файл                          
   8. Выход из системы                                                        

Общая схема отладки ASM-программ в отладчике TD

   
     1. Подготовка EXE-файла с отладочной информацией.                     
                                                                              
     2. Установка рабочей среды в TD.                                         
                                                                              
     3. Установка точек останова.                                             
                                                                              
     4. Редактирование содержимого регистров , флагов , стека , областей ОП.  
                                                                             
     5. Команды выполнения.                                

Подготовка EXE-файла с отладочной информацией

   
   Пример BAT-файла :                                                         
                                                                            
   D:\BC3\TA \TASM    symbol /ZI       АССЕМБЛИРОВАТЬ ПРОГРАММУ        symbol
                                                                              
   D:\BC3\BIN\TLINK   symbol /V        СТРОИТЬ EXE-ФАЙЛ ПРОГРАММЫ      symbol 
                                                                              
   D:\BC3\TD \TD      symbol           ЗАПУСТИТЬ ОТЛАДЧИК НА ПРОГРАММУ symbol 

Установка рабочей среды в TD

   
    - подразумевает установку и сохранение  размеров и местоположения         
      нескольких окон , удобно отображающих исходный текст программы ,        
      регистры , флаги , стек , данные .                                      
                                                                              
 [ 1. ] Изменение размеров экрана до 50 * 80        ALT-O , DISPLAY OPTIONS   
                                                                              
   2.   Получение окна с регистрами,флагами,стеком  ALT-V , CPU               
                                                                      
   3.   Раздвинуть его на весь экран                CTRL-F5 ,                 
                                                                              
   4.   Добавить переменные в окно просмотра        CTRL-F7                   
                                                                              
   5.   Изменить размеры окна с исходным текстом    ALT-1 , CTRL-F5           
                                                                              
   6.   Сохранить рабочую среду                     ALT-O , SAVE OPTIONS      
----------------                                                             
       В режиме CTRL-F5                                                       
                        перемещать окно       -  " стрелки "                  
                        изменять размер окна  -  SHIFT-" стрелки "            

Установить точку останова

   
    1. Остановиться по достижении строки       ALT-1 , " стрелки " , F2       
                                                                              
    2. Остановиться по достижении метки        ALT-F2                         
                                                                              
    3. Остановиться по изменению области ОП    ALT-B , CHANGED MEMORY GLOBAL  
                                                                              
    4. Остановиться по выполнению условия      ALT-B , EXPRESSION TRUE GLOBAL 

Редактирование

   
   1. Исходный текст в TD редактировать нельзя , необходимо выйти из TD ,     
      отредактировать исходный текст , перезапустить ASM.BAT  .               
                                                                              
   2. Регистры , флаги , стек удобнее всего редактировать в окне CPU          
      ( ALT-3 , TAB - перемещение между подокнами ) .                         
                                                                              
   3. Числовые переменные программы можно редактировать в режиме CTRL-F4 .    
                                                                              
   4. Области ОП ( символьные строки , например ) удобно редактировать        
      в окне DUMP ( ALT-V ).                                                  

Выполнение программ

   
   1. Выполнить до точки останова ( или до конца )        F9                  
                                                                              
   2. Выполнить до курсора                                F4                  
                                                                              
   3. Выполнить один оператор                             F7 , F8             
                                                                              
   4. Выполнять программу с указанной задержкой           ALT-R , Animate     
                                                                              
   5. Начать выполнение сначала                           CTRL-F2