Сравнить строку без вызова функции в сборке? - PullRequest
0 голосов
/ 18 февраля 2020

Скажем, у меня есть две строки, я хочу сравнить строку, но не хочу вызывать другую функцию для true или false:

mov rsi, 0x4141414141414141
mov rdi, 0x6161616161616161
cmp rsi, rdi
// if true do here
// otherwise do here
// jmp back_up_to_cmp rsi, rdi

Проблема в том, что я не может вызвать функцию для true или false. Итак, есть ли способ оправдать мои ожидания?

1 Ответ

1 голос
/ 18 февраля 2020

Как указал @fuz, я мог использовать относительный переход для достижения желаемого:

рабочий полный код:

SECTION .text
global main

main:
mov rax, 1
mov rsi, 0x203e7475706e49
push rsi
mov rsi, rsp
mov rdx, 7
syscall

mov rax, 0
mov rdi, 0
mov rsi, rsp
mov rdx, 256
syscall

mov rax, 1
mov rsi, rsp

xor rdx, rdx
cmp byte [rsi + rdx], 0x0a
jz 0xc
inc rdx
jmp -0xe

syscall

mov rax, 60
syscall

Я посмотрел на место, в котором мой cmp находился по адресу, рассчитал разницу и использовал jmp для перехода к этому месту:

0x0000000000001130 <+0>:     mov    $0x1,%eax
0x0000000000001135 <+5>:     movabs $0x203e7475706e49,%rsi
0x000000000000113f <+15>:    push   %rsi
0x0000000000001140 <+16>:    mov    %rsp,%rsi
0x0000000000001143 <+19>:    mov    $0x7,%edx
0x0000000000001148 <+24>:    syscall 
0x000000000000114a <+26>:    mov    $0x0,%eax
0x000000000000114f <+31>:    mov    $0x0,%edi
0x0000000000001154 <+36>:    mov    %rsp,%rsi
0x0000000000001157 <+39>:    mov    $0x100,%edx
0x000000000000115c <+44>:    syscall 
0x000000000000115e <+46>:    mov    $0x1,%eax
0x0000000000001163 <+51>:    mov    %rsp,%rsi
0x0000000000001166 <+54>:    xor    %rdx,%rdx
0x0000000000001169 <+57>:    cmpb   $0xa,(%rsi,%rdx,1)
0x000000000000116d <+61>:    je     0x117b <main+75>
0x0000000000001173 <+67>:    inc    %rdx
0x0000000000001176 <+70>:    jmpq   0x1169 <main+57>
0x000000000000117b <+75>:    syscall 
0x000000000000117d <+77>:    mov    $0x3c,%eax
0x0000000000001182 <+82>:    syscall 
0x0000000000001184 <+84>:    nopw   %cs:0x0(%rax,%rax,1)
0x000000000000118e <+94>:    xchg   %ax,%ax

Так что больше никаких функций :) Спасибо @ fuz

...