2016-04-27 10 views
1

を印刷:私はそれを実行するとNASMは、私はNASM国会で書かれた次のプログラムを持って次の行に

section .text 
    global _start: 

_start: 
    ; Input variables 
    mov edx, inLen 
    mov ecx, inMsg 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 

    mov edx, 2 
    mov ecx, num1 
    mov ebx, 0 
    mov eax, 3 
    int 0x80 

    mov edx, inLen 
    mov ecx, inMsg 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 

    mov edx, 2 
    mov ecx, num2 
    mov ebx, 0 
    mov eax, 3 
    int 0x80 

    ; Put input values in correct registers 
    mov eax, [num1] 
    sub eax, '0' ; convert char to num 
    mov ebx, [num2] 
    sub ebx, '0' ; convert char to num 

    ; Perform addition 
    add eax, ebx 
    add eax, '0' ; convert num to char 

    ; Set sum in res 
    mov [res], eax 

    ; Output result 
    mov edx, resLen 
    mov ecx, resMsg 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 

    mov edx, 1 
    mov ecx, res 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 

    ; Exit program 
    mov eax, 1 
    int 0x80 

    section .bss 
    num1 resb 2 
    num2 resb 2 
    res resb 2 

section .data 
    inMsg db "Input number: ", 0xA, 0xD 
    inLen equ $-inMsg 
    resMsg db "Result: ", 0xA, 0xD 
    resLen equ $-resMsg 

コンソールには、次のようになります。

[email protected]:~/ASM/Addition$ ./Add 
Input number: 
3 
Input number: 
2 
Result: 
[email protected]:~/ASM/Addition$ 

私は5ので、それを取得できますかそれ自身の行に印刷し、その直後にcmdの印刷をしませんか? I.それは次のようになります。

[email protected]:~/ASM/Addition$ ./Add 
Input number: 
3 
Input number: 
2 
Result: 
5 
[email protected]:~/ASM/Addition$ 
+2

結果を出力した後に、文字列 '0xA、0xD'をstdoutに書き出します。 – Michael

+3

これはLinuxで、 '0xA'と書いてください。 – Jester

答えて

3

をあなたはすでにすべての情報を持っている、あなたはまだそれを見ることはありません。

resMsg db "Result: ", 0xA, 0xD 

あなたは、これは正確に何を意味するのか知っていますか?それは、次の文字からなる文字列を定義:数値と(XYが実際に目に見えない文字である

Result: XY 

を... 0xAが= 10と、ラインフィード(LF)とキャリッジとして知ら0xDの= 13、 return(CR))、出力が新しい行に折り返されます。彼らは目に見えない性質のため二重引用符の外側で指定されています - あなたは単にそこに含めることができないので、代わりに数値を書かなければなりません。

newLineMsg db 0xA, 0xD 
newLineLen equ $-newLineMsg 

newLineLenはもちろんの2になりますが、私はあなたが現在、理解を容易にするために、使用と同じシステムを維持するために、ここでそれを残した。):

しかし、もちろんあなたにも一人でそれらを使用することができますただ出力するので

他のテキスト(あなたが5後に何をしたいのか)なし改行は、あなたがして使用することができます。

mov edx, newLineLen 
mov ecx, newLineMsg 
mov ebx, 1 
mov eax, 4 
int 0x80 

... resMsg/resLenのように。ジェスターは、Linux上で、指摘したように


しかし、あなたはまた、1つだけの改行(0xAが)を出力することができる(ともあなたのコードから既存の0xD年代を削除する)必要があります。

+0

別の改行は必要ありません。 'resMsg'の改行にラベルを付けるだけです。また、それらがすべて '.rodata'セクションにあるべきことを指摘する価値があります。 –

+1

また、NASM(YASMではなく)は、バックスクォートされた文字列の中でCスタイルの '\ n'を処理するので、ASCIIエンコーディングに数値の代わりにその文字を使用することができます。 –

+0

@PeterCordes:次のコードを実行しました:[](https://gist.github.com/anonymous/ecba3950faa63a4fff4d4573bbc8d0d2)。こんにちはHello.o )を使用してコンパイルしましたが、スクリプトを実行したとき、コンソールは次のようになりました:tyler @ ubuntu:〜/ ASM/HellowWorld $ ./Hello Hello World \ ntyler @ ubuntu:〜/ ASM/HellowWorld $ ....私はCスタイルがうまくいかないように見えるので間違っていますか? –

関連する問題