IBM-PC汇编语言程序设计:课后习题解析

需积分: 0 1 下载量 182 浏览量 更新于2024-07-28 1 收藏 105KB DOC 举报
"IBM-PC汇编语言程序设计课后习题答案主要涵盖了第4、5章的内容,涉及了汇编语言中的一些基本指令错误、非法指令以及类型匹配等问题。这些习题旨在帮助学习者加深对汇编语言编程规则的理解,特别是关于寄存器使用、操作数类型、存储器寻址以及转移指令的应用。" 在IBM-PC汇编语言程序设计中,正确理解和使用指令至关重要。习题4.1中列举了一些常见的指令错误: 1. MOVAH,BX:错误在于试图将数据从BX寄存器移动到AH寄存器,但AH是8位寄存器,而BX是16位寄存器,两者类型不匹配。 2. MOV[BX],[SI]:此指令错误是因为两个操作数都不能是存储器指针,即不能同时使用[BX]和[SI]。 3. MOVAX,[SI][DI]:[SI]和[DI]不能同时作为基址寄存器,它们不能一起用于形成存储器地址。 4. MOVMYDAT[BX][SI],ES:AX:错误在于AX寄存器不能用于段超越(segment override)。 5. MOVBYTEPTR[BX],1000:问题在于立即数1000超过了字节的范围,它应该是一个字节大小的值。 6. MOVBX,OFFSETMYDAT[SI]:OFFSET运算符用于获取内存变量的偏移地址,而MYDAT[SI]已经是偏移地址,不能再次使用OFFSET。 7. MOVCS,AX:CS(代码段寄存器)不能作为目的寄存器接受数据。 8. MOVECX,AX:CX是16位寄存器,而AX也是16位,但在汇编语言中,它们代表不同类型的寄存器,因此这种类型转换通常不允许。 习题4.2和4.3继续考察了指令的合法性,涉及了立即数、存储器操作数、类型匹配以及寻址模式的问题。例如: - CMP15,BX:立即数不能作为目的操作数,必须是寄存器或内存位置。 - CMPOP1,25:同样,立即数只能用作源操作数,不能直接与内存操作数比较。 - CMPAX,OP1:AX是16位,而OP1是字节类型,类型不匹配,应使用CMPax,wordptr OP1。 - MOVBP,AL:错误在于AL是8位,BP是16位,类型不匹配。 - MOVSP,SS:DATA_WORD[BX][SI]:堆栈指针SP不能直接用段:偏移地址赋值。 习题4.4则关注了运算指令和转移指令的正确用法: - ADDVAR1,VAR2:在汇编语言中,两个内存位置的操作数不能直接进行运算,必须先加载到寄存器。 - SUBAL,VAR1:AL是8位,VAR1是字,数据类型不匹配,需要使用与VAR1相同类型的寄存器或先进行数据类型转换。 - JMPLAB[SI]:转移指令JMP不能与[SI]结合使用,LAB应该是标号,而不是通过索引访问的变量。 - JNZVAR1:JNZ(非零转移)指令期望的是标号,而非变量。 - JMPNEAR LAB:在IBM-PC汇编中,转移指令通常需要使用NEARPTR,而不是NEAR。 通过解答这些问题,学习者可以了解到汇编语言中的关键概念,如寄存器操作、类型匹配、寻址模式以及指令格式的正确性,这些都是编写有效汇编程序的基础。