x86-64 порядок сборки операндов

Хотя я думаю, что ответ Брайана проще и полностью решает проблему, вы можете решить проблему «clickability» с привязками (у меня не было второй проблемы, поэтому мой ответ не обратился к ней).

Идея состоит в том, чтобы связать щелчки мыши по кадрам, чтобы вызвать щелчок по кнопке и восстановить обычное поведение кнопки. В моем примере ниже я привязал оба <ButtonPress-1> и <ButtonRelease-1>, чтобы увидеть эффекты эффекта кнопки. Я также связал <Enter> и <Leave>, чтобы реализовать изменение цвета кнопки, когда мышь над ним.

from Tkinter import *
master = Tk()
buttons = {}

def press(clicked):
    print clicked

def frame_enter(redframe, blueframe):
    redframe.configure(background='coral1')
    blueframe.configure(background='royalblue1')

def frame_leave(redframe, blueframe):
    redframe.configure(background='red')
    blueframe.configure(background='blue')

def on_press(event, button):
    button.event_generate('<ButtonPress-1>', x=event.x, y=event.y)

def on_release(event, button):
    button.event_generate('<ButtonRelease-1>', x=event.x, y=event.y)

for i in range(1,7):
    button_name = 'button '+str(i)
    buttons[i] = Button(master, text=button_name, command=lambda method=button_name:press(method))
    buttons[i].grid(row=0, column=i-1, padx=15)
    buttons[i].update()

    tot_x = buttons[i].winfo_width()
    tot_y = buttons[i].winfo_height()

    redframe = Frame(buttons[i], width=tot_x/6, background='red')
    blueframe = Frame(buttons[i], width=tot_x/6*5, background='blue')

    redframe.place(x=0, y=0, relheight=1)
    blueframe.place(relx=1./6, y=0, relheight=1)
    redframe.bind('<ButtonPress-1>', lambda e, b=buttons[i]: on_press(e, b)) 
    blueframe.bind('<ButtonPress-1>', lambda e, b=buttons[i]: on_press(e, b)) 
    redframe.bind('<ButtonRelease-1>', lambda e, b=buttons[i]: on_release(e, b)) 
    blueframe.bind('<ButtonRelease-1>', lambda e, b=buttons[i]: on_release(e, b)) 
    redframe.bind('<Enter>', lambda e, rf=redframe, bf=blueframe: frame_enter(rf, bf)) 
    blueframe.bind('<Enter>', lambda e, rf=redframe, bf=blueframe: frame_enter(rf, bf)) 
    redframe.bind('<Leave>', lambda e, rf=redframe, bf=blueframe: frame_leave(rf, bf)) 
    blueframe.bind('<Leave>', lambda e, rf=redframe, bf=blueframe: frame_leave(rf, bf)) 

master.mainloop()

Изменить: держать кнопки не нужно, их можно заменить кадрами. Таким образом, не нужно использовать place, цветные кадры можно просто упаковать внутри:

from Tkinter import *
master = Tk()
buttons = {}

def press(clicked):
    print clicked

def frame_enter(redframe, blueframe):
    redframe.configure(background='coral1')
    blueframe.configure(background='royalblue1')

def frame_leave(redframe, blueframe):
    redframe.configure(background='red')
    blueframe.configure(background='blue')

def on_press(event, widget):
    widget.configure(relief='sunken')  # mimic button's relief effect on click 

def on_release(event, widget, text):
    widget.configure(relief='raised')  # mimic button's relief effect on click 
    press(text)

for i in range(1,7):
    button_name = 'button '+ str(i)
    buttons[i] = Frame(master, relief='raised', width=78, height=24, bd=2)
    buttons[i].grid(row=0, column=i-1, padx=15)
    buttons[i].update_idletasks()

    tot_x = buttons[i].winfo_width()
    tot_y = buttons[i].winfo_height()

    redframe = Frame(buttons[i], width=tot_x/6, height=tot_y, background='red')
    blueframe = Frame(buttons[i], width=tot_x/6*5, height=tot_y, background='blue')

    redframe.pack(side='left')
    blueframe.pack(side='left')
    redframe.bind('<ButtonPress-1>', lambda e, b=buttons[i]: on_press(e, b)) 
    blueframe.bind('<ButtonPress-1>', lambda e, b=buttons[i]: on_press(e, b)) 
    redframe.bind('<ButtonRelease-1>', lambda e, b=buttons[i], t=button_name: on_release(e, b, t)) 
    blueframe.bind('<ButtonRelease-1>', lambda e, b=buttons[i], t=button_name: on_release(e, b, t)) 
    redframe.bind('<Enter>', lambda e, rf=redframe, bf=blueframe: frame_enter(rf, bf)) 
    blueframe.bind('<Enter>', lambda e, rf=redframe, bf=blueframe: frame_enter(rf, bf)) 
    redframe.bind('<Leave>', lambda e, rf=redframe, bf=blueframe: frame_leave(rf, bf)) 
    blueframe.bind('<Leave>', lambda e, rf=redframe, bf=blueframe: frame_leave(rf, bf)) 
1
задан Peter Cordes 19 January 2019 в 08:26
поделиться

1 ответ

Это зависит от синтаксиса ассемблера. В основном у нас есть два варианта: Intel и AT & T синтаксис.

Существует несколько разновидностей синтаксиса Intel, основными из которых являются NASM (mov dword [symbol_name], 1) и MASM (включая режим GAS .intel_syntax noprefix, который могут использовать многие инструменты GNU и Unix.) См. https: // stackoverflow. com / tags / intel-syntax / info для получения подробной информации о различиях и их различения.

Пример синтаксиса Intel (из разборки objdump, так что это GNU .intel_syntax, с добавлением пары примеров):

push   rbp         # comment character can be # (GAS) or ; MASM/NASM
mov    rbp,rsp
mov    DWORD PTR [rbp-0x4],edi
mov    DWORD PTR [rbp-0x8],esi
mov    edx,DWORD PTR [rbp-0x4]
mov    eax,DWORD PTR [rbp-0x8]
add    eax,edx
pop    rbp
ret

add    dword ptr [rdi], 1    # size specifier mandatory if neither operand is a reg
imul   ecx, [rdi + rax*4 + 20], 12345

Существует только один вариант синтаксиса AT & amp; T ( https : //stackoverflow.com/tags/att/info ):

push   %rbp                 # comment character is always #
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    -0x4(%rbp),%edx
mov    -0x8(%rbp),%eax
add    %edx,%eax
pop    %rbp
retq

addl  $1, (%rdi)      # size suffix b/w/l/q used to indicate operand-size if neither operand is a register

# with more than 2 operands, reverse the whole list
imul   $12345, 20(%rdi, %rax, 4), %ecx 

Синтаксис AT & T является родным для систем Unix. Обычно декомпиляторы имеют флаги для управления типом синтаксиса вывода. Например, objdump имеет флаг -Mintel, у GDB есть опция set disassembly-flavor intel.

Кроме того, взгляните на этот полезный сайт, на котором вы можете быстро увидеть вывод ассемблера без шума. Проводник компилятора


Обратите внимание, что синтаксис AT & amp; T имеет ошибку проектирования для x87 некоммутативные инструкции FP, такие как fsub и fsubr с операндами регистра: см. руководство: https://sourceware.org/binutils/docs/as/i386_002dBugs.html

0
ответ дан Peter Cordes 19 January 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: