arm 汇编指令小问题MOV指令的

扫二维码下载作业帮
3亿+用户的选择
下载作业帮安装包
扫二维码下载作业帮
3亿+用户的选择
一个汇编的小问题,x ,y ,z ,v 均为16位带符号数,计算 ( v - ( x*y + z – 540 ) ) / xMOV AX,X IMUL Y MOV CX,AXMOV BX,DXMOV AX,ZCWD ADD CX,AXADC BX,DX SUB CX,540 SBB BX,0 MOV AX,VCWD SUB AX,CXSBB DX,BX IDIV X 上述代码中为啥要用CWD,能不能改成这样:MOV AX,X IMUL Y MOV CX,AXMOV BX,DXMOV AX,ZADD CX,AXADC BX,0 SUB CX,540 SBB BX,0 MOV AX,VSUB AX,CXSBB DX,0 IDIV X
作业帮用户
扫二维码下载作业帮
3亿+用户的选择
将16位的“带”符号数 Z 扩展成32位,必须用CWD,才能保证不论 Z 是正是负,都得到正确的结果.你改写的程序,仅在Z是正数的时候结果正确.若 Z 是一个负数,你改写后的程序的运算结果就会出错.
为您推荐:
其他类似问题
扫描下载二维码汇编问题__站长网
当前位置: >
问题:给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围是?答案是(00010H到1000FH)
个人认为如下:
h = 12346h
h = 12346h
h = 12346h
h = 12346h
换算时段地址前面的0全部抛弃。
h = 12346h
h = 03346h
h = 02446h
h = 02356h
请帮下忙,告知一下,在线等......
追问:那为何答案是
00010H—1000FH
呢,那样的话不就超出范围啦,感觉还是不理解
答案:为你正确解答:
h 其中1000h表示段的首地址的前16位地址(后4位 按规定为0000)
2346h为段中有效地址
物理地址=段地址+有效地址=0100h×16+h+h
正确答案是:
h = 12346h
h = 03346h
h = 02446h
h = 02356h
请选择:满意回答
> 疑问解答:
如果你遇到什么编程难题:
请访问www.zzzyk.com 试试温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
一只笨鸟,却有刨根问底的精神
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
代码里会看到如下的指令:mov r1, #0x而我们知道arm指令是4字节长,上面这个指令光立即数就已经4个字节了,所以,汇编器如何把这条汇编语句变成二进制指令的呢?网络上答案很多,如下,不过原文有点小错误,已经高亮纠正原文戳转载Begin:ARM中的MOV指令格式是这样的&&&&&&& op2是占了12位,其中bit11-bit8是移位数(rotate),bit7-0是一个8位的立即数(imm),MOV Rn, op2,执行之后,Rn=op2 && (rotate * 2),这里的移位是循环右移,这就决定了MOV指令不是所有的立即数都能表示的,以下是几个例子:&1、mov&&& r3, #0x虽然0x是一个32位的数,但是可以找到这么一个8位立即数,通过右移得到,看下机器码e3a03456,展开成二进制,对照下格式 & & cond[31:28]=1110[27:26]=00L[25]=1,代表op2是一个立即数OpCode[24:21]=1101S[20]=0Rn[19:16]=0000Rd[15:12]=0011,R3Op2[11:8]=0100,右移4 * 2位Op2[7:0]=,8位立即数,0x56&首先要将0x56扩展成32位的无符号数,0x,然后循环右移8位,就得到了0x2、mov r3, #0x0x是无法通过移位来得到的,这时汇编器会报错,C语言编写的程序,编译器会这样来处理:mov r3, #0xadd r3, r3, #0x14转载End明白了这个,也就可以理解为啥会有下面的写法:#define INT_CTL_BASE 0x4A000000#define oINTMSK
0x08#define oINTSUBMSK
0x1C mov r1, #INT_CTL_BASE mov r2, #0xffffffff str r2, [r1, #oINTMSK] ldr r2, =0x7ff str r2, [r1, #oINTSUBMSK]因为0x4Ax4A00001C不能通过循环右移偶数个位来得到
阅读(2149)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_084070',
blogTitle:'ARM MOV指令详解',
blogAbstract:'看优龙FS0)的bootloader: vivi, 思考摸索了有段时间的问题,代码如何从cpu上的sram中跳到SDRAM中的,从而引发了一连串的问题,此文的目的就是问题之一。代码里会看到如下的指令:mov\tr1, #0x而我们知道arm指令是4字节长,上面这个指令光立即数就已经4个字节了,所以,汇编器如何把这条汇编语句变成二进制指令的呢?网络上答案很多,如下,不过原文有点小错误,已经高亮纠正',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:5,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'一只笨鸟,却有刨根问底的精神',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}汇编小问题【刚入门啦】_百度知道
汇编小问题【刚入门啦】
mov ds例如mov ax,ax
mov ax,[0]我想知道现在的AX是多少,这个[0]偏移地址到底是什么计算的?[0]是什么意思?[1]
我有更好的答案
偏移地址为0,如果系统是32位机,存储管理模式有很多种,从前两行看出DS中是1000H,如果是实地址方式,就是=10000h。还有就是系统管理模式,DS不能直接赋值,用AX做为桥梁,最后一句是把偏移地址为0的内存中的值赋给AX。反正有段基地址,【0】的意思:取偏移地址为0的内存中的数值[1],[2]也是同样的意思接下来就是内存地址如何确定,段基地址为1000H,虚拟8086模式,保护方式,不同的方式计算不同DS中存放的是数据段段基地址
采纳率:33%
在你的例子中,引用的段寄存器为DS,至于是哪个段的偏移,也就是10000h中的数据,则需要根据引用的段寄存器来确定,而0、1、2都表示DS的段偏移,所以AX的值在物理地址为1000h * 10h + 0的内存单元中“[ ]”内的数据为偏移地址
我在用Masm32和Linker汇编连接下面的程序的时候出现了一些问题代码如下 sseg dseg segment mess db
代码段:偏移为0的一个字的内容[0] [1][2] 是偏移量
应该是叫段寄存器吧,每一段有个基地址,你不用去管它,[1]就是在这个基地址上加1得到的地址
dseg segment mess db 'HELLO',0dh,0ah,'$' dseg ends cseg segment assume cs:cseg,ds:dseg start : mov ax,dseg mov ds,ax mov dx,offset mess mov ah,9 int 21h ;加两条指令,按任意键后继续MOV AH,1INT 21Hmov ah,4ch int 21h cseg ends end start
其他4条回答
为您推荐:
其他类似问题
汇编的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。从ARM汇编指令机器码解释一些问题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
从ARM汇编指令机器码解释一些问题
&&为什么MOV R0, #0x这条指令无法编译,而MOV R0, #0x678却可以编译通过?
为什么芯片会有立即数寻址,寄存器寻址,间接寻址等多种寻址方式?一种寻址方式不可以么?
为什么B跳转指令只能跳转到±32MBytes的范围内?
在这里,将从ARM汇编指令机器码解释这些问题
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩1页未读,
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 arm 汇编指令 的文章

 

随机推荐