Не создается .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
Объяснение кода листинга программы
- Установка начального адреса: org 100h.
- Начало работы: start:.
- Передача ввода пользователя в регистр dx с помощью mov dx, offset entr.
- Ввод символа с помощью mov ah,9; int 21h.
- Очистка регистра ax с помощью xor ax,ax.
- Передача ввода пользователя в регистр bl с помощью mov bl, al.
- Начало цикла: next:.
- Загрузка пары байтов в регистры dx и ax с помощью lodsw.
- Сравнение регистра bl со значением в регистре al. Если меньше, то переход к nope:.
- Если регистр bl больше или равен значению в регистре ah, то переход к found:.
- Увеличение регистра si на 2 с помощью add si, 2.
- Проверка условия для цикла while с помощью loop next.
- Если условие ложно, то переход к found:.
- Загрузка пары байтов в регистры dx и ax с помощью lodsw.
- Передача значения регистра dx в регистр ax с помощью mov dx,ax.
- Если условие ложно, то переход к nope:.
- Передача ввода пользователя в регистр ah с помощью mov ah,9; int 21h.
- Переход к start:.
- Определение размера строки с помощью sz = ($ - chk) /4.
- Определение начальной точки строки с помощью offset.
- Определение символов для проверки: chk dw '09'; dw dig; dw 'AZ'; dw upper; dw lower;.
- Определение строк для вывода: 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$'.