-1

このアセンブリ プログラムがあり、このプログラムの対角線出力が必要ですが、アセンブリにタブスペースを配置する方法がわかりません。

section    .text
    global _start         ;must be declared for using gcc

_start:                 ;tell linker entry point

    mov edx, len        ;message length
    mov ecx, msg        ;message to write
    mov ebx, 1          ;file descriptor (stdout)
    mov eax, 4          ;system call number (sys_write)
    int 0x80            ;call kernel

    mov eax, 1          ;system call number (sys_exit)
    int 0x80            ;call kernel

section .data

msg db  'Y',10,'O',10,'U',10,'S',10,'U',10,'F'  ;our dear string
len equ $ - msg         ;length of our dear string

私のプログラムの出力は次のとおりです。

Y
O 
U 
S
U 
F

出力は次のようになります。

Y
  O
    U
      S
        U
          F

このプログラムを作成してこの出力を取得する他の方法はありますか?

4

3 に答える 3

3

これを行う他の方法はありますか

もちろんあります!好きなようにできる!Windows を使用しているが、Linux 割り込みを使用していると言うので、このコードは OS ニュートラルです (つまり、Windows または Linux で動作します)。

extern exit, printf, malloc, free
global main

section .data
szText      db  "Gunner Diagonally!!"
Text_Len    equ $ - szText
fmtstr      db  "%s", 10, 0

section .text
main:

    push    Text_Len
    push    szText
    call    PrintDiagonal

    call    exit

;~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~ PrintDiagonal - Prints text to terminal diagonally
;~ In: esp + 4 = address of text to print
;~     esp + 8 = length of string to print 
;~ Returns - Nothing
;~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PrintDiagonal:
%define Text_ dword [ebp + 8]
%define TextLen_ dword [ebp + 12]
%define _Buffer dword [ebp - 4]
%define _SpaceCount dword [ebp - 8]
%define _CurLine dword [ebp - 12]

    push    ebp
    mov     ebp, esp
    sub     esp, 4 * 3

    mov     eax, TextLen_
    add     eax, eax
    push    eax
    call    malloc
    add     esp, 4 * 1
    mov     _Buffer, eax

    mov     _SpaceCount, 1
    mov     _CurLine, 1

    mov     esi, Text_ 
.NextLine:    
    mov     edi, _Buffer
    mov     edx, _SpaceCount
    dec     edx
    jz      .SpaceDone

.SpaceStart:
    mov     ecx, _SpaceCount
    dec     ecx
.FillSpaces:
    mov     byte [edi], 32
    inc     edi
    dec     ecx
    jnz     .FillSpaces

.SpaceDone:    
    mov     al, byte [esi]
    mov     byte [edi], al
    mov     byte [edi + 1], 0
    push    _Buffer
    push    fmtstr
    call    printf
    add     esp, 4 * 2

    inc     esi
    add     _SpaceCount, 2
    mov     edx, TextLen_ 
    inc     _CurLine
    cmp     _CurLine, edx
    jng     .NextLine

    push    _Buffer
    call    free
    add     esp, 4 * 1

    leave
    ret     4 * 2

エラーチェックはありません。もちろん、独自のものを追加します。

Win Diag Linux診断

文字列を取得し、正しいスペースをループに追加してから出力します。

于 2013-10-25T00:51:01.110 に答える