Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/10: Рейтинг темы: голосов - 10, средняя оценка - 4.70
ArtfulVampire
3 / 3 / 0
Регистрация: 21.08.2010
Сообщений: 6
1

Assembler (AT&T, 64bit). Вопрос про argv

21.08.2010, 08:40. Просмотров 1757. Ответов 5
Метки нет (Все метки)

Здравствуйте.
Читаю учебник по ассемблеру, пытаюсь запустить вот эту программу.
На моей системе (Ubuntu 10.04) такие значения: sizeof = 144 , offset = 12.
Основной код исправил для 64 бит и размещаю ниже. GCC это дело компилирует, но при запуске выдаёт ошибку сегментирования.

Там где в комментариях знаки вопроса - объясняю к чему: по ссылке приведено размещение данных в стеке, нас интересует параметр argv[1], а каково же его смещение относительно argv[0]? То есть, какова размерность элемента массива argv- двойное слово или четверное(а может быть вообще другая)?

К тому же непонятно, зачем проводятся странные операции с %rsp...
Если найдёте ещё ошибки - буду крайне признателен. спасибо.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
.data
str_usage:
        .string "usage: %s filename\n"
 
printf_format:
        .string "%u\n"
 
.text
.globl main
main:
        pushq %rbp
        movq  %rsp, %rbp
 
        subq  $144, %rsp                 ;/* 144b/4=36q выделить 144 байт под struct stat */
 
        cmpq  $2, 16(%rbp)               ;/* argc == 2? */
        je    args_ok
                                        ;/* программе передали не 2 аргумента, вывести usage */
        movq  24(%rbp), %rbx            ;/* поместить в %rbx адрес массива argv  */
        pushq (%rbx)                    ;/* argv[0] */
        pushq $str_usage
        call  printf
 
        movq  $1, %rax                  ;/* выйти с кодом 1 */
        jmp   return
 
args_ok:
        movq  %rbp, %rbx           ;/* поместить адрес структуры в регистр %rbx */
        pushq %rbx
 
        movq  24(%rbp), %rcx            ;/* поместить в %rcx адрес массива argv */
        pushq 8(%rcx)                   ;/*??? argv[1] — имя файла */
        call  stat
 
        cmpq  $0, %rax                  ;/* stat() вернул 0? */
        je    stat_ok
 
                                        ;/* stat() вернул ошибку, нужно вызвать perror(argv[1]) и завершить программу */
        movq  24(%rbp), %rcx
        pushq 8(%rcx)                   ;/* ?????  */
        call  perror
 
        movq  $1, %rax                  ;/*выйти с кодом 1*/
        jmp   return
 
stat_ok:
        pushq -12(%rbx)                  ;/* нужное нам поле по смещению 12 */
        pushq $printf_format
        call  printf
 
        movq  $0, %rax                  ;/* выйти с кодом 0 */
 
return:
        movq  %rbp, %rsp
        popq  %rbp
        ret
Добавлено через 27 минут
Надо было повнимательнее подумать. аналогия элементарная
sizeof = 8 , offset = 2

C++
1
2
3
4
5
6
7
8
9
10
11
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
 
int main(int argc, const char* argv[])
{
  printf("sizeof = %d , offset = %d\n ",
         (int)sizeof(argv),   (int)((int*)&argv[1] - (int*)&argv[0]) );
return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2010, 08:40
Ответы с готовыми решениями:

pascal & assembler
доброго времени суток! Сделал на асме модуль для умножения двух чисел: data...

Assembler & Delphi (или С)
Такое задание. Запускаю програмку на языке высокого уровня(Delphi или С), ввожу...

низкоуровневый вопрос про с++
Добрый вечер помогите пожалуйста разобраться и понять, если вам не сложно....

Теоретический вопрос про переменные
У меня следующий вопрос. Предположим в тексте программы объявлена переменная в...

Видеопамять, вопрос про физический адрес B800h
Всех приветствую! Интересует одна особенность, на которую не смог найти ответа...

5
ArtfulVampire
3 / 3 / 0
Регистрация: 21.08.2010
Сообщений: 6
23.08.2010, 12:37  [ТС] 2
Тема вновь актуальна.
Программа не работает и всё так же ошибка сегментации.
По такому случаю спрашиваю: существует ли годный учебник по ассемблеру для 64-битной системы с использованием синтаксиса AT&T?
0
turbanoff
Эксперт Java
4019 / 3754 / 742
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 11
Завершенные тесты: 1
23.08.2010, 13:15 3
С учебниками для 64b плохо. Для AT&T я ни одного не встречал.
по поводу программы: дебажить не пробовали? gdb всесилен)
приду вечером домой - посмотрю.
0
ArtfulVampire
3 / 3 / 0
Регистрация: 21.08.2010
Сообщений: 6
23.08.2010, 15:20  [ТС] 4
Уже ковыряюсь с gdb, нашёл пару ошибок, продолжаю наблюдения...
0
turbanoff
Эксперт Java
4019 / 3754 / 742
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 11
Завершенные тесты: 1
23.08.2010, 15:57 5
да кстати GAS (который в GCC) прекрасно понимает intel синтаксис. ключ щас не помню
0
ArtfulVampire
3 / 3 / 0
Регистрация: 21.08.2010
Сообщений: 6
24.08.2010, 19:43  [ТС] 6
Отладчик дал мне понять, что call printf у меня не работает как положено.
Тут (удалено) возникала та же проблема. предположительно "виновата" архитектура AMD64. продолжаю наблюдения
 Комментарий модератора 
Правило форума 3.7. Запрещено публиковать ссылки на другие форумы.
0
24.08.2010, 19:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2010, 19:43

Нубский вопрос про x64 процессоры и ассемблер
Здравствуйте! Подскажите пожалуйста, у меня процессор x64 - core i5 и...

Вопрос про Delphi/C++ & CD-RОM.
Есть острая необходимость в чтении ATIP-информации (Absolute Time In...

Вопрос про Delphi/C++ & CD-ROM.
Есть острая необходимость в чтении ATIP-информации (Absolute Time In...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru