简介这份习题参考答案文档对应沈美明、温冬婵编著的《IBM-PC汇编语言程序设计》教材面向正在学习8086汇编语言、需要课后核对与自测的本科生和自学者可用于复习阶段或备考前检验对基础概念的掌握程度。文档共1个doc文件压缩包约524KB按教材章节顺序编排逐题给出结果与推导过程。内容覆盖第一章的数制转换十进制、二进制与十六进制的互化及十六进制四则运算校核、8位补码表示与加减运算、CF与OF标志位的判断以及ASCII码与字符串编码的换算第二章则涉及I/O端口数量、字与字节在存储器中的存放图示、段地址与偏移地址合成物理地址等习题。每题保留完整算式与结论便于读者对照自己的解题步骤发现是概念理解偏差还是计算疏漏尤其适合补码溢出判断这类易错点。已有116人学习。1. 先看清这套题怎么考答案对不对只占一半分搜「汇编语言程序设计 答案」的人十有八九是做完课后题想对个数结果发现自己算出来的数和参考答案差了一位或者 CF、OF 全凭感觉蒙。这门课的考法其实很固定数制与补码、标志位判定、寻址方式与物理地址、指令序列编写、串操作与移位五块轮着出填空和编程各占半壁江山。真正拉开差距的不是那个十进制结果而是你有没有把 EA、PA、CF、OF 写全——少写一个标志位填空题直接半分起步。这篇按考点往下拆每一块都给真题、给思路、给容易踩的坑适合正在刷这本教材课后题、准备期末或复试机考的人直接照着练。2. 数与编码降幂法、补码、ASCII 三件套一个都不能软这一章是整本书的第一道门槛也是最容易“会做但写错”的地方。题目本身不难难在格式二进制要补足位、十六进制要带 H、负数要说明是补码还是无符号。很多人的卷面分不是丢在算错而是丢在“没写清楚按哪种解释”。下面三个小节每一节都对着教材第一章的原题走一遍。2.1 十进制转二/十六进制降幂法手算、除法取余校验教材 1.1 给的四组数是 369、10000、4095、32767答案分别是1 0111 0001B 171H、10 0111 0001 0000B 2710H、1111 1111 1111B FFFH、111 1111 1111 1111B 7FFFH。这四道题不是随便挑的369 考降幂法4095 考“全 1”边界32767 考 16 位有符号数上限10000 考一个既不是 2 的幂、也不是边界的普通数。降幂法的动作要领是“从大到小减”先找不超过目标数的最大 2 的幂。以 369 为例256 能用剩 11364 能用剩 4932 能用剩 1716 能用剩 11 能用剩 0。用到的位是 256、64、32、16、1对应二进制1 0111 0001。再把二进制从右往左每四位切一组高位不够就补零0001 0111 0001→1 7 1写成 171H。除法取余是另一半答案的校验手段考场上没时间做两遍但心里要有数369 ÷ 16 23 余 123 ÷ 16 1 余 71 ÷ 16 0 余 1余数从下往上读就是 171H。两种方法对得上这道题才能放心往下走。提示写二进制时按四位一组留空格比如10 0111 0001 0000B。这不是为了好看是防止你在转十六进制时数错位。32767 这道题有个隐藏考点它是 16 位补码能表示的最大正数加 1 就变成 8000H也就是 -32768。教材后面讲溢出时反复用这个边界第一章先埋下伏笔。4095 对应 FFFH同样是 12 位全 1注意它只占 3 位十六进制别顺手写成 0FFFH 又说不出为什么多一个 0。2.2 补码同一个 D8H可以是 -40 也可以是 216教材 1.6 问得很直接D8H 和 FFH 分别当作补码带符号数和无符号数时各表示多少。标准答案是 D8H 作带符号数为 -40、作无符号数为 216FFH 作带符号数为 -1、作无符号数为 255。这类题面试官和阅卷人都爱出因为它一秒就能看出你懂不懂“最高位的权是负的”。D8H 展开成二进制是1101 1000最高位是 1说明是负数。按位权算最高位权值是 -128其余位正常加-128 64 16 8 -40。这个算法比“取反加一”快而且不容易在补码边界上翻车。取反加一路径也要会因为编程题里求绝对值、求负数用的就是它D8H 取反得 27H加 1 得 28H即 40所以原数是 -40。两条路走出来的数一样说明你这一步稳了。到了 1.7题目把“补码”换成“ASCII 码”同一个十六进制数要给出两种解读4FH 作补码是 79作字符是O2BH 是 43 和73H 是 115 和s59H 是 89 和Y。这里最容易错的是 4FH——它最高位是 0当补码就是正数 79很多人一看字母 O 就以为要特殊处理。其实不用ASCII 表里 4FH 就是大写 O两个答案各自独立。提示题干只要出现“分别被看作”就必须两套答案都写只写一个按半分处理。这是血泪经验不是客套话。2.3 ASCII 与字符串一句话摊成一行字节教材 1.8 要求把For example,This is a number 369写成 ASCII 码值答案是一长串 46H、6FH、72H、20H……最后以 0AH、0DH 结尾。这道题看着机械实际上考三件事字母大小写差 20H、空格是 20H、数字字符是 30H 起步。把常用的几个记死比临时查表快得多0~9是 30H~39HA~Z是 41H~5AHa~z是 61H~7AH空格 20H逗号 2CH.是 2EH。所以字符串里的369写成33H 36H 39H不是03H 06H 09H——这个错每年都有人犯本质是把“数字的值”和“数字字符的编码”混成一件事。教材 3.12 是同一考点的进阶版字符串BASED ADDRESSING存在 CSTRING 起始的字节单元里要求把第 1 个和第 7 个字符送 DX。答案是MOV DH, CSTRING ; 第 1 个字符 B MOV DL, CSTRING7-1 ; 第 7 个字符 A偏移是 7-16CSTRING7-1这个写法是教材的习惯题目说“第 7 个”而下标从 0 开始所以偏移是 6。写代码时直接写CSTRING6也对但保留7-1能让阅卷人一眼看到你意识到下标从 0 起。DX 高字节装第一个字符、低字节装第二个顺序别反反了就是 DH/DL 互换的低级错误。3. 标志位CF 看进位、OF 看符号两列分开算标志位是这门课的分水岭。前面的数制转换靠细心标志位靠的是规则清不清楚。教材从 1.5 开始就把 CF 和 OF 摆在每道运算题后面第三章 3.15、3.16 更是直接要求“根据结果设置 SF、ZF、CF、OF”。很多人在这里翻车不是因为不会算是因为把“最高位有进位”和“结果溢出”当成了一回事。3.1 CF 与 OF 的判定加法看进位、减法看借位、OF 看符号先把规则写死。加法指令里CF 等于最高位向外的进位减法指令里CF 等于借位也就是“被减数不够减”。OF 只看符号两个同号数相加得到异号结果就溢出两个异号数相减得到与目的操作数相反的符号也溢出。注意 OF 跟 CF 完全独立可以同时为 1也可以同时为 0。用教材 1.5 的三道题走一遍。第一道(-85)76两个操作数一负一正不可能溢出所以 OF0二进制相加1010 1011 0100 1100 1111 0111最高位没有向外进位CF0。结果 0F7H 就是 -9符合预期。第二道85(-76)同样是异号相加OF0但0101 0101 1011 0100 1 0000 1001最高位产生了进位CF1。结果取低 8 位是 09H。第四道85-(-76)等价于 8576161超过 8 位有符号数上限 127所以 OF1两个正数相加最高位没有进位CF0结果 0A1H 按补码读是 -95正是因为溢出才显得“荒谬”。教材 3.15 换成十六进制加法规则一模一样。62A0H 1234H 74D4H两正得正SF0、ZF0、CF0、OF0。62A0H 4321H A5C1H两正得负SF1、OF1、CF0。62A0H CFA0H 1 3240H产生了进位所以 CF1但一正一负不会溢出OF0、SF0。62A0H 9D60H 1 0000HCF1、ZF1其余全 0。3.16 换成减法。1234H - 4AE0H C754H小减大要借位CF1结果为负所以 SF1异号相减不溢出OF0。9090H - 4AE0H 45B0H负数减正数却得到正数SF0、OF1这是最典型的“看起来没借位但溢出了”。运算操作数符号结果符号OFCF62A0H 1234H正 正正0062A0H 4321H正 正负1062A0H CFA0H正 负正019090H - 4AE0H负 - 正正10提示先把 OF 判完再判 CF因为 OF 只看符号、不依赖具体数值判完这一项心里就有底了。3.2 双字长加减ADC 接住进位SBB 接住借位多字节运算考的是“进位能不能传下去”。教材 3.20 要求把 DATAX 和 DATAY 两个双字数据相加结果存回 DATAY。正确写法是先加低位、再用 ADC 加高位MOV AX, DATAX ; 取第一个双字的低 16 位 ADD DATAY, AX ; 低位相加结果写回同时产生 CF MOV AX, DATAX2 ; 取第一个双字的高 16 位 ADC DATAY2, AX ; 高位相加把上一次的 CF 一起加进去 MOV WORD PTR DATAY4, 0 ADC WORD PTR DATAY4, 0 ; 把最高位产生的进位收进扩展字关键在于第二步用的必须是 ADC 而不是 ADD。ADC 会把 CF 当操作数之一低位相加时产生的进位就这样被带进高位。中间不能插入任何影响 CF 的指令比如CMP、SUB、移位插进去进位就丢了这是最常见的手写错误。3.21 考反向操作对 DX:AX 里的双字长数求补。教材给了两种写法推荐这种NEG DX ; 先对高位取补 NEG AX ; 再对低位取补 SBB DX, 0 ; 低位取补产生的借位从高位扣掉顺序很重要先高位后低位最后用 SBB 把低位NEG产生的借位补到高位上。如果顺序反过来NEG AX之后NEG DX会把 CF 覆盖掉借位就丢了。3.22 求双字绝对值用的是同一套思路先判DX的符号负数才走NEG DX / NEG AX / SBB DX,0正数直接搬到结果单元。3.3 乘除法AX/DX 分工和“结果对不上”的根源乘法除法的考点集中在寄存器分工。8 位乘法把 AL 和源操作数相乘结果放 AX16 位乘法把 AX 和源操作数相乘结果放 DX:AX。除法反过来8 位除法用 AX 作被除数商在 AL、余数在 AH16 位除法用 DX:AX 作被除数商在 AX、余数在 DX。教材 3.20 第 6 问要求 DATAX 除以 23DATAX 是 0148H即 328。写法是MOV AX, DATAX ; 被除数 0148H MOV BL, 23 ; 除数 23 DIV BL ; AL 商 0EHAH 余数 06H328 ÷ 23 14 余 6商 0EH、余数 06H对得上。注意这里必须用无符号的 DIV因为 DATAX 是无符号定义如果题目明说带符号就要换成 IDIV并且被除数要先CWD扩展到 DX:AX。3.18 那段程序更像综合题MOV AX,1234H之后MOV CL,4、ROL AX,CL把 AX 循环左移 4 位变成 2341HCF1DEC AX得 2340HMUL CX把 AX 乘 4 得 8D00H。这段题的关键是记住ROL只影响 CF 和 OF不影响 SF、ZF而MUL之后 CF 和 OF 只有在结果高半部分为 0 时才清零——8D00H 的高半部分 AH8DH 不为 0所以 CFOF1。移位指令用于乘除 2 的幂也是常考点。教材 3.25 要求把 53 和 -49 分别乘 2、除 2。乘 2 用SAL正数负数都适用53 左移一位得 6AH-49 左移得 9EH。除 2 要用SAR而不是SHRSHR是逻辑右移高位补 0负数会被移成正数SAR算术右移高位补符号位-49 右移一位得 0E7H也就是 -25向下取整。4. 寻址方式EA 怎么算、PA 怎么拼、小端怎么读这一章是整本书的重头戏也是填空题最爱出的地方。教材第三章几乎每道题都要先算有效地址或物理地址算错了后面全错。下面把它拆成三层先算 EA再拼 PA最后按小端规则把内存里的字节读成字。4.1 七种寻址方式与有效地址教材 3.1 给的条件是 (BX)637DH、(SI)2A9BH、位移量 D7237H要求分别按七种寻址方式求有效地址。这七种要能背下来寻址方式EA 表达式本题取值立即寻址操作数在指令中无 EA—直接寻址EA D7237H寄存器寻址无 EA操作数是 (BX)637DH寄存器间接EA (BX)637DH寄存器相对EA (BX) D0D5B4H基址变址EA (BX) (SI)8E18H相对基址变址EA (BX) (SI) D1004FH最后一行是这道题的陷阱8E18H 7237H 1004FH超过了 16 位偏移的表示范围最高进位丢失所以 EA 写成 004FH。教材特意标出“超过了段的边界”就是要你写出回绕这一步。光写 1004FH 不给分因为偏移地址寄存器只有 16 位。3.8 把同一套规则套到 12 条指令上要求判断源操作数的寻址方式并算出物理地址。这类题的做法是两步先看源操作数长什么样是立即数、寄存器还是带方括号的内存引用再看方括号里用了哪些寄存器BX 走 DS、BP 走 SS出现 ES: 前缀就换段。第 7 问MOV AX,[BP]最容易错很多人顺手按 DS 算成 20100H正确值是 SS×16 BP 15010H。4.2 物理地址段基址左移四位再加偏移物理地址的公式只有一条PA 段地址 × 10H 偏移地址也就是段地址左移 4 位再相加。教材 2.4 给的三组 3017:000A、3015:002A、3010:007A算出来都是 3017AH说明同一物理地址可以由不同段偏移组合表示这是实模式分段的核心特征。2.5 稍微绕一下程序开始执行时 (CS)0A7F0H、(IP)2B40H问第一个字的物理地址。把 CS 左移四位得 0A7F00H加 IP 得 0AAA40H。这里有个细节段地址是 5 位十六进制题目特意提醒“最高位为字母要补 0”就是防止你把 A7F0H 当成 4 位去移位。默认段搭配建议直接背成表做题时不用推导参与寻址的寄存器默认段寄存器可否段超越BX、SI、DIDS可加 ES: 等前缀BPSS可SPSS不可串操作的 DIES不可3.6 那道题把这条规则用足了数据段 2000H 偏移处放着一个指针低字是偏移 0FF10H、高字是段地址 8000H要求把该变量装入 AX。做法是先取偏移、再取段地址送 ES、最后用 ES: 前缀跨段读MOV BX, [2000H] ; 取变量的偏移地址 0FF10H MOV AX, [2000H2] ; 取变量的段地址 8000H MOV ES, AX ; 段地址只能通过寄存器进 ES MOV AX, ES:[BX] ; 跨段读目标变量MOV ES, AX这一句不能省也不能直接写MOV AX, [8000H:0FF10H]8086 不允许在指令里直接写段基址。这是格式分很多人过程对但写法不合法。4.3 指令执行后 AX 是几小端存储与错位读字教材 3.4 是这类题的代表。条件 (DS)2000H、(BX)0100H、(SI)0002H内存里 20100H 起是 12H、34H、56H、78H21200H 起是 2AH、4CH、B7H、65H。七条指令执行完 AX 各是多少指令物理地址AX 结果MOV AX,1200H—1200HMOV AX,BX—0100HMOV AX,[1200H]21200H4C2AHMOV AX,[BX]20100H3412HMOV AX,1100[BX]21200H4C2AHMOV AX,[BX][SI]20102H7856HMOV AX,1100[BX][SI]21202H65B7H规律是小端模式低字节在低地址、高字节在高地址读字时“低地址做低字节”。20100H 是 12H、20101H 是 34H所以 [BX] 读出 3412H20102H 是 56H、20103H 是 78H所以 [BX][SI] 读出 7856H。第 5、7 条本质是同一组数据换了偏移算法1100[BX] 算出来是 21200H和直接寻址 [1200H] 命中同一单元答案自然一样。命题人就是让你验证“不同寻址方式可以指向同一物理地址”。2.3 也是同一种读法30021H 字节单元是 34H、30022H 是 ABH、30023H 是 CDH、30024H 是 EFH那么 30021H 字单元是 AB34H30022H 字单元是 CDABH。字单元从偶数地址或奇数地址开始都可以但读的时候一定从起始地址取两个字节低地址那个是低位。提示画一张内存示意图再动笔把地址标在左边、内容标在右边读字时用方框圈住两个单元。这一步花十秒能省下重新算一遍的三分钟。5. 易错题盘点五个年年有人栽的坑这一章不按教材顺序走专挑那些“看答案恍然大悟、考试时照样写错”的题。每一条都按“错在哪、为什么错、怎么答对”拆开看完之后建议拿这几道原题再默写一遍。5.1 MOV AX,TABLE 和 LEA AX,TABLE 搞混错在哪把两条指令当成一回事都答成 1234H。为什么错没分清“取内容”和“取地址”。TABLE 是数据段 0032 单元的符号名里面存着 1234H。MOV AX,TABLE是把这个单元里的内容搬进 AX所以 AX1234HLEA AX,TABLE是把 TABLE 的偏移地址装进 AX所以 AX0032H。LEA 是 load effective address它根本不访问内存只做地址计算。怎么答对看到题目同时出现这两条指令先问自己“问的是值还是地址”。写成一句话记MOV 拿的是箱子里的东西LEA 拿的是箱子的编号。如果题目再追问“那 MOV AX,OFFSET TABLE 呢”答案是和 LEA 一样取偏移 0032H因为 OFFSET 是伪指令运算在汇编阶段就算出常数了。5.2 字数组里按字节偏移取字取出来高字节是垃圾错在哪教材 3.11 里 TABLE 依次存 10、20、30、40、50ENTRY 存 3执行MOV BX,OFFSET TABLE、ADD BX,ENTRY、MOV AX,[BX]后很多人答 AX001EH 或 0032H。为什么错ADD BX,ENTRY加的是 3单位是字节不是字。BX 指向 TABLE3而 TABLE 里每个数占两个字节TABLE3 正好落在第三个数的第二个字节上。从 TABLE0 开始0AH 00H、14H 00H、1EH 00H……TABLE3 是 00H偏移 3TABLE4 是 1EH偏移 4所以从 TABLE3 读字低字节是 00H、高字节是 1EHAX1E00H。怎么答对遇到数组题先画一行字节每个字拆成“低字节、高字节”两格再按偏移数格子。要取第 n 个元素偏移应该是 (n-1)×2这个乘法不能省。3.3 那道“把第 6 个字送 DX”的题同理偏移是 (6-1)×210三种寻址方式写法不同但偏移量都是 10。5.3 短转移的位移量被当成目标地址错在哪教材 3.70624H 处有一条两字节JMP SHORT OBJ位移量给 27H、6BH、0C6H不少人直接答目标地址就是 27H、6BH、0C6H或者拿 0624H 直接加位移。为什么错短转移的位移量是相对量基准是“这条指令的下一条指令的地址”不是当前指令地址。JMP SHORT占两个字节所以基准是 0624H20626H。另外位移量是带符号数C6H 作为 8 位补码是 -3AH不是正的 198。怎么答对记住公式“目标 当前 IP 指令长度 位移量”。三问分别是 0626H27H064DH、0626H6BH0691H、0626H-3AH05ECH。第三问是向前跳题目括号里已经提示“向上转移负位移”答题时把 C6H 换算成 -3AH 这一步写出来分就稳了。5.4 串操作忘了方向标志REP 前缀用错错在哪教材 3.29 要求把字符串从左到右和从右到左各复制一遍很多人两问都写CLD加REP MOVSB或者从右到左时忘了把 SI、DI 指到末尾。为什么错串操作的方向由 DF 决定CLD清方向标志表示地址递增STD置位表示递减。从右往左复制必须STD而且源和目的指针都要先指向最后一个字节也就是ADD SI,20-1、ADD DI,20-1否则第一次搬运就越界。另外REP和REPE/REPNE不能混用REP只配合 MOVS/STOS/LODSREPE/REPNE才配合 CMPS/SCAS。怎么答对写串操作前先定三件事——方向、指针初值、重复条件。3.30 把字符串里的换成空格用的是REPNE SCASB先在 AL 里放的 ASCII 码CLD之后用 SCASB 逐字节比较找到后DEC DI回退一格再写空格。这里DEC DI是最容易漏的一步SCASB 每次比较完会自动加一不回退就写到下一个字节去了。5.5 堆栈题只写 SP 变化没标物理地址错在哪教材 3.13(SS)0FFA0H、(SP)00B0H压入 8057H 和 0F79H 再弹出一条很多人只写 SP 从 00B0H 变成 00AEH 再变成 00ACH图画不出来。为什么错PUSH 是“先减 SP、再存数据”POP 是“先读数据、再加 SP”。压第一个字时 SP 减 2 得 00AEH栈顶物理地址是 0FFA0H×1600AEH0FFAAEH低字节 57H 存在 FFAAEH、高字节 80H 存在 FFAAF H。压第二个字时 SP00ACH79H 存 0FFAACH、0FH 存 0FFAADH。POP 一次后 SP 回到 00AEH读出的值是 0F79H。怎么答对画图时左边写物理地址、右边写内容把 SP 的指向画成箭头。堆栈是后进先出压进去的顺序是 8057H、0F79H弹出来的第一个必然是 0F79H。题目问“变化过程”就要把三次 SP 值00B0H、00AEH、00ACH、00AEH都标出来只写最终值算不完整。6. 答题顺序一套能按时做完并回查的流程考点铺完了最后说方法。这门课的卷子有个特点前面的数制题分值低但耗时间后面的指令序列题分值高但容易漏条件。我后来固定用三步定位法先看题干里的动词再定考点最后套对应模板。题干动词考点动笔前先写什么转换、表示数制、补码、ASCII先写位数和有无符号运算、设置标志CF/OF/SF/ZF先判符号再判进位有效地址、物理地址寻址方式先列 EA 公式再代值编写指令序列数据传送、运算先写注释再写指令说明功能程序阅读先标每条指令后寄存器的值第一步拿到题先扫一遍把“转换类”和“编程类”分开。数制转换限时一分钟一道超过就跳过回头再补。第二步编程题一律先写注释再写指令比如“取低位、加低位、取高位、带进位加高位”注释写完指令自然就出来了还能拿步骤分。第三步留十分钟回查三件事标志位有没有写全、十六进制有没有漏 H、双字运算有没有用 ADC/SBB。押题方向上重点看三块补码与无符号数的双重解释、CF 和 OF 的独立判定、基址变址加位移量的 EA 计算。这三块几乎每年都出而且都能在教材前四章找到原题变体。串操作和堆栈属于“出一次就是大题”复习时把 3.29、3.30、3.13 这三道题的代码默写一遍比看十遍答案管用。从那以后我每次做这类题都强制走一遍“先判符号、再算地址、最后补标志位”的流程宁可多写一行注释也不在脑子里跳步。希望帮到你。本文还有配套的精品资源点击获取