当前位置: 代码迷 >> 汇编语言 >> 100分,小女求解汇编语言的有关问题 C
  详细解决方案

100分,小女求解汇编语言的有关问题 C

热度:1288   发布时间:2013-02-26 00:00:00.0
100分,小女求解汇编语言的问题 C
你好,学哥学姐们,由于做项目,小女现在学习汇编方面的东西,求高手们指点下小妹,分点作答,骂人的学哥们,就不要来了

1.关于汇编语言,寄存器只有16,或着32位,加入要操作一个字符串,字符串是40个字节,寄存器怎么装的下这个变量呢?



2.比如我在定义了一个s="abcdefg",寄存器要操作它的时候是不是要把"abcdefg"这个字符串放入某个寄存器中操作?明显装不下啊?


3.求大哥们指点下,汇编编程重要要操做大型变量比如string,long,class ,struct类似的变量是怎样做的呢,难道不是想C语言一样把他读入寄存器?


4.我是这样理解的,比如取得string="abcdefg",2~4个位置子字符串的值,首先把string全部读入某个寄存器,然后再寄存器中操作,对吗?



请大哥,大姐们分点作答,小女会公平给分,不胜感激!!

------解决方案--------------------------------------------------------
我简单的解释,仅供参考
1,数据是放内存里的, 需要使用的时候再读到寄存器里。
2,如果需要打印字符串的话,将字符串的首地址告诉寄存器DX,然后调用DOS中断就可以啦
3,在汇编里,这些各种数据类型,如数组和结构,在机器里都是连续的一个字节序列而已。
4,可以采用逐字节读入寄存器DL,然后调用中断逐字符的打印出来。

楼主可以找一些汇编入门的教程看一看。也可以通过GCC查看你写的C代码的汇编代码。这也许对你有更
直观的理解。
------解决方案--------------------------------------------------------
汇编和其他高级语言有很大的不同
寄存器装的是16进制数据,而字符是用ASCII码表示的,例如'A'的ASCII码是01000001B(2进制)=41(16进制),寄存器就是存储的是16进制的。但40个字节是存储在内存中的,所以寄存器一个字节一个字节的读。
在汇编中时不存在字符不字符,全是数据0或者1.看你自己怎么看,你看成数据就是数据,看成代码就是代码
string,long,class ,struct类似的变量,这些东西在汇编是完全不存在的,最多存在一个栈。一个16位寄存器可以放的数是0到65535.放更大的数就要用两个寄存器。例如用DX存高16位,AX存低16位
------解决方案--------------------------------------------------------
现在的学校不开汇编课,直接讲c,这个女同学就是受害者。

1.关于汇编语言,寄存器只有16,或着32位,加入要操作一个字符串,字符串是40个字节,寄存器怎么装的下这个变量呢?
------------------------------------------
寄存器当然是放不下字符串的,但好在处理器并不认识字符串,它也从来不准备认识它。如果你非要它操作字符串,那么,应该把这个字符串在内存中的首地址告诉它,然后命令它一个一个操作。



2.比如我在定义了一个s="abcdefg",寄存器要操作它的时候是不是要把"abcdefg"这个字符串放入某个寄存器中操作?明显装不下啊?
------------------------------------------
同上,如果要操作这个字符串,有它的首地址就可以了。然后,再一次一次地访问内存,逐个取出它们。


3.求大哥们指点下,汇编编程重要要操做大型变量比如string,long,class ,struct类似的变量是怎样做的呢,难道不是想C语言一样把他读入寄存器?
------------------------------------------
大型变量只存在于高级语言中,你可以把它们看成是已经被烧成砖瓦的泥土和砂子。在处理器看来,它们都是一样的,都是一些数字。如何操作它们,它们是什么,是程序的事情。


4.我是这样理解的,比如取得string="abcdefg",2~4个位置子字符串的值,首先把string全部读入某个寄存器,然后再寄存器中操作,对吗?
------------------------------------------
取得那个字符串的值,象这样的写法,只是取得该字符串在内存中的首地址,即“a”的地址。取决于你要怎么操作,那是后面的事情。

------解决方案--------------------------------------------------------
1. 读取变量是要说明长度 mov ax,word ptr [132465H],mov eax,dword ptr [12346H]

2. 放不下就多放几次,寄存器只是给你暂存的作用,条件允许的话就多用
------解决方案--------------------------------------------------------
字符串是直接从内存读的,寄存器只是放个偏移
------解决方案--------------------------------------------------------
1.字符串是存在内存中的,其内存首地址才存放在寄存器中。
2.不是。对字符串操作时,其实是按序遍历字符串,对每个字节进行操作。
3.是要读入寄存器,但不是一次性读入,每次处理其中的一个部分。这些变量本身都是存储在一定长度的内存当中,通过首地址来访问。
4.不对,见第2条。
  相关解决方案