win32汇编 代码语言代码错误

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID空间积分0 积分30阅读权限10帖子精华可用积分64 信誉积分95 专家积分0 在线时间46 小时注册时间最后登录
白手起家, 积分 30, 距离下一级还需 170 积分
帖子主题精华可用积分64 信誉积分95 专家积分0 在线时间46 小时注册时间最后登录
论坛徽章:1
这是一个简单的输出“hello world”的汇编程序
Linux www 2.6.32-431.11.2.el6.x86_64 #1 SMP Tue Mar 25 19:59:55 UTC
x86_64 x86_64 GNU/Linux.code32
.section .data
& & output:
& && &&&.asciz &hello world.\n&
.section .text
.globl main
main:
& & nop
& & pushl $output
& & call printf
& & popl %eax
& & pushl $0
& & call exit复制代码编译链接都问题。运行时出现Segmentation fault错误
调试发现错误在调用printff时,收到了SIGSEGV(无效内存引用)的信号
请问这是什么原因呢?
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分168阅读权限10帖子精华可用积分168 信誉积分704 专家积分0 在线时间434 小时注册时间最后登录
白手起家, 积分 168, 距离下一级还需 32 积分
帖子主题精华可用积分168 信誉积分704 专家积分0 在线时间434 小时注册时间最后登录
论坛徽章:1
本帖最后由 daxiguagg 于
17:48 编辑
GCC反汇编一个普通程序来看,仿佛传递参数不是用push.
调用无参数的函数,没出错。
& && && && &&NOP\n\t&
& && && && &&call getpid\n\t&
& && && && &&movl %eax,%ebx\n\t&
& && && && &&NOP\n\t&
UID空间积分0 积分30阅读权限10帖子精华可用积分64 信誉积分95 专家积分0 在线时间46 小时注册时间最后登录
白手起家, 积分 30, 距离下一级还需 170 积分
帖子主题精华可用积分64 信誉积分95 专家积分0 在线时间46 小时注册时间最后登录
论坛徽章:1
本帖最后由 Gnixfeng 于
16:22 编辑
但是我的有参数啊,printf需要参数。结束调用的exit也没有问题。
只能说明不是调用出错,而是pushl出错
UID空间积分0 积分168阅读权限10帖子精华可用积分168 信誉积分704 专家积分0 在线时间434 小时注册时间最后登录
白手起家, 积分 168, 距离下一级还需 32 积分
帖子主题精华可用积分168 信誉积分704 专家积分0 在线时间434 小时注册时间最后登录
论坛徽章:1
本帖最后由 daxiguagg 于
17:54 编辑
pushl $output
这里错了,这里是要$output的地址,查查看呢,对ATT汇编不熟
UID空间积分0 积分30阅读权限10帖子精华可用积分64 信誉积分95 专家积分0 在线时间46 小时注册时间最后登录
白手起家, 积分 30, 距离下一级还需 170 积分
帖子主题精华可用积分64 信誉积分95 专家积分0 在线时间46 小时注册时间最后登录
论坛徽章:1
& & push的格式只有pushx source 没有 pushx source destination的格式etc
UID空间积分0 积分168阅读权限10帖子精华可用积分168 信誉积分704 专家积分0 在线时间434 小时注册时间最后登录
白手起家, 积分 168, 距离下一级还需 32 积分
帖子主题精华可用积分168 信誉积分704 专家积分0 在线时间434 小时注册时间最后登录
论坛徽章:1
本帖最后由 daxiguagg 于
17:46 编辑
& & asm&&
& & (&&
& && && && &&movl $0x000a7373,%eax\n\t&
& && && && &&movl %eax,0x14(%esp)\n\t&
& && && && &&lea 0x14(%esp),%edx\n\t&
& && && && &&mov %edx,(%esp)\n\t&
& && && && &&call printf\n\t&
& && && && &&NOP\n\t&
& & );
相当于printf(&ss\n&);
你把你程序改成
main:
movl $0x000a7373,%eax
movl %eax,0x14(%esp)
lea 0x14(%esp),%edx
mov %edx,(%esp)
call printf
NOP
UID空间积分0 积分30阅读权限10帖子精华可用积分64 信誉积分95 专家积分0 在线时间46 小时注册时间最后登录
白手起家, 积分 30, 距离下一级还需 170 积分
帖子主题精华可用积分64 信誉积分95 专家积分0 在线时间46 小时注册时间最后登录
论坛徽章:1
但是我目的是为什么push会出现这个问题啊,而不仅仅是得到输出的结果
UID空间积分0 积分30阅读权限10帖子精华可用积分64 信誉积分95 专家积分0 在线时间46 小时注册时间最后登录
白手起家, 积分 30, 距离下一级还需 170 积分
帖子主题精华可用积分64 信誉积分95 专家积分0 在线时间46 小时注册时间最后登录
论坛徽章:1
daxiguagg 发表于
pushl $output
这里错了,这里是要$output的地址,查查看呢,对ATT汇编不熟
$符号后接数据值在AT&T语法格式中是取数据的内存位置,也就想当与C语言的&符号把
UID空间积分0 积分168阅读权限10帖子精华可用积分168 信誉积分704 专家积分0 在线时间434 小时注册时间最后登录
白手起家, 积分 168, 距离下一级还需 32 积分
帖子主题精华可用积分168 信誉积分704 专家积分0 在线时间434 小时注册时间最后登录
论坛徽章:1
前面的代码我是在C内联汇编里试的。
试试下面这个呢
hello.s.data
output:.ascii &hello world\n&
.text
.globl _start
_start:
& & movl $4,%eax
& & movl $1,%ebx
& & movl $output,%ecx
& & movl $12,%edx
& & int $0x80
& & movl $1,%eax
& & int $0x80复制代码as -o hello.o hello.s
ld hello.o -o hello
UID空间积分0 积分30阅读权限10帖子精华可用积分64 信誉积分95 专家积分0 在线时间46 小时注册时间最后登录
白手起家, 积分 30, 距离下一级还需 170 积分
帖子主题精华可用积分64 信誉积分95 专家积分0 在线时间46 小时注册时间最后登录
论坛徽章:1
这种方法我早前已经试过了,是没有问题的。我的目的并不是的到hello world的输出结果,而是为什么这里push和call会出错?
我想顺便问下如何输出数字呢?也和上面的方法一样吗汇编语言程序设计提问指出下列指令错误的原因。(1)MOV
DS,2000H (5)ADD
AX,[DX+SI] (8)MOV
[BX],[SI+250H]
[BX+SI},05H
豹纹小姐爱薛43
1.ax和bl类型(长度)不同2.cs不能作为目的操作数3. inc的操作数应是一个寄存器或内存单元,执行结果是将其内容加14.不能直接把立即数传送到段寄存器中,可以改为 mov ax,2000H
mov dx,ax5.add的源操作数不能是段寄存器,只能是通用寄存器、立即数或存储器6.寄存器间接寻址的寄存器只能使用BX、BP(基址) 和SI、 DI(变址),即不能不能把cx的内容作为偏移量来寻址7.基址只能存放在BX或BP中,[DX+SI]错误地把DX 用于存放基址8.mov指令不能在两个内存单元之间传送数据9.在系统中,当移位次数大于1时,一定要先将移位次数存放到CL(不能是其他寄存器)中,即应改为: MOV CL,2
(但在80286以上的系统中这种限制已取消)10.目的操作数和源操作数类型不同,即系统不能区分05H 还是0005H
为您推荐:
扫描下载二维码win7_x64上cygwin
nasm语法汇编程序编译通过,运行报错,帮忙看看。 - 开源中国社区
当前访客身份:游客 [
当前位置:
系统是win7 64位。
nasm代码:
执行命令:
ld -m i386pe -e _start test.obj 也不好使,不知道咋回事儿了,求大侠帮忙看看~~~~
ps:linux上可以
共有5个答案
<span class="a_vote_num" id="a_vote_num_
是不是 mov edx,len的原因?len表示的是地址,应该是[len]才是长度吧。
<span class="a_vote_num" id="a_vote_num_
引用来自“优游幻世”的评论是不是 mov edx,len的原因?len表示的是地址,应该是[len]才是长度吧。
应该不是,在linux上执行可以成功的呀。
<span class="a_vote_num" id="a_vote_num_
win下这些系统调用可用吗
<span class="a_vote_num" id="a_vote_num_
引用来自“优游幻世”的评论是不是 mov edx,len的原因?len表示的是地址,应该是[len]才是长度吧。
引用来自“于小懒”的评论应该不是,在linux上执行可以成功的呀。看到这个/questions/2489889/system-calls-in-windows-native-api说windows上的系统调用号是可能变的,所以在windows上不要用系统调用,用windows api。
<span class="a_vote_num" id="a_vote_num_
cygwin提供的只是源码层的兼容吧,你需要把代码放到cygiwn下编译。但是你的汇编代码要求系统在ABI上兼容,这个cygwin是没办法的。
更多开发者职位上
有什么技术问题吗?
于小懒的其它问题
类似的话题君,已阅读到文档的结尾了呢~~
汇编语言常见错误信息解释
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
汇编语言常见错误信息解释
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口以下试题来自:
单项选择题下列有关汇编语言中标号的命名规则中,错误的是()
A.通常由字母打头的字符、数字串组成
B.标号长度不能超过31个字符
C.?和$不能单独作为标号
D..号不可位于标号首
为您推荐的考试题库
您可能感兴趣的试卷
你可能感兴趣的试题

我要回帖

更多关于 汇编语言代码 的文章

 

随机推荐