HNU_计算机系统_第一次课后作业
智能230Xamazing_ice
仅供参考,请先独立思考
- 汇编代码

- 以6×2为例,需要经过两次循环
- 第一次:

- 第二次:

- 第一次:
-
movb $0xF, (%ebx)
正确 -
movw %eax, (%esp)

movw %eax, (%esp)是指将寄存器eax中的值传入%esp的值所指向的内存,这里的问题是eax应该对应movl
正确代码:movl %eax, (%esp) -
movl (%eax), 4(%esp)

mov指令的操作数通常只能有一个内存操作数,另一个必须是寄存器或者立即数。也就是说,mov指令不允许同时有两个内存操作数。
正确代码:先把(%eax)存入寄存器%ebx,再把寄存器%ebx传到4(%esp)
movl (%eax), %ebx
movl %ebx, 4(%esp)

-
movb %al, %sl

问题在于SL并不是有效的寄存器名称,并不是所有寄存器的命名都是%E?X, %?H, %?L, 这里误将SL当做SI(源变址寄存器)的低八位,但事实上并没有这种寄存器。
正确代码:我们换成一个合法的8位寄存器
movb %al, %bl

-
movl %eax, $0xFFFFFFFF

问题是movl指令的操作数顺序颠倒了,AT&T汇编代码是源操作数在前,目的操作数在后。
正确代码:movl $0xFFFFFFFF, %eax

-
movw %eax, %bx

在AT&T语法中,当使用movw时,源操作数必须是16位的。而eax是32位,因此直接使用movw %eax, %bx是不允许的,因为源操作数的尺寸大于指令要求的尺寸。汇编器因此报错,认为这是一个不支持的指令,因为操作数尺寸不匹配。
正确代码:movw %ax, %bx

-
movb %si, 8(%esp)

movb 是8位(byte)数据传输指令,源操作数 %si 是16位寄存器,8位指令无法操作16位寄存器。
正确代码:movw %si, 8(%esp)





