简介:本文是博主汇编测试的试题及答案分析,属个人理解,如有错误,欢迎指教
1:执行指令ADD %eax,%edx,其中%eax为0x0a517c44,%edx为0x0839317c,%edx结果为______(以十六进制小写格式表示例0xffffffff)。
正确答案:0x128aadc0
2:执行以下指令,最终%eax的结果为______(以十六进制格式小写表示例0xffffffff)。
movl $0xcc514c7d,%edx #1100(c)负数
movl $0x60fd5750,%eax #0110(6)正数
cmpl %eax,%edx #edx-eax<0
jge .L2 #有符号数
subl %edx,%eax #执行eax-edx,FFFF FFFF 94AC 0AD3,取后面8位
jmp .L3
.L2:
subl %eax,%edx
movl %edx,%eax
.L3:
正确答案:0x94ac0ad3
3:假设寄存器%dh的值为0x0e,%eax的值为0xf923af9f,执行以下指令
movsbl %dh,%eax
%eax的值为______(以十六进制小写字符格式表示例0xffffffff该题请补齐八位)。
解析: 取dh做符号位扩展成8位,注意符号位为0而不是1
正确答案:0x0000000e
[有更改]4: 假设寄存器 %ebx的值为0x82b2544d,执行以下指令后
movl %ebx,%ecx
movw $0x5db2,%bx //ebx变为0x82b25db2
movb $0xeb,%bl//ebx变为0x82b25deb
cmpl %ecx,%ebx
jae .L1 //按无符号数解释,ebx>ecx,跳转到.L1
addl $0x1,%ebx
jmp .L2
.L1:
subl $0x1,%ebx
.L2:
%ebx的值为______(以十六进制格式小写表示例0xffffffff)。
*解析:
注意注意!
cmp操作不是用前面的操作数减后面的,而是用后面的操作数减前面的,我之前没有发现这个错误,反而认为是mov指令的问题,在此改正(图来自http://c.biancheng.net/view/3529.html),也就是说64位字长的模式下并且把32位的操作数放进64位的寄存器,或者把较多位的操作数放进较少位的存储器,才会把存储器清0,由于这里是32位操作数以及32位的寄存器,所以把16位或者8位的操作数放进32位的寄存器前面的数是不变的。