我正在完成一个汇编程序,它用给定的替换字符替换字符串中的字符。汇编代码调用 C 函数,而汇编程序本身是从我的 .c 文件中的 main 调用的。但是,我试图找到一个合适的寄存器来存储某种计数器来计算字符被替换的次数。最终,我会在返回调用 c 函数之前将该值放入 eax(在这种情况下,它将将该值返回给 r)。
编辑:固定!我意识到我不需要将通过汇编调用的 c 函数的返回值实际存储在 ebx 寄存器中。这释放了 bl 用作计数器,然后我将 al 分配给 bl。由于 al 是 eax 的 16 位版本,所以我可以返回 eax,它将包含更改的字符数!
我的 [固定] 汇编代码是:
; File: strrepl.asm
; Implements a C function with the prototype:
;
; int strrepl(char *str, int c, int (* isinsubset) (int c) ) ;
;
;
; Result: chars in string are replaced with the replacement character and string is returned.
SECTION .text
global strrepl
_strrepl: nop
strrepl:
push ebp ; set up stack frame
mov ebp, esp
push esi ; save registers
push ebx
xor eax, eax
mov ecx, [ebp + 8] ;load string (char array) into ecx
jecxz end ;jump if [ecx] is zero
mov al, [ebp + 12] ;move the replacement character into esi
mov edx, [ebp + 16] ;move function pointer into edx
xor bl, bl
firstLoop:
xor eax, eax
mov edi, [ecx]
cmp edi, 0
jz end
mov edi, ecx ; save array
movzx eax, byte [ecx] ;load single byte into eax
push eax ; parameter for (*isinsubset)
mov edx, [ebp + 16]
call edx ; execute (*isinsubset)
mov ecx, edi ; restore array
cmp eax, 0
jne secondLoop
add esp, 4 ; "pop off" the parameter
add ecx, 1
jmp firstLoop
secondLoop:
mov eax, [ebp+12]
mov [ecx], al
inc bl
mov edx, [ebp+16]
add esp, 4
add ecx, 1
jmp firstLoop
end:
xor eax, eax
mov al, bl
pop ebx ; restore registers
pop esi
mov esp, ebp ; take down stack frame
pop ebp
ret