2

私は最近アセンブリを独学で学んでおり、NASM アセンブラとその構文が最も効率的で使いやすいと判断しました。現在、標準入力と標準出力を使用しています。ただし、読み取っている文字列から改行文字 (キャリッジ リターン、フォーム フィード、改行、それぞれ 0xd、0xc、0xa) を削除する必要があるため、途方に暮れています。次の点を考慮してください。

    section .data
;; ...
    section .bss
input:  resb    255
 .len:  equ     $ - input

    section .text
    global  _start

_start:
    ;; Display message prompting for input, then...
    mov     edx, input.len
    mov     ecx, input
    mov     ebx, 0
    mov     eax, 3
    int     0x80

現在、末尾の改行文字を削除したいと考えています。次の擬似コードを検討してください。

if the last character in `input` is 0xa or 0xc or 0xd:
    subtract the last character from `input`
repeat until false

私はおそらく自分自身を明確にしましたが、上記の擬似コードに相当する Python を次に示します。

while input[-1] is "\r" or input[-1] is "\f" or input[-1] is "\n":
    input = input[:-1]
4

1 に答える 1

2

これは特にエレガントでも効率的でもありませんが、出発点を提供する可能性があります。

jcomeau@intrepid:/tmp$ cat test.nasm ; nasm -f elf -o test.o test.nasm; ld -o test test.o; ./test
    section .bss
input:  resb    255
 .len:  equ     $ - input

    section .text
    global  _start

_start:
    ;; Display message prompting for input, then...
    mov     edx, input.len
    mov     ecx, input
    mov     ebx, 0
    mov     eax, 3
    int     0x80  ;read in from stdin
    call    rstrip
    mov     edx, eax  ;count
    mov     ebx, 1  ;stdout
    mov     eax, 4
    int     0x80  ;write out
    mov     eax, 1
    xor     ebx, ebx
    int     0x80
rstrip:
    dec     eax  ;convert 1-based length to 0-based pointer
.loop:
    cmp     byte [ecx + eax], 0xa
    je      .chop
    cmp     byte [ecx + eax], 0xc
    je      .chop
    cmp     byte [ecx + eax], 0xd
    je      .chop
.done:
    inc     eax  ;convert pointer back to length
    ret
.chop:
    mov     byte [ecx + eax], 0
    dec     eax
    jns     .loop
    jmp     .done
this is a test
this is a testjcomeau@intrepid:/tmp$
于 2012-04-23T04:37:47.170 に答える