операции push и pop в функции листьев - PullRequest
0 голосов
/ 07 апреля 2019

Ниже приведена написанная мной подпрограмма на ассемблере x86, предназначенная для вызова из программы на Си:

;================================================================
; IsBetweenAandB - tests a character if it is between 'a' and 'b'
; arguments:
;   ch = character to be tested
;   a = start character
;   b = end character
; return value:
;   1 = yes
;   0 = no
;----------------------------------------------------------------
IsBetweenAandB:
    push    ebp
    mov ebp, esp    
    add esp, 12 ;<------------------------------------------(1)
                        ; [ebp]     = old ebp stack frame
                        ; [ebp + 4] = return address
    mov eax, [ebp + 8]  ; [ebp+8] = ch
    push ebx ;<------------------------------------------(2)
    mov ebx, [ebp + 12] ; 'a' = start
    push edx ;<------------------------------------------(2)
    mov edx, [ebp + 16] ; 'e' = end 

    cmp eax, ebx    ; compare 'ch' with 'a'
    jae next_test_ibab  ; if(ch>='a')
    jb  set_zero_ibab   ; if(ch<'a')

next_test_ibab:
    cmp eax, edx    ; compare 'ch' with 'e'
    jbe set_one_ibab        ; if(ch<='e')
    ja  set_zero_ibab   ; if(ch>'e')

set_one_ibab:
    mov eax, 1  
    jmp returns_ibab

set_zero_ibab:
    mov eax, 0

returns_ibab:
    pop edx ;<------------------------------------------(2)
    pop ebx ;<------------------------------------------(2)

    mov     esp, ebp
    pop     ebp
    ret

У меня здесь два вопроса:

  1. Поскольку я здесь не использую локальную переменную, нужно ли писать add esp, 12?
  2. (a) Эти толчки и нажатия действительно необходимы вообще (они предназначены для восстановления старых значений регистров ebx и edx)?
    (б) Могут ли они вызвать какие-либо нарушения в esp?
...