0

私は今日いくつかのコーディングを行っており、他のトピックの助けを借りて、自分のプログラムを実行しようとしました。それのアイデアは、私が最初に置いた値(それはアスキーです)を通常の値に変更することです。だから、私がコンソールで見たいもの:

  1. 番号[A-1、..、Z-26] A
  2. 1

Aを入力したときの出力は1、Bは2などになります。取得した出力は大量のゴミです。

これが私のコードです:

SYSCALL = 0X80
SYSEXIT = 1
SYSREAD = 3
SYSWRITE = 4
STDIN = 0
STDOUT = 1  

.data
.align 32

NUMBER_MAXLEN = 2
NUMBER: .space NUMBER_MAXLEN
NUMBER_LEN: .long 0

MSG_NUMBER: .ascii "Number [A-1, .., Z-26] "
MSG_NUMBER_LEN = . - MSG_NUMBER

.text
.global _start

_start:

#show
mov $SYSWRITE, %eax
mov $STDOUT, %ebx
mov $MSG_NUMBER, %ecx
mov $MSG_NUMBER_LEN, %edx
int $SYSCALL

#read
mov $SYSREAD, %eax
mov $STDIN, %ebx   
mov $NUMBER, %ecx
mov $NUMBER_MAXLEN, %edx
int $SYSCALL

#length
sub $1, %eax
mov %eax, NUMBER_LEN

#Change to normal value
xor %eax, %eax
movb NUMBER, %al
sub $'A', %al
add $1, %al
movb %al, NUMBER

#Print
mov $SYSWRITE, %eax
mov $STDOUT, %ebx
mov $NUMBER, %ecx
mov $NUMBER_LEN, %edx
int $SYSCALL     

END:
mov $SYSEXIT, %eax
int $SYSCALL

私が間違っていることは何ですか?どうすればうまくいくことができますか..修理しますか?

4

2 に答える 2

0

syscall(4)は__nr_write単に文字列を出力するだけで、関数としては機能しませんprintf。したがって、印刷する前に、数値を文字列表現に変換する必要があります。

これがどのように行われるかを示すいくつかの疑似コードです:

char buffer[10];
char *p = &buffer[9];

*p = 0;  // NULL terminator
do {
  p--;
  *p = (number % 10) + '0';
  number /= 10;
} while (number != 0);

print(buffer);
于 2013-03-24T15:21:21.307 に答える
0

ユーザーが「Z」を入力した場合、「26」を印刷しますか?ルックアップテーブルを使用することも、自分で変換を行うこともできます。INTEL / NASM形式:

%define SYSCALL  0X80
%define SYSEXIT  1
%define SYSREAD  3
%define SYSWRITE  4
%define STDIN  0
%define STDOUT 1  

%define NUMBER_MAXLEN 2
section .data

MSG_NUMBER: db "Number [A-1, .., Z-26] ", 0
MSG_NUMBER_LEN equ $ - MSG_NUMBER

section .bss

NUMBER:         resb NUMBER_MAXLEN
NumToPrint      resb 3
NUMBER_LEN:     resd 1

section .text
global main

main:

;show
    mov     eax, SYSWRITE
    mov     ebx, STDOUT
    mov     ecx, MSG_NUMBER
    mov     edx, MSG_NUMBER_LEN
    int     SYSCALL

;~ #read
    mov     eax, SYSREAD
    mov     ebx, STDIN
    mov     ecx, NUMBER
    mov     edx, NUMBER_MAXLEN
    int     SYSCALL

;~ #length
    sub     eax, 1
    mov     NUMBER_LEN, eax 

;~ #Change to normal value
    movzx   eax,  byte [NUMBER]
    push    eax
    call    IsValidChar
    test    eax, eax
    js      main                            ; not valid input, repeat prompt

    push    NumToPrint
    push    eax
    call    dwtoa                           ; convert to ASCII

;~ #Print
    mov     edx, eax
    mov     eax, SYSWRITE
    mov     ebx, STDOUT
    mov     ecx, NumToPrint        
    int     SYSCALL    

End:
    mov     eax, SYSEXIT
    int     SYSCALL

;~ #########################################    
IsValidChar:
    mov     eax, [esp + 4]

.0to9:
    cmp     eax, "0"
    jb      .NoGood
    cmp     eax, "9"
    ja      .AtoZ
    jmp     .NoGood

.AtoZ:
    cmp     eax, "A"
    jb      .NoGood
    cmp     eax, "Z"
    ja      .atoz
    sub     eax, 64                         ; convert letter index to number equiv.
    jmp     .Done

.atoz:
    cmp     eax, "a"
    jb      .NoGood
    cmp     eax, "z"
    ja      .NoGood
    sub     eax, 96                         ; convert letter index to number equiv.
    jmp     .Done

.NoGood:
    xor     eax, eax
    dec     eax
.Done:
    ret     4

独自のdwtoa(DWORDからASCII)を作成する必要があります。

ここに画像の説明を入力してください

于 2013-03-24T15:37:41.850 に答える