linux – 将字符与Intel x86_64程序集进行比较
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 将字符与Intel x86_64程序集进行比较,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1629字,纯文字阅读大概需要3分钟。
内容图文
![linux – 将字符与Intel x86_64程序集进行比较](/upload/InfoBanner/zyjiaocheng/963/d1c35b7ff2b24a3f8ace2a062a1e51c4.jpg)
我是汇编(Intel x86_64)的新手,我正在尝试从C库中重新编写一些函数.我在64位Linux上并使用NASM进行编译.
我的strchr函数有错误,我找不到解决方案……
这里提醒一下strchr手册的摘录:
char *strchr(const char *s, int c);
The strchr() function returns a pointer to the first occurrence of the character c in the string s.
这是我尝试过的:
strchr:
push rpb
mov rbp, rsp
mov r12, rdi ; get first argument
mov r13, rsi ; get second argument
call strchr_loop
strchr_loop:
cmp [r12], r13 ; **DON'T WORK !** check if current character is equal to character given in parameter...
je strchr_end ; go to end
cmp [r12], 0h ; test end of string
je strchr_end ; go to end
inc r12 ; move to next character of the string
jmp strchr_loop ; loop
strchr_end
mov rax, r12 ; set function return
mov rsp, rbp
pop rbp
这会在字符串的ned上返回一个指针,但是找不到字符……
我认为这条线不起作用:
cmp [r12], r13
我测试了它,它工作:
cmp [r12], 97 ; 97 = 'a' in ASCII
这个例子 :
char *s;
s = strchr("blah", 'a');
printf("%s\n", s);
回 :
ah
但我无法通过寄存器比较来实现它.我做错了什么,我该如何解决?
解决方法:
首先,感谢您的帮助!我想我对自己在做什么有了更好的理解.
我遇到了接收8位参数而不是64位rdi的问题…但是朋友告诉我第一个8位参数也在sil寄存器中.
所以这是我的工作代码:
strchr:
push rpb
mov rbp, rsp
call strchr_loop
strchr_loop:
cmp byte [rdi], sil ; check if current character is equal to character given in parameter
je strchr_end ; go to end
cmp byte [rdi], 0h ; test end of string
je strchr_end ; go to end
inc rdi ; move to next character of the string
jmp strchr_loop ; loop
strchr_end
mov rax, rdi ; set function return
mov rsp, rbp
pop rbp
请随时告诉我是否有办法改进它并再次感谢!
内容总结
以上是互联网集市为您收集整理的linux – 将字符与Intel x86_64程序集进行比较全部内容,希望文章能够帮你解决linux – 将字符与Intel x86_64程序集进行比较所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。