在汇编中比较字符串而不调用函数?
Compare string without calling function in assembly?
假设我有两个字符串,我想比较字符串但不想为 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 调用函数。那么,到底有没有达到我的预期呢?
正如@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 [=11=]x1,%eax
0x0000000000001135 <+5>: movabs [=11=]x203e7475706e49,%rsi
0x000000000000113f <+15>: push %rsi
0x0000000000001140 <+16>: mov %rsp,%rsi
0x0000000000001143 <+19>: mov [=11=]x7,%edx
0x0000000000001148 <+24>: syscall
0x000000000000114a <+26>: mov [=11=]x0,%eax
0x000000000000114f <+31>: mov [=11=]x0,%edi
0x0000000000001154 <+36>: mov %rsp,%rsi
0x0000000000001157 <+39>: mov [=11=]x100,%edx
0x000000000000115c <+44>: syscall
0x000000000000115e <+46>: mov [=11=]x1,%eax
0x0000000000001163 <+51>: mov %rsp,%rsi
0x0000000000001166 <+54>: xor %rdx,%rdx
0x0000000000001169 <+57>: cmpb [=11=]xa,(%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 [=11=]x3c,%eax
0x0000000000001182 <+82>: syscall
0x0000000000001184 <+84>: nopw %cs:0x0(%rax,%rax,1)
0x000000000000118e <+94>: xchg %ax,%ax
所以没有更多的功能:)谢谢@fuz
假设我有两个字符串,我想比较字符串但不想为 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 调用函数。那么,到底有没有达到我的预期呢?
正如@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 [=11=]x1,%eax
0x0000000000001135 <+5>: movabs [=11=]x203e7475706e49,%rsi
0x000000000000113f <+15>: push %rsi
0x0000000000001140 <+16>: mov %rsp,%rsi
0x0000000000001143 <+19>: mov [=11=]x7,%edx
0x0000000000001148 <+24>: syscall
0x000000000000114a <+26>: mov [=11=]x0,%eax
0x000000000000114f <+31>: mov [=11=]x0,%edi
0x0000000000001154 <+36>: mov %rsp,%rsi
0x0000000000001157 <+39>: mov [=11=]x100,%edx
0x000000000000115c <+44>: syscall
0x000000000000115e <+46>: mov [=11=]x1,%eax
0x0000000000001163 <+51>: mov %rsp,%rsi
0x0000000000001166 <+54>: xor %rdx,%rdx
0x0000000000001169 <+57>: cmpb [=11=]xa,(%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 [=11=]x3c,%eax
0x0000000000001182 <+82>: syscall
0x0000000000001184 <+84>: nopw %cs:0x0(%rax,%rax,1)
0x000000000000118e <+94>: xchg %ax,%ax
所以没有更多的功能:)谢谢@fuz