装配程序的对角输出

时间:2013-10-24 07:36:40

标签: windows assembly x86

我有这个汇编程序,我想要这个程序的对角输出,但我不知道如何将tabspace放在汇编中。

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

有没有其他方法可以编写此程序并获得此输出?

3 个答案:

答案 0 :(得分:3)

您可以加入msg

msg db  'Y',10,9,'O',10,9,9,'U',10,9,9,9,'S',10,9,9,9,9,'U',10,9,9,9,9,9,'F'  ;our dear string

9是标签的ascii。

ascii char table

答案 1 :(得分:3)

  

还有另外一种方法吗

当然有!无论如何你都可以做到你想要的!由于您说您使用的是Windows,但正在使用Linux中断,因此该代码为OS Neutral(意味着它可以在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 Diag

我们取字符串并在循环中添加正确的空格然后打印。

答案 2 :(得分:0)

只有Windows(因为DOS遗留)已经分离了CR(回车),它将滑架移动到X位置0,而LF(换行)则向下移动一行而不改变滑架X的位置。

在Linux中只使用LF并且它同时执行这两项操作:向下移动滑架并向左移动到0.

为了在Linux中拥有相同的对角线输出,你应该作弊:

; replace dots with spaces.
msg db  'Y',10,'.O',10,'..U',10,'...S',10,'....U',10,'.....F'