Assembly 使用堆栈对汇编程序(英特尔8086)中的字符进行计数

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: ',

如何使用intel 8086中的堆栈计算函数中的字符数? 我尝试使用堆栈(push)将字符串作为函数的参数传递。在函数“cuentaCaracteres”中,我计算所有字符,但不计算空格字符,当它找到输入字符时,它结束,然后我打印结果,但它总是打印00个字符。我认为函数没有进入“sumar”标记。在“完成”标记中,我返回ax寄存器(函数返回)中的cl寄存器(计数器变量)以打印它

.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:学习使用调试器。谢谢@小丑。现在它起作用了。