c语言绝对值排序中怎么改变寄存器CS的值

关于MOV指令的改错_百度知道
关于MOV指令的改错
马上要考试了,紧急!1. MOV 3, SI2. MOV CH, 1234H3. MOV [BX], 33H4. MOV AX, CL5. MOV AL, [BX]6. MOV X, [100H]7. MOV [100H], [DI]8. MOV DS, 1000H9. MOV CS, AX10. MOV [AX], BX
第8题是立即数不能赋给段寄存器,第十题为什么不对啊?
提问者采纳
1. MOV 3, SI 8086的指令格式是先写目标操作数,然后是源操作数2. MOV CH, 1234H ch是8位的,不可以传送16位3. MOV [BX], 33H BX是可以做寄存器相对寻址的,但是内存单元是16位的,并不是8位。4. MOV AX, CL 目标和源的位数不符5. MOV AL, [BX] 同3,因为对内存单元的访问都是16位的6. MOV X, [100H] X不是寄存器7. MOV [100H], [DI] 8086不支持源操作数和目的操作数同时访问内存。8. MOV DS, 1000H 段寄存器不能给立即数9. MOV CS, AX 伐恭崔枷诏磺措委胆莲代码段寄存器不能被赋值10. MOV [AX], BX寄存器相对寻址必须用BX或者BP作为基址寄存器当你遇到这种问题的时候,可以用运行debug,然后调用A命令,把这些指令输入进去,看到底哪里是不允许的。有些书给的答案也不一定对。
其他类似问题
mov的相关知识
其他4条回答
1.MOV SI,32.MOV CX,1234H3.MOV BYTE PTR [BX],33H4.MOV AL,CL5.MOV AL,BYTE PTR [BX]6.不知道 7.不知道8.//伐恭崔枷诏磺措委胆莲/...9.不知10.MOV AX,[BX][]内部能出现ax,只能有,bx,si,di,我也是刚学。。对寻址还很不熟悉。。。
1. MOV 3, SI
目标操作数不能是立即数2. MOV CH, 1234H
类型不匹配3. MOV [BX], 33H 4. MOV AX, CL
类型不匹配5. MOV AL, [BX] 6. MOV X, [100H]
内存单元间不能直接传递数据7. MOV [100H], [DI]
内存单元间不能直接传递数据8. MOV DS, 1000H
不能传递立即数给段寄存器9. MOV CS, AX 10. MOV [AX], BX
AX不能用于寻址
正确答案:1. MOV 3, SI
目的操作数不能采用立即寻址方式
可改为:MOV SI,32. MOV CH, 1234H
源操作数的值超出了目的操作数的表数范围
可改为:MOV CX,1234H3. MOV [BX], 33H
无法确定欲传送数据的长度,或者操作数长度不确定
可改为:MOV
BYTE PTR [BX],33H4. MOV AX, CL 错误
两个操作数的长度不等长
改为:MOV AX,CX5. MOV AL, [BX] 正确6. MOV X, [100H] 错误
操作数不能都为内存操作数,应借助寄存器中转7. MOV [100H], [DI] 错误
原因同第6题8. MOV DS, 1000H
不可以将立即数送给段寄存器,应借助通用寄存器中转9. MOV CS, AX
不能显式直接改变寄存器cs的值10. MOV [AX], BX
寄存器间接寻址方式不能使用ax,只能使用bx bp si di
1. MOV 3, SI
; mov si,3
立即数寻址方式 或目的操作数是寄存器的寄 存器寻址方式,倒着写是AT&T汇编写法2. MOV CH, 1234H
;mov cx,1234立即数寻址方式,目的操作数是寄存器的寄存器寻址方式3. MOV [BX], 33H
;mov byte ptr [BX],33h 需要确定传送的字节数默认2个字节开始4个字节。 4. MOV AX, CL;mov al,cl 或 mov ax,寄存器寻址方式,目的操作数和源操作数位数不等5. MOV AL, [BX]正确6. MOV X, [100H]
;不知道你指的X是内存单元不,俩内存单元不能直接操作, mov ax,[100h]
使用一个通用寄存器导一下7. MOV [100H], [DI]
mov ax,word ptr [di]
mov [100h],ax8. MOV DS, 1000H
;立即数寻址方式通常用于对通用寄存器或内存单元赋初值,可以写为
mov ax,1000h
mov ds,ax9. MOV CS, AX
;CS代码段寄存器的地址一般不需要操作,不能操作 10. MOV [AX], BX
;同3是寄存器间接寻址,不能使用AX间接访问 mov word ptr[DI],bx没有验证书籍,只供参考。
您可能关注的推广
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁汇编语言和C语言在图形处理中的综合应用_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
20页免费2页免费37页免费2页¥1.0044页免费3页免费38页免费2页7下载券3页1下载券4页免费
喜欢此文档的还喜欢5页免费3页免费21页1下载券2页免费5页免费
汇编语言和C语言在图形处理中的综合应用|汇​编​语​言​和​C​语​言​在​图​形​处​理​中​的​综​合​应​用
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢 |  | 招贤纳士 |  | 学习资料 |  | 
培训咨询专线:400-654- 企业院校洽谈专线:010--803
学院地址:北京市海淀区永泰庄北路40号 景泰聚合商务综合楼二层 传真:010-
皖ICP备号-1 京公网安备55号用C语言函数写ARM寄存器预定义分析
欢迎童鞋们交流学习
标题:用C语言函数写ARM寄存器预定义分析
用C语言函数写ARM寄存器预定义分析
我们在用C语言函数写ARM寄存器的预定义时,会用到这样的格式,如:
#define& GPFCON& (*(volatile unsigned *)0x)
#define& GPFDAT & (*(volatile unsigned *)0x)
一定要用这种格式吗,其中关键字volatile['v?l?tail]是什么意思呢,是必须的吗?我们一点点来看。
首先这条语句写成
&#define&&& GPFCON& (*(unsigned *)0x)
#define&&& GPFCON& (*(volatile unsigned int*)0x)
这两种形式,在ADS编译环境中都可以编译通过的,但是写成
#define&&& GPFCON& (*(volatile unsigned)0x)
&#define&&& GPFCON& (*(volatile unsigned int)0x)
编译是通不过的
int关键字的大小
这里解释一下为什么用int可以不会溢出,其实int多大,取决于你的系统,以及编译器,你如果是16位的系统,一个int 就是16位,也就是占2个字节,无符号整数最大就是2^16,32位就是2^32,这里ARM是32位的,因此用int是不会溢出。
关键字volatile
再看一下关键字volatile的作用
volatile ['v?l?tail] 的英文解释如下
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& adj. 爆炸性的;不稳定的;挥发性的;反覆无常的
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& n. 挥发物;有翅的动物
其是嵌入式开发所常用到的一种变量,一个定义为volatile的变量是说这变量可能会被意想不到的改变,这样,编译器就不会去假设这个变量的值。也就是说,优化器在使用到这个变量时必须每次都小心的重新读取这个变量的值,而不是使用保存在寄存器里的备份。例如:
&O&&&&&&&& 并行设备的硬件寄存器(如状态寄存器)
&O&&&&&&&& 一个中断服务子程序中会访问到的非自动变量(Non-automati variable)
&O&&&&&&&& 多线程应用中被几个任务共享的变量
嵌入式系统程序员经常同硬件、中断、TROS等打交道,都要求volatile变量。
探究volatile变量,我们来回答下面三个问题
1.&&&&&&&& 一个参数可以既是const还是volatile吗?
2.&&&&&&&& 一个指针可以使volatile吗?
3.&&&&&&&& 下面的函数有错误码
&&&&&& int square(volatile int *ptr)
&&&&&&&&&&&&& return *ptr * *
我们来一一作答
1.&&&&&&&& 一个参数可以既是const又是volatile。例:只读的状态寄存器,它是volatile因为它可以被&意想不到的&改变;它是const因为程序不应该试图去修改它;
2.&&&&&&&& 指针可以是volatile,尽管这并不常见。例:当一个中断服务子程序修改一个指向buffer的指针时。
3.&&&&&&&& 这段代码是个恶作剧,其目的是用来返回*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码
&&&&&& int square(volatile int *ptr)
&&&&&&&&&&&&& int a,b;
&&&&&&&&&&&&& a = *
&&&&&&&&&&&&& b = *
&&&&&&&&&&&&& return a*b;
由于*ptr的值被&意想不到的&改变,因此a和b可能是不同的。因此这段代码返回的可能不是你所期望的平方值。正确的代码如下:
&&&&&& int square(volatile int *ptr)
&&&&&& a = *
&&&&&& return a*a;
再有volatile关键字告诉编译器不要持有变量的临时性拷贝。一般用在多线程程序中,以避免在其中一个线程操作该变量时,将其拷贝入寄存器。如:
A线程将变量复制入寄存器,然后进入循环,反复检测寄存器的值是否满足一定条件(它期望B线程改变变量的值),在这种情况下,当B线程改变变量的值时,已改变的值对其在寄存器中的值没有影响,所以A线程进入死循环。
那在这里volatile的作用是什么呢?
以& #define& GPFDAT & (*(volatile unsigned *)0x) 为例
volatile告诉编译器这个GPFDAT的内容是随时都有可能发生变化的,每次使用它的时候必须从其中读取,因而编译器生成的可执行代码会重新从GPFDAT中读出数据进行操作。
如果不用volatile,那优化的做法就是由于编译器发现两次从GPFDAT中读出的数据之间的代码很可能没有对GPFDAT进行操作(这是很有可能的,在这里对GPFCON没有影响,但是对于GPFDAT,当将GPFCON配置成IN模式时,读GPFDAT就有可能出现错误),它会自动使用上次读的数据,而不是重新从GPFDAT中读取,这样就很容易出现错误。所以说volatile可以保证对特殊地址的稳定访问,不会出错。
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& 本文在前人的基础上写成,感谢那些给予我帮助的童鞋们
本文引用通告地址:
| 浏览(3367) 引用(0)
如果您想出现在此位置,请您先【】!
Copyright (C)2000-.cn

我要回帖

更多关于 c语言绝对值排序 的文章

 

随机推荐