Я только начал программировать на ассемблере, так что я новичок.
Для практики я пытаюсь переписать базовую c lib c в сборке (синтаксис NASM Intel).
Но я застрял на функции strcmp :
;; Compare two C-style NUL-terminated strings
;; Inputs : ESI = address of s1, EDI = address of s2
;; Outputs : EAX = return an integer less than, equal to, or greater than zero if s1 is found, respectively, to be less than, to match, or be greater than s2
strcmp:
call strlen
mov ecx, eax ; ecx = length of the string in esi
repe cmpsb
sub esi, edi ; result = *esi - *edi
mov eax, esi
ret
Для меня это должно работать так:
s1 db 'Hello World', 0
s2 db 'Hello Stack', 0
После repe cmpsb
инструкция, ESI
должно быть равно [s1 + 7]
и EDI
до [s2 + 7]
.
Так что мне просто нужно сделать EAX
= 'W' - 'S' = 87 - 83 = 4
Проблема в том, что не работает. Я думаю, проблема в том, что когда я выполняю эту инструкцию:
sub esi, edi ; result = *esi - *edi
, я не думаю, что это означает: вычесть символы, на которые указывают EDI
и ESI
.
Кто-нибудь знает, как я могу это сделать?