2016-11-07 3 views
0

こんにちは私はアセンブリのGASのバイナリ番号に16進数のコンバータを開発する必要があります。今私はこれを持っています:バイナリ用アセンブリGASコンバータのヘキサ

.align 32 

SYSEXIT = 1 
SYSREAD = 3 
SYSWRITE = 4 
STDOUT = 1 
EXIT_SUCCESS = 0 
Input_SIZE = 10 

.bss 
.lcomm Input, Input_SIZE 

.data 

msg: .ascii "Give hex number:\n" 
msg_len = . - msg 

newline: .ascii "\n" 
    newline_len = . - newline 

.text 
.global _start 

_start: 

mov $SYSWRITE, %eax 
mov $STDOUT, %ebx 
mov $msg, %ecx 
mov $msg_len, %edx 
int $0x80 

mov $SYSREAD, %eax 
mov $STDOUT, %ebx 
mov $Input, %ecx 
mov $Input_SIZE, %edx 
int $0x80 

    movl %eax, %edi 
    movl %eax, %edx  
    dec %edx 


loop1: 
cmpl $1, %edx 
je loop1_exit 
movb Input(,%edx,1), %al 


      cmpb 0x00, %al 
      jl number 
      cmpb 0x41, %al 
      jg big_char 
      cmpb 0x46, %al 
      jl big_char 
      cmpb 0x61, %al 
      jg low_char 
      cmpb 0x66, %al 
      jl low_char 

jmp loop1 

number: 
    sub $'0', %al 
big_char: 
    cmpb $'a', %al 
    jae low_char 
    sub $'A', %al 
    add $10, %al 

low_char: 
    sub $'a', %al 
    add $10, %al 

loop1_exit: 
movl $SYSWRITE, %eax 
    movl $STDOUT, %ebx 
    movl $newline, %ecx 
    movl $newline_len, %edx 
    int $0x80 


    movl $SYSEXIT, %eax 
    movl $EXIT_SUCCESS, %ebx 
    int $0x80 

私は次の何をすべきか考えていません。プログラムでバイナリ番号を印刷する方法。私は毎バイナリ4で印刷するためにいくつかの2番目のループが必要だと思います。これは私が今持っているものは大丈夫ですか?

答えて

0

これは私が今行っていることですか?

デバッガで実行して、異なる入力を試してみてください。予想されるCPU状態が期待どおりかどうかを確認してください(何か疑念があります。 。

プログラムでバイナリ番号を印刷するにはどうすればいいですか?

123450x3039)の場合、バイナリ出力は11000000111001です。それで?

(init部分)あるレジスタr1に値があるとしましょう。 32bの数r2 = 0x80000000に対して、他のレジスタr2をゼロに設定します。

to_binary_loop: 
    test r1,r2 ; does bitwise AND, discards result, sets up flags 
    output(zero_flag ? '0' : '1') 
    shr r2,1 ; moves the bit to right by 1 position 
    jnz to_binary_loop ; loop till all bits were processed 

これは00000000000000000011000000111001のように、また、完全な32bのバイナリ出力のための最初のゼロを表示します。それを避けるには、先に最初のものの別のループを置きたいと思うことがあります。任意の命令に

; somewhere defined (can be even in .text near the loop, read-only usage) 
bin_digit: .ascii "01" 

    ; in init of loop 
    xor r3,r3 ; pick one of eax,ebx,ecx,edx (spare one), set to zero 

    ; during loop after "test r1,r2" 
    setnz r3_byte_part 
    mov bin_digit(r3),al ; al = '0' (ZF=1) or '1' (ZF=0) 
    ; output char in "al" 

:..私は個人的にと書きます

to_binary_skip_leading_zeroes: 
    test r1,r2 
    jnz to_binary_found_leading_one 
    shr r2,1 ; next bit 
    jnz to_binary_skip_leading_zeroes 
    ; no "1" bit found in r1, enforce at least single 0 to display 
    mov r2,1 
to_binary_found_leading_one: 

output(zero_flag ? '0' : '1')こと必要に応じてサイズ接尾辞を追加してください。私はAT & T構文で自分自身を拷問するつもりはありません。

関連する問題