Портирование кода yasm (стиль Intel) на газ (стиль AT & T) - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь узнать о строках в сборке 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

1 Ответ

1 голос
/ 25 мая 2019

Проблема в первой строке. GAS требует, чтобы все строки (включая имена файлов) заключались в двойные кавычки.

.include "fn.s" не 'fn.s' одинарные кавычки.


GAS не принимает многосимвольные литералы, такие как 'abc', в качестве числовых литералов, либо , как YASM и NASM. Фактически, он полностью нарушает синтаксический анализ и печатает бессмысленные сообщения об ошибках.

.string 'abcd'

.include 'fn.s'


mov $'a', %eax
mov $'ab', %ax
.long 'abc'
strings.s: Assembler messages:
strings.s: Warning: end of file not at end of a line; newline inserted
strings.s:1: Error: junk at end of line, first unrecognized character is `9'
strings.s:2: Error: missing string
strings.s:5: Error: backward ref to unknown label "97:"
strings.s:5: Error: junk `44%ax' after expression
strings.s:5: Error: number of operands mismatch for `mov'
strings.s:6: Error: backward ref to unknown label "97:"
strings.s:6: Error: junk at end of line, first unrecognized character is `c'

Обратите внимание, что строка 5 пуста, а файл заканчивается новой строкой (но в конце строки, содержащей одну кавычку.)


Односимвольные литералы работают как целые числа, например add $'0', %eax или .long 'b'.

или в .intel_syntax noprefix, как add eax, '0'


Вы, вероятно, должны использовать .intel_syntax noprefix

В основном просто введите OFFSET в mov reg, symbol (делая его mov reg, OFFSET symbol), чтобы получить кодировку mov-немедленного, и перенести директивы. Гораздо проще и менее подвержено ошибкам, чем ручное изменение всего на синтаксис AT & T.

...