问题集合!

GGJJyangjinhan 2009-02-10 10:16:58
问题(1)
段0013 偏移0028 值1
段0014 偏移0029 值2
段0015 偏移0030 值3
这个值123就是堆栈吧?
PUSH指令首先减小ESP的值,然后把一个16位或32位的原操作数复制到堆栈上,对于16位操作数,ESP减2.
减小ESP的值,在ESP寄存器值也是想这样储存的吗?
段0013 偏移0028 值1
段0014 偏移0029 值2
段0015 偏移0030 值3
问题(2)
如果是那减小2就等于贮存的是1了?
问题(3)
如果不是这样储存的那是什么样?
问题(4)
像这样的指令
MOV ECX,01100001或者MOV ECX,61H就等于是把小写字母a放到寄存器吧?
问题(5)
十进制数100就是7位的数吧,那我如何知道他的尺寸?
问题(6)
是不是16位的操作数没法放到32位寄存器?
问题(7)
PUSH cx
MOV CL,04
SHR DX,CL
POP CX
这是程序的一部分。
意思应该是,减小ESP的值,把CX的值复制到堆栈上。然后POP增加ESP的值从堆栈上把值复制回cx?
问题(8)
立即操作数和操作数有什么不同?

...全文
137 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin115406828 2009-02-19
  • 打赏
  • 举报
回复
来学习学习
willflyz 2009-02-15
  • 打赏
  • 举报
回复
问题1
是把100的值放到ecx,偏移地址是相对于段来说的,mov eax,[100],这里的100才叫偏移地址,相当于mov eax,eds:[100];
问题2
4是要取3000H的值,3当然也可以,不过取到AX的值就会变成0030H了,
问题3
78 56 34内存是这样存放的,高位对高位,低位对低位,AH为56,AL为78,AX就是5678
问题4
自己规定的,定义类型的时候就已经说明了,主要还是在寻址的时候看怎么用,比如Mov byte ptr ax,1 Mov word ptr ax,1
GGJJyangjinhan 2009-02-14
  • 打赏
  • 举报
回复
问题1
MOV ecx,100
就是把100这个值放到ecx吗,不是偏移地址100放到ECX吗?




问题2
data
q word 1000h,2000h,3000h
.code
mov esi offset q
mov ax esi
mov ax esi+2
mov ax esi+4(这个是不是应该加3?)




问题
data
q dword 12345678h
.code
mov ax,word ptr q
这样5678就送到AX了(书上这样写的)

问题3
那为什么不是78或者56送到ax呢。
问题4
CPU能够使用,双字,字,字节存储。是什么规定它到底是用字还是双字或字节?



cnzdgs 2009-02-12
  • 打赏
  • 举报
回复
“00000028减4得0000002C”,应该是加4。
只要内存地址有效,是不会没有值的,如果内存地址无效,会产生异常。
GGJJyangjinhan 2009-02-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cnzdgs 的回复:]
晕,写错了,改一下:
00000028 值00000006
0000002C 值00000005
00000030 值00000004
00000034 值00000003
00000038 值00000002
0000003C 值00000001
[/Quote]

哎呀我终于看明白,也就是说00000028减4得0000002C。因为存储顺序所以是从上往下算?

那堆栈就是上面的样子了?
如果0000003C 往下没有值了再加4会怎么样?
xiaopoy 2009-02-11
  • 打赏
  • 举报
回复
帮补充,减4(bytes)则指向栈中上一个值。那串1/2/3/4...每个得大小是双子dword(32位下的int)
lol,cnzd这种解惑的解答者风格自己个喜欢!
liuqizealot 2009-02-10
  • 打赏
  • 举报
回复
(1) 你这是3个段,如果都是堆栈段,那么1,2,3只是堆栈段里偏移28/29/30处的值,123怎么能是堆栈呢?
(2) 不在一个段里面,你这样是错的
(3) 看书吧
(4)对的
(5)常数的尺寸是固定的,怎么会不知道呢,如果是要算某个数的位数,可以写个函数
(6) MOV EAX,0FFFFH是可以的 如果是从一个16位的存储器操作数赋值给32为寄存器,是不行的,需要用PTR强制指定类型
(7)一般是这样
(8)操作数可以是存储器操作数,寄存器操作数,常数 立即数是寻址中的概念,就是常数
cnzdgs 2009-02-10
  • 打赏
  • 举报
回复
晕,写错了,改一下:
00000028 值00000006
0000002C 值00000005
00000030 值00000004
00000034 值00000003
00000038 值00000002
0000003C 值00000001
cnzdgs 2009-02-10
  • 打赏
  • 举报
回复
在32位程序中push是把esp减4,在16位程序中是把sp减2,在64位程序中是把rsp减8。以32位程序为例,假设esp是00000028,栈里面依次push了1、2、3、4、5、6,应该是这样(段地址是不变的):
00000028 值00000006
00000030 值00000005
00000038 值00000004
00000040 值00000003
00000048 值00000002
00000050 值00000001
GGJJyangjinhan 2009-02-10
  • 打赏
  • 举报
回复
那堆栈应该是什么样的?
push就是先把esp减4。找你这么说,比如堆栈里面有值1,2,3,4,5,6减4以后就是指向3了?
xiaopoy 2009-02-10
  • 打赏
  • 举报
回复
立即操作数和操作数
的区别是名字不同

帮顶cndz接分
cnzdgs 2009-02-10
  • 打赏
  • 举报
回复
问题(1)
段0013 偏移0028 值1
段0014 偏移0029 值2
段0015 偏移0030 值3
这个值123就是堆栈吧?
PUSH指令首先减小ESP的值,然后把一个16位或32位的原操作数复制到堆栈上,对于16位操作数,ESP减2.
减小ESP的值,在ESP寄存器值也是想这样储存的吗?
段0013 偏移0028 值1
段0014 偏移0029 值2
段0015 偏移0030 值3
问题(2)
如果是那减小2就等于贮存的是1了?
问题(3)
如果不是这样储存的那是什么样?


你这些段地址和偏移量与堆栈没有任何联系。
esp是32位程序用的,32位程序的push和pop都是32位操作数,push就是先把esp减4,然后把操作数储存在ss:esp的位置上。

问题(4)
像这样的指令
MOV ECX,01100001或者MOV ECX,61H就等于是把小写字母a放到寄存器吧?


对,但是二进制数最后要加一个字母B,即01100001B。

问题(5)
十进制数100就是7位的数吧,那我如何知道他的尺寸?


在电脑储存的数通常是8位、16位、32位等形式,不足时,正数的高位补0,负数的高位补1。

问题(6)
是不是16位的操作数没法放到32位寄存器?


可以,例如movzx eax, dx

问题(7)
PUSH cx
MOV CL,04
SHR DX,CL
POP CX
这是程序的一部分。
意思应该是,减小ESP的值,把CX的值复制到堆栈上。然后POP增加ESP的值从堆栈上把值复制回cx?


差不多,但应该sp,不是esp。

问题(8)
立即操作数和操作数有什么不同?


操作数就是指令要使用的数据,获得操作数的方式称为寻址,寻址有多种方式,立即寻址是其中之一。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