Assembly 使用堆栈对汇编程序(英特尔8086)中的字符进行计数
如何使用intel 8086中的堆栈计算函数中的字符数? 我尝试使用堆栈(push)将字符串作为函数的参数传递。在函数“cuentaCaracteres”中,我计算所有字符,但不计算空格字符,当它找到输入字符时,它结束,然后我打印结果,但它总是打印00个字符。我认为函数没有进入“sumar”标记。在“完成”标记中,我返回ax寄存器(函数返回)中的cl寄存器(计数器变量)以打印它Assembly 使用堆栈对汇编程序(英特尔8086)中的字符进行计数,assembly,stack,intel,x86-16,Assembly,Stack,Intel,X86 16,如何使用intel 8086中的堆栈计算函数中的字符数? 我尝试使用堆栈(push)将字符串作为函数的参数传递。在函数“cuentaCaracteres”中,我计算所有字符,但不计算空格字符,当它找到输入字符时,它结束,然后我打印结果,但它总是打印00个字符。我认为函数没有进入“sumar”标记。在“完成”标记中,我返回ax寄存器(函数返回)中的cl寄存器(计数器变量)以打印它 .model small .stack 100h .data msg db 'La cadena es: ',
.model small
.stack 100h
.data
msg db 'La cadena es: ','$'
cadena db 'hola mundo',13,10,'$'
cadena2 db 'Tiene ','$'
contador db 0
cadena3 db ' caracteres',13,10,'$'
.code
cuenta:
mov ax, @data
mov ds, ax
;imprime cadenas
mov dx, offset msg
mov ah, 9h
int 21h
mov dx, offset cadena
mov ah, 9h
int 21h
push dx ;pasamos por referencia la variable cadena, lo metemos a la pila
mov dx, offset cadena2
mov ah, 9h
int 21h
;mov dx, offset contador
;push dx ;pasamos por referencia la variable contador, lo metemos a la pila
call cuentaCaracteres
AAM
mov bx, ax
mov ah, 2
mov dl, bh
add dl, 48 ; convertir de valor numero a valor ASCII
int 21h
mov ah, 2
mov dl, bl
add dl, 48 ; convertir de valor numero a valor ASCII
int 21h
mov dx, offset cadena3
mov ah, 9h
int 21h
mov al, 0
mov ah, 04ch
int 21h
cuentaCaracteres proc
push bp
mov bp, sp
;push es
mov si, [bp+4] ;guardar en si la palabra a contar caracteres
mov cl, 0
;mov cl, [bp+6] ;guardar el contador, se le pone más 4 porque cuenta 2 bytes del bp y 2 bytes del ret@
;push ds
;pop es
bucle:
mov dl, [si]
cmp dl, 13 ;compara cuando un caracter de la cadena llega al enter
je done ;si llega al enter,termina de contar
cmp dl, 32 ;compara cuando un caracter sea el carcter espacio
jnae sumar ;se va a la etiqueta sumar, cuando no es espacio, donde se incrementa el contador
inc si ; incrementa al si para que siga sumando los caracteres
jmp bucle
sumar:
inc cl ;incrementa en 1 al contador
inc si ; incrementa al si para que siga sumando los caracteres
jmp bucle ;regresa al loop
done:
;pop es
pop bp
mov ax, cx ;retornamos la variable del contador de caracteres
ret
cuentaCaracteres endp
end cuenta
我认为函数没有进入“sumar”标记
-这是正确的。你把情况颠倒了。您想要的是ja
而不是jnae
。PS:学习使用调试器。谢谢@小丑。现在它工作了。我认为函数没有进入“sumar”标记
-这是正确的。你把情况颠倒了。您想要的是ja
而不是jnae
。PS:学习使用调试器。谢谢@小丑。现在它起作用了。