求问leal指令的一个问题

yzh07137 2014-09-14 02:00:01
我看到gcc产生了下面这种代码,leal -4(%ebp), %eax
这个是不是把ebp里面存储的地址减去4了之后放在eax里,因为它是要调用scanf,所以需要传递地址?
但是如果确实是取地址的话有时候又说不通,比如:
1. leal 0x0(,%ebx,4), %edx (假设ebx里面存的是x)
那么根据代码,它的效果是edx里的值是4*x,这和取地址好像很不一样啊。
2. leal -1(%ebx), %eax (ebx放的是n,根据它的注释,这句话是计算n-1,并放在eax中)
请问大神,这个leal到底是个什么意思呢?
...全文
500 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
竹影半墙 2015-01-27
  • 打赏
  • 举报
回复
搜 “leal 指令”
AI小夜 2015-01-25
  • 打赏
  • 举报
回复
leal命令我也不是很清楚,但是它有两个用法。1,将有效地址写入到目的操作数。2,可以简洁地描述普通的算术操作。如果不是很理解可以看一下《深入理解计算机系统》这本书的第118页倒数的几行。我个人觉得可以这样理解。如果你的%ebx存的是存储器里的一个数的地址,那么使用leal指令的用法就是加载有效地址到目的操作数,属于用法1。如果你的%ebx存的是一个数字而已,不代表其他的意思,那么这个就是普通的算术运算,这样可以实现一些加减乘法,属于用法2。leal的用法还是比较灵活的。
大熊猫侯佩 2014-10-02
  • 打赏
  • 举报
回复
引用 4 楼 yzh07137 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] 《The Intel 64 and IA-32 Architectures Software Developer's Manual》
额,我下载了,可是搜"leal"了3429页却告诉我没搜到这个指令。。。 另外这是leal,是AT&T格式的汇编,intel的指令集应该查不到吧[/quote] intel指令集有两种格式一种为intel格式另一种即为你说的at&t格式,他们都对应intel指令。leal自然也对应intel指令集中的lea指令,不过使用了at&t特有的格式语法后面加l表示操作数的特性为long型。
大熊猫侯佩 2014-10-02
  • 打赏
  • 举报
回复
你对leal -1(%ebx), %eax的理解稍显生硬。难道不可以理解为在一条指令中将ebx-1然后放入eax中吗? 当然lea的所谓一般用法是取偏移地址,但要有一点,哪怕一点黑客思维呀! 你要看到它实际的效果而不是书上死板的用法。
yzh07137 2014-10-02
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
《The Intel 64 and IA-32 Architectures Software Developer's Manual》
额,我下载了,可是搜"leal"了3429页却告诉我没搜到这个指令。。。 另外这是leal,是AT&T格式的汇编,intel的指令集应该查不到吧
yzh07137 2014-10-02
  • 打赏
  • 举报
回复
引用 2 楼 wy_ei 的回复:
leal 0x0(,%ebx,4), %edx (假设ebx里面存的是x) 这条指令是 0+4*R[%ebx] ebx里面是一个偏移量 比如数组int A[10]; 我要访问 A[5] 的地址 就要 leal (%edx,%ebx,4) ,%eax 这里 %edx是数组的首地址 %ebx是索引。结果就是 %edx就是A吧 ,%ebx就是5吧 ,至于后面4这是由于int是四个字节。现在你应该明白为什么第三个数只能是1,2,4,8这四个数了吧。 leal 指令就是加载有效地址。
谢谢,对于为什么都是1,2,4,8这点我看懂了,但是对于那个"ebx里面是一个偏移量",我记得好像并不是每次都是偏移量,比如这句"leal -1(%ebx), %eax",它貌似是在计算阶乘时的递归。这个和偏移量似乎确实没关系啊
wy_ei 2014-09-17
  • 打赏
  • 举报
回复
leal 0x0(,%ebx,4), %edx (假设ebx里面存的是x) 这条指令是 0+4*R[%ebx] ebx里面是一个偏移量 比如数组int A[10]; 我要访问 A[5] 的地址 就要 leal (%edx,%ebx,4) ,%eax 这里 %edx是数组的首地址 %ebx是索引。结果就是 %edx就是A吧 ,%ebx就是5吧 ,至于后面4这是由于int是四个字节。现在你应该明白为什么第三个数只能是1,2,4,8这四个数了吧。 leal 指令就是加载有效地址。
赵4老师 2014-09-15
  • 打赏
  • 举报
回复
《The Intel 64 and IA-32 Architectures Software Developer's Manual》
计算机系统基础第二次作业 计算机系统基础第二次作业 3、对于以下AT&T格式汇编指令,根据操作数的长度确定对应指令助记符中的长度后缀, 并说明每个操作数的寻址方式。 (1)mov 8(%ebp, %ebx, 4), %ax (2)mov %al, 12(%ebp) (3)add ( , %ebx,4), %ebx (4)or (%ebx), %dh (5)push $0xF8 (6)mov $0xFFF0, %eax (7)test %cx, %cx (8)lea 8(%ebx, %esi), %eax 答:如下表所示: "题目编号 "长度后缀 "源操作数 "目的操作数 " "(1) "w "基址+比例变址+位移 "寄存器 " "(2) "b "寄存器 "基址+位移 " "(3) "l "比例变址 "寄存器 " "(4) "b "基址 "寄存器 " "(5) "l "立即数 "栈 " "(6) "l "立即数 "寄存器 " "(7) "w "寄存器 "寄存器 " "(8) "l "基址+变址+位移 "寄存器 " 4. 使用汇编器处理以下各行AT&T格式代码时都会产生错误,请说明每一行存在什么错误。 (1)movl 0xFF, (%eax) (2)movb %ax, 12(%ebp) (3)addl %ecx, $0xF0 (4)orw $0xFFFF0, (%ebx) (5)addb $0xF8, (%dl) (6)movl %bx, %eax (7)andl %esi, %esx (8)movw 8(%ebp, , 4), %ax 答: (1)书写错误。因为源操作数是立即数0xFF,所以需要在前面加上'$' (2)由于源操作数(%ax)是16位,而长度后缀是字节'b',所以不一致,应改为'movw ' (3)目的操作数不能是立即数寻址 (4)操作数位数超过16位,而长度后缀为16位的'w',应改为'orl' (5)不能用8位寄存器作为目的操作数地址所在寄存器 (6)源操作数寄存器与目的操作数寄存器长度不一致 (7)不存在ESX寄存器 (8)源操作数地址中缺少变址寄存器 7. 假设变量x和y分别存放在寄存器EAX和ECX中,请给出以下每条指令执行后寄存器EDX中的 结果。 (1)leal (%eax), %edx (2)leal 4(%eax, %ecx), %edx (3)leal (%eax, %ecx, 8), %edx (4)leal 0xC(%ecx, %eax, 2), %edx (5)leal ( , %eax, 4), %edx (6)leal (%eax, %ecx), %edx 答: (1)R[edx]=x //把eax的值放到edx中去 (2)R[edx]=x+y+4 //把eax+ecx+4的值放到edx中去 (3)R[edx]=x+8*y //把eax+8*ecx的值放到edx中去 (4)R[edx]=y+2*x+12 //把ecx+2*eax+12的值放到edx中去 (5)R[edx]=4*x //把4*eax的值放到edx中去 (6)R[edx]=x+y //把eax+ecx的值放到edx中去 8.假设以下地址以及寄存器中存放的机器数如下表所示 "地址 "机器数 "寄存器 "机器数 " "0x8049300 "0xfffffff0 "EAX "0x8049300 " "0x8049400 "0x80000008 "EBX "0x100 " "0x8049384 "0x80f7ff00 "ECX "0x10 " "0x8049380 "0x908f12a8 "EDX "0x80 " 分别说明执行以下指令或寄存中的内容交发生改变?改变后的内容是什么条件标志OF 、 SF 、 ZF 和 CF 会发生什么改变。 (1)指令功能为:R[edx] R[edx]+M[R[eax]]=0x00000080+M[0x8049300],寄存器EDX中内 容改变。改变后的 内容为以下运算的结果:00000080H+FFFFFFF0H 0000 0000 0000 0000 0000 0000 1000 0000 + 1111 1111 1111 1111 1111 1111 1111 0000 _______________________________________________ 1 0000 0000 0000 0000 0000 0000 0111 0000 因此,EDX中的内容改变为0x00000070。根据表3.5可知,加法指令会影响OF、SF、ZF和 CF标志。OF=0,ZF=0,SF=0,CF=1。 (2)指令功能为:R[ecx] R[ecx]-M[R[eax]+R[ebx]]=0x00000010
计算机系统基础第二次作业 3、对于以下AT&T格式汇编指令,根据操作数的长度确定对应指令助记符中的长度后缀, 并说明每个操作数的寻址方式。 (1)mov 8(%ebp, %ebx, 4), %ax (2)mov %al, 12(%ebp) (3)add ( , %ebx,4), %ebx (4)or (%ebx), %dh (5)push $0xF8 (6)mov $0xFFF0, %eax (7)test %cx, %cx (8)lea 8(%ebx, %esi), %eax 答:如下表所示: "题目编号 "长度后缀 "源操作数 "目的操作数 " "(1) "w "基址+比例变址+位移 "寄存器 " "(2) "b "寄存器 "基址+位移 " "(3) "l "比例变址 "寄存器 " "(4) "b "基址 "寄存器 " "(5) "l "立即数 "栈 " "(6) "l "立即数 "寄存器 " "(7) "w "寄存器 "寄存器 " "(8) "l "基址+变址+位移 "寄存器 " 4. 使用汇编器处理以下各行AT&T格式代码时都会产生错误,请说明每一行存在什么错误。 (1)movl 0xFF, (%eax) (2)movb %ax, 12(%ebp) (3)addl %ecx, $0xF0 (4)orw $0xFFFF0, (%ebx) (5)addb $0xF8, (%dl) (6)movl %bx, %eax (7)andl %esi, %esx (8)movw 8(%ebp, , 4), %ax 答: (1)书写错误。因为源操作数是立即数0xFF,所以需要在前面加上'$' (2)由于源操作数(%ax)是16位,而长度后缀是字节'b',所以不一致,应改为'movw ' (3)目的操作数不能是立即数寻址 (4)操作数位数超过16位,而长度后缀为16位的'w',应改为'orl' (5)不能用8位寄存器作为目的操作数地址所在寄存器 (6)源操作数寄存器与目的操作数寄存器长度不一致 (7)不存在ESX寄存器 (8)源操作数地址中缺少变址寄存器 7. 假设变量x和y分别存放在寄存器EAX和ECX中,请给出以下每条指令执行后寄存器EDX中的 结果。 (1)leal (%eax), %edx (2)leal 4(%eax, %ecx), %edx (3)leal (%eax, %ecx, 8), %edx (4)leal 0xC(%ecx, %eax, 2), %edx (5)leal ( , %eax, 4), %edx (6)leal (%eax, %ecx), %edx 答: (1)R[edx]=x //把eax的值放到edx中去 (2)R[edx]=x+y+4 //把eax+ecx+4的值放到edx中去 (3)R[edx]=x+8*y //把eax+8*ecx的值放到edx中去 (4)R[edx]=y+2*x+12 //把ecx+2*eax+12的值放到edx中去 (5)R[edx]=4*x //把4*eax的值放到edx中去 (6)R[edx]=x+y //把eax+ecx的值放到edx中去 8.假设以下地址以及寄存器中存放的机器数如下表所示 "地址 "机器数 "寄存器 "机器数 " "0x8049300 "0xfffffff0 "EAX "0x8049300 " "0x8049400 "0x80000008 "EBX "0x100 " "0x8049384 "0x80f7ff00 "ECX "0x10 " "0x8049380 "0x908f12a8 "EDX "0x80 " 分别说明执行以下指令或寄存中的内容交发生改变?改变后的内容是什么条件标志OF 、 SF 、 ZF 和 CF 会发生什么改变。 (1)指令功能为:R[edx] R[edx]+M[R[eax]]=0x00000080+M[0x8049300],寄存器EDX中内 容改变。改变后的 内容为以下运算的结果:00000080H+FFFFFFF0H 0000 0000 0000 0000 0000 0000 1000 0000 + 1111 1111 1111 1111 1111 1111 1111 0000 _______________________________________________ 1 0000 0000 0000 0000 0000 0000 0111 0000 因此,EDX中的内容改变为0x00000070。根据表3.5可知,加法指令会影响OF、SF、ZF和 CF标志。OF=0,ZF=0,SF=0,CF=1。 (2)指令功能为:R[ecx] R[ecx]-M[R[eax]+R[ebx]]=0x00000010+M[0x8049400]

21,458

社区成员

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

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