Advertisement
stbrr

strcmp

Nov 9th, 2021 (edited)
1,984
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;лабораторная работа 3 ДОДЕЛАЛА ВЫВОД ОТРИЦАТЕЛЬНОГО ЧИСЛА ЕСЛИ СТРОКИ НЕ РАВНЫ
  2. ;3 вариант
  3. assume cs: code, ds: data, es: data
  4.  
  5. data segment
  6. string1 db 100, 99 dup (0)
  7. string2 db 100, 99 dup (0)
  8. msg1 db "Enter string1: $"
  9. msg2 db 0ah, 0dh, "Enter string2: $"       
  10. msg3 db 0ah, 0dh, "Result of execution strcmp(string1, string2): $"
  11. data ends
  12.  
  13. sseg segment stack
  14. db 100h dup (?)
  15. sseg ends
  16.  
  17. code segment
  18. strcmp proc
  19.         pop bp  ; указатель на вершину стека - адрес возврата
  20.         pop dx  ; указатель на string2
  21.         pop bx  ; указатель на string1
  22.    
  23.     strloop:
  24.         cld     ; направление df=0
  25.        
  26.         mov cx, 100     ; кол-во повторений строковых операций 
  27.         mov di, dx  ; указатель на string 2
  28.         mov si, bx  ; указатель на string1
  29.         repe cmpsb  ; повторение до первого несовпадения
  30.         jne noeq    ; строки не равны (нашли различные байты) => перескакиваем на noeq
  31.         cmp cx, 0
  32.         je eql      ; если cx=0 - мы дошли до конца строки => они равны => перескакиваем на eql
  33.         jmp strloop ; безусловный переход на начало цикла, если мы не перешли в noeq или eql
  34.         noeq:
  35.             dec si      ; Если несовпадение было найдено, то DI и SI будут указывать на байты, следующие непосредственно за байтами, которые не совпали
  36.             dec di      ; пусть di и si указывают на сами несовпадающие байты, а не на следующие после них
  37.                     ; Нужно сравнить [di] и [si]
  38.             mov ax, [si]
  39.             cmp ax, [di]    ; ax - [di] сравнивается с 0
  40.             ja gr       ;больше
  41.             jb ls       ;меньше
  42.             jmp strloop
  43.             gr:         ; в случае string1 > string 2 должно возвращаться положительное число
  44.                 sub ax, [di]
  45.                 mov dx, ax
  46.                 mov bx, 0   ;0 ЗНАЧИТ ЧИСЛО ПОЛОЖИТЕЛЬНОЕ  
  47.                 jmp ext
  48.             ls:         ; в случае string1 < string 2 должно возвращаться отрицательное число
  49.                 sub ax, [di]    ; отрицательное число в процессоре будет в дополнительном коде
  50.                 sub ax, 1   ; доп код -> обратный код
  51.                 mov dx, ax
  52.                 mov bx, 1   ;1 ЗНАЧИТ ЧИСЛО ОТРИЦАТЕЛЬНОЕ
  53.                 jmp ext
  54.         eql:
  55.             mov dx, 0       ; string1 = string2 возвращается 0
  56.             jmp ext
  57.     ext:
  58.         push dx     ; возвращаемое значение
  59.         push bx     ; ОПОЗНАВАТЕЛЬ ПОЛОЖИТЕЛЬНОГО/ОТРИЦАТЕЛЬНОГО ЗНАЧЕНИЯ
  60.         push bp     ; кладем в стек адрес возврата
  61.         ret     ; возврат управления вызывающей программе
  62. strcmp endp
  63.  
  64.  
  65. start: 
  66.     mov ax, data
  67.     mov ds, ax
  68.     mov es, ax
  69.     lea dx, msg1
  70.     mov ah, 09h
  71.     int 21h     ; вывели просьбу ввести 1ю строку
  72.     lea dx, string1
  73.     mov ah, 0ah
  74.     int 21h     ; ввели 1 строку с клавиатуры
  75.     push dx     ; отправялем в стек
  76.     lea dx, msg2
  77.     mov ah, 09h
  78.     int 21h     ; вывели просьбу ввести 2ю строку
  79.     lea dx, string2
  80.     mov ah, 0ah
  81.     int 21h     ; ввели 2 строку с клавиатуры
  82.     push dx     ; отправялем в стек
  83.     lea dx, msg3
  84.     mov ah, 09h
  85.     int 21h     ; выводим 3 строку, далее результат вычисления функции
  86.     call strcmp
  87.     pop bx      ;1 ИЛИ 0 - ОТРИЦ ИЛИ ПОЛОЖ ЧИСЛО
  88.    
  89.     cmp bx,1    ;ОТРИЦАТЕЛЬНОЕ ?
  90.     jne answer  ;ЕСЛИ ПОЛОЖИТЕЛЬНОЕ
  91.     mov ah,02h
  92.     mov dl,'-'  ;ВЫВОДИМ ЗНАК '-'
  93.     int 21h
  94.     pop ax      ; запоминаем результат функции в ax
  95.     not ax      ;ИНВЕРТИРУЕМ
  96.     push ax
  97.  
  98. answer:            
  99.     pop ax          ; запоминаем результат функции в ax
  100.     mov bx, 10      ; вывод значения в 10сс
  101.     mov cx, 0       ; обнуление счетчика цифр (xor cx, cx)
  102. inDec:  
  103.     xor dx, dx      ; обнуляем dx
  104.     div bx          ; делим число на основание сс. В остатке - последняя цифра. ax - частное, dx - остаток
  105.     add dl, 30h         ; в dl будет находится код символа цифры, и чтобы получить в al именно код символа, нужно прибавить код символа "0", который равен 30h
  106.     push dx         ; сохраним цифру из остатка в стек
  107.     inc cx         
  108.     or ax, ax       ; проверка ax == 0
  109.     jne inDec       ; переход по адресу inDec, если частное не ноль  (продолжаем до конца числа)
  110.  
  111. outp:
  112.     mov ah, 02h     ; 02h - вывод символа
  113.     pop dx         
  114.     int 21h
  115.     loop outp  
  116. jmp away   
  117.  
  118. away:      
  119.     mov ah, 4ch
  120.     int 21h
  121.     code ends
  122.     end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement