Не создается .obj, при этом в .lst ошибки нет, но часть кода выпадает - Assembler

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

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

.model  small
.stack  100
 
.data
    s       db ?
    mes1    db "Tsifra$"
    mes2    db "Zaglavnaia bukva$"
    mes3    db "Strochnaia bukva$"
    mes4    db "Ne tsifra i ne bukva$"
    endl    db 10, 13, "$"
    
.code
print       macro mes
    mov     ah, 9h
    lea     dx, mes
    int     21h
print       endm
    
start:
    mov     ax, @data
    mov     ds, ax
    
    mov     ah, 1       ; прочитали символ
    int     21h
    mov     s, al       ; сохранили символ
    print   endl
    
    cmp     s, 30h      ; 30h - код '0'
    jae     dalishe1
    print   mes4
    jmp     konets
    
dalishe1:
    cmp     s, 39h      ; 39 - код '9'
    ja      dalishe2
    print   mes1
    jmp     konets
    
dalishe2:
    cmp     s, 41h      ; 41h - 'A'
    jae     dalishe3
    print   mes4
    jmp     konets
    
dalishe3:
    cmp     s, 5Ah
    ja      dalishe4
    print   mes2
    jmp     konets
    
dalishe4:
    cmp     s, 61h
    jae     dalishe5
    print   mes4
    jmp     konets
    
dalishe5:
    cmp     s, 7Ah
    jbe     dalishe6
    print   mes4
    jmp     konets
    
dalishe6:
    print   mes3
 
konets:
    mov     ah, 1
    int     21h
    mov     ah, 4Ch
    int     21h
end start
Turbo Assembler	 Version 4.1	    22/01/14 14:11:26	    Page 1
18_1.asm

      1	0000			     .model  small
      2
      3	0000			     .data
      4	0000  ??			     s		     db	?
      5	0001  54 73 69 66 72 61	24	     mes1    db	"Tsifra$"
      6	0008  5A 61 67 6C 61 76	6E+	     mes2    db	"Zaglavnaia bukva$"
      7	      61 69 61 20 62 75	6B+
      8	      76 61 24
      9	0019  53 74 72 6F 63 68	6E+	     mes3    db	"Strochnaia bukva$"
     10	      61 69 61 20 62 75	6B+
     11	      76 61 24
     12	002A  4E 65 20 74 73 69	66+	     mes4    db	"Ne tsifra i ne	bukva$"
     13	      72 61 20 69 20 6E	65+
     14	      20 62 75 6B 76 61	24
     15	003F  0A 0D 24			     endl    db	10, 13,	"$"
     16
     17	0042			     .code
     18	0000			     start:
     19	0000  B8 0000s			     mov	     ax, @data
     20	0003  8E D8			     mov	     ds, ax
     21
     22	0005  B4 01			     mov	     ah, 1	     ; прочитали символ
     23	0007  CD 21			     int	     21h
     24	0009  A2 0000r			     mov	     s,	al	     ; сохранили символ
     25
     26	000C  B4 09			     mov	     ah, 9h	     ; вывели конец строки
     27	000E  BA 003Fr			     lea	     dx, endl
     28	0011  CD 21			     int	     21h
     29
     30	0013  80 3E 0000r 30		     cmp	     s,	30h
     31	0018  73 0A			     jae	     dalishe1
     32	001A  B4 09			     mov	     ah, 9h	     ; не буква	и не цифра
     33	001C  BA 002Ar			     lea	     dx, mes4
     34	001F  CD 21			     int	     21h
     35	0021  EB 01 90			     jmp	     konets
     36
     37	0024			     dalishe1:
     38
     39	0024			     konets:
     40	0024  B4 01			     mov	     ah, 1
     41	0026  CD 21			     int	     21h
     42	0028  B4 4C			     mov	     ah, 4Ch
     43	002A  CD 21			     int	     21h
     44				     end start
Turbo Assembler	 Version 4.1	    22/01/14 14:11:26	    Page 2
Symbol Table

Symbol Name			  Type	 Value

