Я пытаюсь узнать о строках в сборке x86 32bit, но недавно переключился с yasm на gas и попытался перевести исходный файл. Кстати, я использовал код xorpd, который вы можете увидеть здесь Я видел некоторый синтаксис AT & T и япопытался перевести включающий файл , но я не смог перевести его, я не знаю, где проблема, и если кто-то может сказать мне, где проблема в моем коде.
строк.s
.include 'fn.s'
.extern exit
ARRLEN = 5 /* equivalent to .set ARRLEN, 0x5 */
.data /* data section equivalent to .section .data */
saar: .long 3,5,8 /* array of 32bit integers */
daar: .fill ARRLEN, 4, 0 /* array of 32bit integers 4 bytes is size it's in format of
.fill repeat, size, value
i used it to intialize the array ARRLEN times with value 0*/
.text /* text section equivalent to .section .text */
.globl _start /* for ld compatibility reasons. equivalent to .global main */
_start:
movl ARRLEN, %ecx
movl $saar, %esi
xor %eax, %eax
_par:
call read_hex
stosl
loop _par
push $0
call exit
fn.s
.data
hex_new: .asciz "%x\n"
hex_: .asciz "%x"
dec_: .asciz "%d"
dec_new: .asciz "%d\n"
str_: .asciz "%s"
new_: .asciz "\n"
delim: .asciz "========\n"
.text
print_eax:
pushal
push %eax
push $hex_new
call printf
add $8, %esp
popal
ret
print_eax_dec:
pushal
push %eax
push $dec_new
call printf
add $8, %esp
popal
ret
print_delimiter:
pushal
mov $delim, %eax
push %eax
call printf
add $4, %esp
popal
ret
read_line:
pushal
push %ecx
push %edi
push $0
call read
add $12, %esp
xor %edx, %edx
movb $0, (%edi,%eax)
popal
ret
read_hex:
push %ebp
mov %esp, %ebp
sub $4, %esp
push %ebx
push %ecx
push %edx
lea -4(%ebp),%ebx
push %ebx
push $hex_
call scanf
add $8, %esp
movl (%ebx), %eax
pop %edx
pop %ecx
pop %ebx
leave
ret
read_dec:
push %ebp
movl %esp, %ebp
subl $4, %esp
lea -4(%ebp),%ebx
pusha
push %ebx
push $dec_
call scanf
add $8, %esp
popa
movl (%ebx), %eax
leave
ret
print_str:
pushal
push %esi
call printf
add $4, %esp
popal
ret
print_eax_binary:
pushal
movl $32, %ecx /* We print 32 digits. */
.print_digit:
rol $1, %eax
mov %eax,%edx
and $1, %edx
push %ecx
push %eax
push %edx
push $hex_
call printf
add $8, %esp
pop %eax
pop %ecx
loop .print_digit
push $new_
call printf
add $4, %esp
popal
ret
Сбой компилятора.
$ gcc-9 -m32 strings.s -o strings
strings.s: Assembler messages:
strings.s:1: Error: missing string