2013-10-24 2 views
-1

У меня есть эта программа сборки, и я хочу получить диагональный выход этой программы, но я не знаю, как разместить 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 

Есть ли другой способ, чтобы написать эту программу и получить этот вывод?

+0

Вы выводите это в windows или linux console? – RedX

+0

im вывод в windows – Engineer

+0

Um, 'int 80' не будет работать в Windows !!! Только под Linux! – Gunner

ответ

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 Diag

Мы берем строку и добавить правильные пробелы в цикле затем распечатать.

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

+0

, но его не работает – Engineer

+0

@YousufUmar Что именно вы подразумеваете под «нерабочим»? Ошибка? Вывод не соответствует? – RedX

+0

с помощью 9 asscii его не помещает вкладку space infact, в моем коде не меняется, если я помещаю ваш код в мой – Engineer

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' 
Смежные вопросы