??DATE				  Text	 "22/01/14"
??FILENAME			  Text	 "18_1	  "
??TIME				  Text	 "14:11:26"
??VERSION			  Number 040A
@32BIT				  Text	 0
@CODE				  Text	 _TEXT
@CODESIZE			  Text	 0
@CPU				  Text	 0101H
@CURSEG				  Text	 _TEXT
@DATA				  Text	 DGROUP
@DATASIZE			  Text	 0
@FILENAME			  Text	 18_1
@INTERFACE			  Text	 000H
@MODEL				  Text	 2
@STACK				  Text	 DGROUP
@WORDSIZE			  Text	 2
DALISHE1			  Near	 _TEXT:0024
ENDL				  Byte	 DGROUP:003F
KONETS				  Near	 _TEXT:0024
MES1				  Byte	 DGROUP:0001
MES2				  Byte	 DGROUP:0008
MES3				  Byte	 DGROUP:0019
MES4				  Byte	 DGROUP:002A
S				  Byte	 DGROUP:0000
START				  Near	 _TEXT:0000

Groups & Segments		  Bit Size Align  Combine Class

DGROUP				  Group
  _DATA				  16  0042 Word	  Public  DATA
_TEXT				  16  002C Word	  Public  CODE

Решение задачи: «Не создается .obj, при этом в .lst ошибки нет, но часть кода выпадает»

textual
Листинг программы
.model tiny
.code
    org 100h
start:  
    mov dx, offset entr
    mov ah,9
    int 21h
    xor ax,ax
    int 16h
    cmp ah, 1
    jnz @@
    ret
@@: mov bl, al
    mov si, offset chk
    mov dx, offset nonchr
next:   lodsw
    cmp bl, al
    jb  nope
    cmp bl, ah
    jbe found
    add si, 2
    loop    next
found:  lodsw
    mov dx,ax
nope:   mov ah,9
    int 21h
    jmp start   
chk dw  '09'
    dw  dig
    dw  'AZ'
    dw  upper
    dw  'az'
    dw  lower
sz  =   ($ - chk) /4
entr    db  0Dh,0Ah,'Press any key:$'
nonchr  db  'Not a digit or letter$'
dig db  'digit$'
upper   db  'uppercase letter$'
lower   db  'lowercase letter$'
    end start

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

  1. Установка начального адреса: org 100h.
  2. Начало работы: start:.
  3. Передача ввода пользователя в регистр dx с помощью mov dx, offset entr.
  4. Ввод символа с помощью mov ah,9; int 21h.
  5. Очистка регистра ax с помощью xor ax,ax.
  6. Передача ввода пользователя в регистр bl с помощью mov bl, al.
  7. Начало цикла: next:.
  8. Загрузка пары байтов в регистры dx и ax с помощью lodsw.
  9. Сравнение регистра bl со значением в регистре al. Если меньше, то переход к nope:.
  10. Если регистр bl больше или равен значению в регистре ah, то переход к found:.
  11. Увеличение регистра si на 2 с помощью add si, 2.
  12. Проверка условия для цикла while с помощью loop next.
  13. Если условие ложно, то переход к found:.
  14. Загрузка пары байтов в регистры dx и ax с помощью lodsw.
  15. Передача значения регистра dx в регистр ax с помощью mov dx,ax.
  16. Если условие ложно, то переход к nope:.
  17. Передача ввода пользователя в регистр ah с помощью mov ah,9; int 21h.
  18. Переход к start:.
  19. Определение размера строки с помощью sz = ($ - chk) /4.
  20. Определение начальной точки строки с помощью offset.
  21. Определение символов для проверки: chk dw '09'; dw dig; dw 'AZ'; dw upper; dw lower;.
  22. Определение строк для вывода: entr db 0Dh,0Ah,'Press any key:$'; nonchr db 'Not a digit or letter$'; dig db 'digit$'; upper db 'uppercase letter$'; lower db 'lowercase letter$'.

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

15   голосов , оценка 4.067 из 5
Похожие ответы