我有这个汇编程序,我想要这个程序的对角输出,但我不知道如何将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 :(得分: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。
答案 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
没有错误检查,当然你会自己添加。
我们取字符串并在循环中添加正确的空格然后打印。
答案 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'