2016-04-16 7 views
-1

私は最初のアセンブリプログラムをプログラミングしていますが、最後に文字列の長さを探したいのですが、結果を変換して表示しますが、アセンブリは私の結果に9以上出力されません

操作の前に変数を10進数に変換してから、ASCIIに変換して表示します。

結果だけを変換しようとしましたが、どちらも機能しません。

私はNASMを使用しており、Ubuntu Linuxでプログラムを実行しています。

マイコード:

segment .data     ;Segmento de datos 
    mensaje db 'Introduzca una cadena: '  ;Mensaje 
    tamMensaje equ $-mensaje   ;Tamaño del mensaje 
    respuesta db 'Fue: ' 
    respuesta2 db 'Tamaño: ' 
    tamRespuesta equ $-respuesta 
    tamRespuesta2 equ $-respuesta2 
segment .bss 
    pal resb 50 ;Word 
    tam resb 1 ;Size of the word 
segment .text 
global _start 

_start: 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, mensaje 
    mov edx, tamMensaje 
    int 0x80 

;Leer 
    mov eax, 3 
    mov ebx, 2 
    mov ecx, pal 
    mov edx, 50 
    int 0x80 

;Respuesta 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, respuesta 
    mov edx, tamRespuesta 
    int 0x80 

;Respuesta Numero 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, pal 
    mov edx, 50 
    int 0x80 

;Count size 
    mov edi, pal  ;move word to edi 
    sub ecx, ecx  ;set ecx to 0 
    not ecx   ;set ecx to highest value 
    sub ecx, '0'  ; conversion to decimal 
    sub al, al  ; set al to zero, looks for a null character 
    cld    ;clear flags 
    repne scasb  ; decreases ecx moving trough the word 
    mov eax,0fffffffeh ;set eax to highest value minus 1 
    sub eax, '0'  ;conversion to decimal 
    sub eax,ecx  ; lenght = eax - ecx 
    dec eax   ; eax = eax -1 
    add eax, '0'  ; conversion to ascii 
    mov [tam],eax 
    int 0x80  

;Imprimir mensaje -tamaño:- 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, respuesta2 
    mov edx, tamRespuesta2 
    int 0x80 


;Imprimir Tamaño 
    mov ecx, tam 
    mov ebx, 1 
    mov edx, 1 
    mov eax, 4 
    int 0x80 



;salir 
    mov eax,1 
    mov ebx,0 
    int 0x80 
+0

「うまくいかない」と私たちにはあまり言いません。正確なエラーまたは間違った出力は何ですか? ([How to Ask] [http://www.stackoverflow.com/help/how-to-ask]を参照してください。) – CodeMouse92

+0

申し訳ありませんが、私はそれについて説明しませんでした。サイズが9以下の場合。数値は印刷されますが、サイズが大きくなると文字や空白も印刷されます – Raphael

+0

このサイトはほとんどが英語の話し手なので、変数名やコメントが翻訳されると、より良い応答を得ることができます。 Google翻訳を開く作業を保存します。 –

答えて

0

ascii tableこの(または任意)を調べ、そしてあなたは、数字0〜9のASCII相当(アスキー#48から始まる)のみが存在することがわかります。たとえば、'0' + 10に達すると、:;<などとなります。

したがって、add eax, '0'は1桁の10進数で正常に動作しますが、10の倍数ごとにこのプロセスを最上位桁から始めて繰り返す必要があります。

//num is any number, in your case, the length 
for (int num=1026; num>0; num=Math.floor(num/10)) 
    stdout('0' + (num % 10)); //not a real function 

をしかし、あなたは後方に検索結果を取得します:

あなたは繰り返しこの操作を行うことができます。あなたは、アレイに保存し、それを逆に、またはあなたの代わりに再帰ループを使用することができますできます

void translateChar(int num) { 
    if (num <= 0) return; 
    translateChar(num/10); //non-float division, very important 
    stdout('0'+(num%10)); //this function isn't real, of course 
    return; 
} 

translateChar(1025); //whatever your length is 

あなたはNASMを十分に把握しているように思え、私は読者にアセンブリへの翻訳を残しておきます。

まず例: http://pythontutor.com/javascript.html#code=var+out%3D%5B%5D%3B%0D%0Afor+(var+n%3D1026%3Bn%3E0%3Bn%3DMath.floor(n/10%29%29+out.push(num%2510%29%3B&mode=display&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=js&rawInputLstJSON=%5B%5D&curInstr=0

再帰例:私はインラインリンクとしてこれらを掲示させないためのSOへ http://pythontutor.com/javascript.html#code=var+out%3D%5B%5D%3B%0D%0Afunction+toChar(n%29+%7B%0D%0A++if(n%3C%3D0%29+return%3B%0D%0A++toChar(Math.floor(n/10%29%29%3B%0D%0A++out.push(n%2510%29%3B%0D%0A++return%3B%0D%0A%7D%0D%0AtoChar(1023%29%3B&mode=display&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=js&rawInputLstJSON=%5B%5D&curInstr=29

ビッグ感謝。