1、285习题参考答案 1第 1 章1-1汇编的主要功能:输入:汇编语言源文件输出:目标文件处理:对源文件进行语法检查;将符号指令翻译为机器指令。连接的主要功能:输入:1 个或多个目标文件与库文件输出:可执行文件处理:浮动地址的重定位;多模块的连接。1-2 (1)2EH (2)0D2H (3)0FFH(4)80H (5)7FH (6)0FEH1-3 (1)7FH (2)0FF80H (3)0FFFFH80x86 汇编语言程序设计(第 2 版)286(4)0FFD2H (5)8000H (6)0FFH1-4 无符号数范围:02 n-1; 带符号数范围:-2 n1 2 n1-11-5 (1)压缩 BC
2、D 码:58H;非压缩 BCD 码:x5x8H。(2)压缩 BCD 码:1624H;非压缩 BCD 码:x1x6x2x4H。1-6 (1 )字符1的 ASCII 码;十进制数 31 的压缩 BCD 码;十进制数 1 的非压缩 BCD 码;十进制数 49 的十六进制表示。(2)十进制数-1 的 8 位二进制补码表示;带符号数 255 的 16 位二进制补码表示;无符号数 255 的 8 位二进制形式。(3)十进制数-1 的 16 位二进制补码表示;带符号数 65535 的 32 位二进制补码表示;无符号数 65535 的 16 位二进制形式。1-7 (1)作为无符号数为 159,等值的 16 位
3、和 32 位形式均为 9FH;作为带符号数为-97 ,等值的 16 位和 32 位形式分别为 0FF9FH 与 0FFFFFF9FH。(2)作为无符号数和带符号数均为 104,等值的 16 位和 32 位形式均为 68H。(3)作为无符号数为 192,等值的 16 位和 32 位形式均为 0C0H;作为带符号数为-64,等值的 16 位和 32 位形式分别为 0FFC0H 与 0FFFFFFC0H。1-8 (1)AND 0FH (2)OR 30H(3)右移 4 位可得高位的值;将原值 AND 0FH 可得低位的值。(4)XOR 00101010B习题参考答案287(5)AND 8000H,若结
4、果为 0,则是正数,否则为负数。第 2 章2-1 系统总线是 CPU 与内存和 I/O 子系统之间进行数据交换的通道,包括数据总线、地址总线和控制总线,分别负责在 CPU 与内存和 I/O 子系统之间传送数据、地址和控制信息。其中,数据总线决定了 CPU 每次存取数据的最大位数;地址总线决定了系统的最大可编址空间;控制总线用来控制 CPU 与内存和 I/O 设备之间的数据传送方式。2-2 8 位通用寄存器 8 个:AH,AL,BH,BL,CH,CL,DH 和 DL。16 位通用寄存器 8 个:AX,BX,CX,DX,SI,DI,BP 和 SP。32 位通用寄存器 8 个:EAX,EBX,ECX
5、,EDX,ESI,EDI,EBP 和 ESP。段寄存器 6 个:CS,DS,SS,ES ,FS 和 GS。2-3 IP 包含要执行的下一条指令的偏移地址;SP 包含堆栈段栈顶的偏移地址;段寄存器用来存放 16 位段地址。通常,CS 存放当前代码段的段地址, SS 存放当前堆栈段的段地址,DS、 ES、FS 和 GS 用来存放数据段的段地址。2-4 因为段内偏移地址是 16 位,故每个段最大只能 216B,即 64KB。2-5 物理地址 = 段地址 16 + 偏移地址。给定逻辑地址,可得到唯一的物理地址;每个物理地址可由不同的逻辑地址描述。例如,逻辑地址 0200:1200H 对应唯一的物理地址
6、03200H,但该物理地址又可由逻辑地址 0320:0000H,0210:1100H 和 0000:3200H 等来描述。80x86 汇编语言程序设计(第 2 版)2882-6 实模式的主要特点如下。 与 8086 兼容,只有低 20 条地址线有效,只能寻址第一个 1MB 的内存空间。 采用内存分段方式,程序所使用的逻辑地址为 16 位段地址:16 位偏移地址,每段64KB。 20 位物理地址由段地址左移 4 位加偏移地址得到。 CPU 总是从地址 CS:IP 处取指令,EIP 的高 16 位为 0。 SS:SP 表示堆栈段的栈顶地址,ESP 的高 16 位为 0。 对于 32 位 80x86
7、 CPU,程序可以使用 32 位寄存器和 32 位操作数,但采用 32 位寄存器表示偏移地址时,只使用低 16 位,高 16 位为 0。2-7 首字单元地址:23A10H;末字单元地址: 23A1EH2-8 这些数在内存的存放情况如下:0 10006H3 10005H47H 10004H2BH 10003H2AH 10002H0 10001H1 10000H2-9 (1)CF = 1 OF = 0 SF = 0 ZF = 1 (2)CF = 0 OF = 1 SF = 1 ZF = 0(3)CF = 1 OF = 1 SF = 0 ZF = 1 (4)CF = 0 OF = 0 SF = 1
8、ZF = 02-10 (1)CF = 0 OF = 0 SF = 0 ZF = 0 (2)CF = 0 OF = 1 SF = 0 ZF = 0(3)CF = 1 OF = 0 SF = 1 ZF = 0 (4)CF = 1 OF = 1 SF = 1 ZF = 0习题参考答案289第 3 章3-1 (1)SS (2)CS (3)DS (4)FS(5)SS (6)DS (7)DS (8)ES3-2 (1)正确 (2)类型不匹配(3)两个操作数不能同时是内存操作数 (4)没有espeax*3这种操作数形式(5)正确 (6)CS 不能作为目的操作数(7)类型不确定 (8)没有sp这种操作数形式(9
9、)条件转移指令的操作数只能是标号 (10)正确(11)不能将立即数送段寄存器 (12)没有 bx+2 这种操作数形式3-3 (1)27feh (2)2a00h (3)2802h (4)2801h(5)27feh (段内调用)或 27fch(段间调用)(6)2802h(段内返回)或 2804h(段间返回)(7)27fch (8)2804h3-4 DEC 不影响 CF。3-5 不能。转移类指令(如 JMP,Jcc,LOOP,CALL 及 RET 等)的执行会改变 IP 的值。3-6 无符号数比较:(1)ZF = 1 (2)ZF = 0 (3)CF = 1 (4)CF = 1 或 ZF = 1 80
10、x86 汇编语言程序设计(第 2 版)290(5)CF = 0 且 ZF = 0 (6)CF = 0带符号数比较:(1)ZF = 1 (2)ZF = 0 (3)SF OF 或 ZF = 1 (5)SF = OF 且 ZF = 0 (6)SF= OF3-7 CALL 指令执行的操作:(1)返回地址进栈。段间调用:CS 与 IP(下一条指令的地址)依次进栈。段内调用:IP(下一条指令的 16 位偏移地址)进栈。(2)转移到过程的第 1 条指令去执行。段间调用:根据操作数,将 32 位分段地址送 CS:IP。 段内调用:根据操作数,将 16 位偏移地址送 IP。 RET 指令执行的操作:返回地址出栈
11、,从而实现转移到返回地址处。段间返回:POP 1 个双字到 CS:IP。 段内返回:POP 1 个字到 IP。 3-8 AX 的值将是返回地址的 16 位偏移地址。3-9 (1)除数为 0。(2)除数太小,被除数太大,导致商溢出。3-10 (1)cbw (2)cwd (3)cdq (4)bt ax, 03-11习题参考答案291(1) mov ah, 0 add ax, bx(2) cbwadd ax, bx(3) movsx eax, aladd eax, ebx3-12 将 DX:AX 中的双字数右移 4 位。3-13 指令 AL CF OF SF ZFxor al, al 0 0 0 0
12、 1mov al, 255 0ffh 0 0 0 1inc al 0 0 0 0 1not al 0ffh 0 0 0 1shl al, 1 0feh 1 0 1 0cmp al, 10 0feh 0 0 1 0sub al, 7fh 7fh 0 1 0 0shl al, 1 0feh 0 1 1 03-14(1)jcxz donenext: mov bl, simov es:di, blinc siinc diloop nextdone:(2)jcxz donenext: mov es:di, eaxsub di, 4loop nextdone:(3) jcxz donenext: mov
13、ax, sicmp ax, es:dipushfadd si, 2add di, 2popfloope nextdone:3-15 将 AX 与 DX 中的 4 位十进制数对应的压缩 BCD 码相加,结果存入 AX。例如,若 AX = 1234H,DX = 5678H,则结果 AX = 6912H。3-16 80x86 汇编语言程序设计(第 2 版)292(1) mov bl, aland bl, 0fhmov bh, alshr bh, 4(2) shl ax, 1rcl bx, 1rcl cx, 1(3) cmp al, 10jge setcfcmp al, -10jle setcfclc
14、jmp exitsetcf:stcexit:(4) cmp eax, ebxjbe nextxchg eax, ebxnext: cmp eax, ecxjbe donexchg eax, ecxdone:(5) mov cx, axxor cx, bxtest cx, 1jz exittest bx, 1jz exitxchg ax, bxexit:(6) mov dx, 0shl ax, 1rcl dx, 1mov bx, axmov cx, dxshl ax, 1rcl dx, 1shl ax, 1rcl dx, 1add ax, bxadc dx, cx(7) mov al, xcbw
15、shl ax, 2sub ax, 5mov bx, axmov al, xsar al, 1cbwadd ax, bx(8) mov ax, 0mov cx, 100next: add ax, cxloop next习题参考答案293第 4 章4-1 指令是程序运行时由 CPU 执行的,在汇编后由对应的机器代码所取代;而伪指令是不可执行的,只是由汇编器处理的命令。指令与机器密切相关,指令系统是由 CPU 本身确定的;而伪指令与机器无关,只与汇编器有关。4-2 标号表示指令的起始地址,可作为转移类指令的操作数,表示转向地址;变量是用来定义数据的,可作为指令的内存操作数。JMP L ; 直接转移,
16、转移到标号 L所在地址JMP X ; 段内间接转移,目标的偏移地址为 X的值(字)4-3(1)源程序的编辑。输出文件:源程序文件.asm。(2)源程序的汇编。输入文件:源程序文件。输出文件: 无错:目标文件.obj,列表文件等。 有错:错误信息,列表文件。(3)目标文件的连接。输入文件:目标文件与库文件。输出文件:80x86 汇编语言程序设计(第 2 版)294 无错:可执行文件.exe,映像文件等。 有错:错误信息。(4)可执行文件的试运行。(5)可执行文件的调试。4-4 (1)AX 的值为地址 WVar + 1 处的 1 个字。(2)AX 的值为地址 WVar 处的字加 1。4-5(1)正
17、确。 (2)错误。offset 后只能是汇编时可求值的地址表达式。(3)正确。 (4)错误。两个操作数不能同时为内存操作数。(5)错误。不能将两个地址相加。 (6)错误。类型不匹配。(7)正确。 (8)错误。JMP 指令的操作数不能为字节变量。4-6 oprd and 0feh 是一个表达式,在汇编时求值,其中的 and 为逻辑运算符;第 1 个 and是指令助记符,指令在程序运行时执行。4-7 (1)dw 3132h (2)db 32h, 31h(3)db 21 (4)dw 124-8 (1)24h (2)0ch (3)0ch (4)6 (5)10h(6)3103h (7)5 (8)7 (9
18、)04-9(1) mov dx, seg blockmov ds, dx习题参考答案295lea bx, block +12mov dx, bx(2) mov dx, seg blockmov ds, dxmov dx, block + 12(3) mov dx, seg blockmov ds, dxmov bx, 12mov dx, blockbx(4) mov dx, seg blockmov ds, dxlea bx, blockmov si, 12mov dx, bxsi(5) mov dx, seg blockmov ds, dxmov eax, 6mov dx, blockeax
19、*24-10 1e00h4-11 将 buf1 中的后 10 个字节传送到 buf2 中。4-12 将 String 中的 80 个字符整体后移 1 个字节,首字符不变。4-13 将两位十进制数对应的压缩 BCD 码存入 AL。4-14dseg segmentBCD db 69h ; 已知的 BCD码ASC db ?, ? ; 存放 ASCII码dseg endscseg segmentassume cs:cseg, ds:dsegstart:mov ax, dsegmov ds, axmov al, BCDmov cl, 4shr al, clor al, 30hmov ASC, almov
20、 al, BCDand al, 0fhor al, 30hmov ASC + 1, almov ah, 4chint 21hcseg endsend start4-1580x86 汇编语言程序设计(第 2 版)296.386dseg segment use16num dd 12345678hbuf db 8 dup (?)dseg endscseg segment use16assume cs:cseg, ds:dsegstart:mov ax, dsegmov ds, axmov cx, 8mov si, 0mov eax, numnext: rol eax, 4mov bufsi, ala
21、nd bufsi, 0fhinc siloop nextmov ah, 4chint 21hcseg endsend start第 5 章5-1dseg segmentCrLf db 0dh, 0ah, $dseg endscseg segmentassume cs:cseg, ds:dsegStart:mov ax, dsegmov ds, axmov ah, 1int 21hpush axlea dx, CrLfmov ah, 9int 21hpop axcmp al, ajb Stopcmp al, zja Stopsub al, 20hmov dl, almov ah, 2int 21
22、hStop: mov ah, 4chint 21hcseg endsend Start5-2CR equ 0dh习题参考答案297LF equ 0ahdseg segmentMsg1 db All equal., CR, LF, $Msg2 db Only two equal., CR, LF, $Msg3 db All three different from each other., CR, LF, $Num1 dw ? ; Num1、 Num2与 Num3为定义的三个 16位数Num2 dw ?Num3 dw ?dseg endscseg segmentassume cs:cseg, d
23、s:dsegStart:mov ax, dsegmov ds, axmov ax, Num1cmp ax, Num2je Already_Two_Equalcmp ax, Num3je Two_Equalmov ax, Num2cmp ax, Num3je Two_Equallea dx, Msg3jmp DoneAlready_Two_Equal:cmp ax, Num3je All_EqualTwo_Equal:lea dx, Msg2jmp DoneAll_Equal:lea dx, Msg1Done:mov ah, 9int 21hmov ah, 4chint 21hcseg ends
24、end Start5-3.386dseg segment use16Num dd ?, ?, ? ; 给定的 3个 32位带符号数dseg endscseg segment use16assume cs:cseg, ds:dsegStart:mov ax, dsegmov ds, axmov ecx, 1mov eax, NumNext: cmp eax, Numecx*4jle Skipxchg eax, Numecx*4mov Num, eaxSkip: inc ecxcmp ecx, 3jne Next80x86 汇编语言程序设计(第 2 版)298mov eax, Num + 4cmp
25、 eax, Num + 8jle Donexchg eax, Num + 8mov Num + 4, eaxDone:mov ah, 4chint 21hcseg endsend Start5-4.386option segment:use16dseg segmentMsg1 db Decimal:, $Msg2 db 0dh, 0ah,Binary:, $ErrMsg db 0dh, 0ah,Invalid data., $ dseg endscseg segmentassume cs:cseg, ds:dsegStart:mov ax, dsegmov ds, axlea dx, Msg1
26、mov ah, 9int 21hmov ah, 1int 21hmov bl, alcmp bl, 0jb Errorcmp bl, 9jbe OkError: lea dx, ErrMsgmov ah, 9int 21hjmp DoneOk: lea dx, Msg2mov ah, 9int 21hshl bl, 4mov cx, 4NextBit:shl bl, 1setc dladd dl, 30hmov ah, 2int 21hloop NextBitDone: mov ah, 4chint 21hcseg endsend Start5-5.386dseg segment use16D
27、ata dw 100 dup (?)dseg ends习题参考答案299cseg segment use16assume cs:cseg, ds:dsegStart:mov ax, dsegmov ds, axmov ax, 0mov ecx, lengthof Data Next: mov bx, Dataecx*2-2bt bx, 0jnc Skipcmp ax, 0jz Okcmp ax, bxjbe SkipOk: mov ax, bxSkip: loop NextDone: mov ah, 4chint 21hcseg endsend Start5-6 dseg segmentMsg
28、1 db Hex:, $Msg2 db 0dh, 0ah, Bin:, $Buf db 5, ?, 5 dup (?)dseg endscseg segmentassume cs:cseg, ds:dsegStart:mov ax, dsegmov ds, axlea dx, Msg1mov ah, 9int 21hlea dx, Bufmov ah, 0ahint 21hlea dx, Msg2mov ah, 9int 21hmov cl, Buf + 1xor ch, chjcxz Exitmov si, 2Next: mov bl, Bufsicmp bl, 9jbe Oksub bl,
29、 7Ok: push cxmov cl, 4shl bl, clmov cx, 4Output: mov dl, 0shl bl, 1jnc Skipinc dlSkip: mov ah, 2int 21hloop Outputmov dl, 20hmov ah, 280x86 汇编语言程序设计(第 2 版)300int 21hpop cxinc siloop NextExit: mov ah, 4chint 21hcseg endsend Start5-7.386dseg segment use16Array dw 5 ; 元素个数dw -1, 2, 4, 3, 4 ; 数组元素Max dw
30、 -32768Min dw 32767Sum dw 0Average dw 0dseg endscseg segment use16assume cs:cseg, ds:dsegStart:mov ax, dsegmov ds, axxor ecx, ecxmov cx, Array Next: mov ax, Arrayecx*2add Sum, axcmp Max, axjge Skip1mov Max, axSkip1: cmp Min, axjle Skip2mov Min, axSkip2: loop Nextmov ax, Sumcwdidiv Arraymov Average,
31、axDone: mov ah, 4chint 21hcseg endsend Start5-8(1)dseg segmentData1 db 1, 2, 3, 4, 5LEN = $ - Data1Data2 db 1, 2, 4, 3, 5 Flag db 0Addr1 dd ?Addr2 dd ?dseg endscseg segmentassume cs:cseg, ds:dsegStart:习题参考答案301mov ax, dsegmov ds, axmov si, 0mov cx, LENCompare: mov al, Data1sicmp al, Data2sijne Diffe
32、rentinc siloop Comparemov Flag, 1jmp DoneDifferent: lea ax, Data1simov word ptr addr1, axmov word ptr addr1 + 2, dseglea ax, Data2simov word ptr addr2, axmov word ptr addr2 + 2, dsegDone: mov ah, 4chint 21hcseg endsend Start(2)dseg segmentData1 db 1, 2, 3, 4, 5LEN = $ - Data1Data2 db 1, 2, 4, 3, 5 F
33、lag db 0Addr1 dd ?Addr2 dd ?dseg endscseg segmentassume cs:cseg, ds:dsegStart:mov ax, dsegmov ds, axmov es, axlea si, Data1lea di, Data2mov cx, LENcldrepe cmpsbjne Differentmov Flag, 1jmp DoneDifferent:lea ax, si-1mov word ptr addr1, axmov word ptr addr1 + 2, dslea ax, di-1mov word ptr addr2, axmov
34、word ptr addr2 + 2, esDone: mov ah, 4chint 21hcseg endsend Start5-9dseg segmentScore dw 60, 90, 30, 60, 90LEN = ( $ - Score ) / 280x86 汇编语言程序设计(第 2 版)302Rank dw LEN dup (1)dseg endscseg segmentassume cs:cseg, ds:dsegStart:mov ax, dsegmov ds, axmov si, 0mov cx, LENLoop1: mov ax, Scoresipush cxmov cx,
35、 LENmov di, 0Loop2: cmp ax, Scoredijae Skipinc RanksiSkip: add di, 2loop Loop2pop cxadd si, 2loop Loop1mov ah, 4chint 21hcseg endsend Start5-10(1) mov es, ax (2 ) xorch, ch(3) cmp byte ptr es:di, B (4) rep movsb(5) pop cx (6) lea dx, Buf + 2第 6 章6-1 MASM 根据其操作数的类型来确定 CALL 指令的类型,其中,若操作数为过程名,则根据过程定义时指
36、出的类型来确定是 NEAR 调用还是 FAR 调用。RET 指令的类型由其所在过程的类型来确定。6-2dseg segmentString db 80, 0, 80 dup (?)Msg1 db Input a String: , $Msg2 db 0dh, 0ah, Yes, $Msg3 db 0dh, 0ah, No, $dseg endscseg segmentassume cs:cseg, ds:dsegStart: mov ax, dsegmov ds, axlea dx, Msg1call DispMsg习题参考答案303lea dx, Stringmov ah, 0ahint 2
37、1hlea si, String + 2mov cl, String + 1xor ch, chcall Digitscmp al, 0jnz Yeslea dx, Msg3jmp DispYes: lea dx, Msg2Disp: call DispMsgmov ah, 4chint 21h; 功能:显示 DS:DX所指的字符串DispMsg procpush axmov ah, 9int 21hpop axretDispMsg endp; 入口参数: DS:SI = 字符串首地址; CX = 字符串长度; 出口参数: AL。若 DS:SI所指字符串为数字串,则 AL = 1;否则, AL
38、 = 0。Digits procpush cxpush sixor al, alNext: cmp byte ptr si, 0jb Donecmp byte ptr si, 9ja Doneinc siloop Nextmov al, 1Done: pop sipop cxretDigits endpcseg endsend Start6-3SumOfArray procpush cxpush dxpush simov dx, cxshl dx, 1add dx, 2xor ax, axNext: add ax, siadd si, dxloop Nextpop sipop dxpop cx
39、80x86 汇编语言程序设计(第 2 版)304retSumOfArray endp6-4入口参数:DS:SI = 以递增排序的带符号字数组的首地址CX = 元素个数AX = 带符号数功能:采用折半查找算法,在 DS:SI 所指数组中,查找 AX 中的带符号数。出 口 参 数 : 若 找 到 , 则 CF = 0, 且 BX = 该 元 素 在 数 组 中 的 序 号 ( 0, 1, 2, ) ; 否 则 , CF = 1。6-5 MaxAbs procpush axpush cxpush sixor ax, axNext: test word ptr si, 8000hjz Okneg wo
40、rd ptr siOk: cmp si, axjle Skipmov ax, simov di, siSkip: add si, 2loop Nextpush dspop espop sipop cxpop axretMaxAbs endp6-6dseg segmentN dw 100SumN dw ?dseg endscseg segmentassume cs:cseg, ds:dsegStart:mov ax, dsegmov ds, axpush axpush Ncall Sumpop SumN习题参考答案305mov ah, 4chint 21hSum procpush bpmov b
41、p, sppush axpush cxmov cx, 4bpmov ax, 0Next: add ax, cxloop Nextmov 6bp, axpop cxpop axpop bpret 2Sum endpcseg endsend Start6-7 Print proc farpush bpmov bp, sppush axpush bxpush dxpush esles bx, 2bp PutChar: mov dl, es:bxcmp dl, 0jz EndStringmov ah, 2int 21hinc bxjmp PutCharEndString:inc bx mov 2bp,
42、 bxpop espop dxpop bxpop axpop bpretPrint endp6-8 函数 CFunc1 对应的汇编语言代码如下:Para_i equ 4bp Para_j equ 6bp Para_k equ 8bp CFunc1 proc nearpush bpmov bp, sppush axpush bxmov bx, Para_imov ax, Para_jadd ax, Para_k80x86 汇编语言程序设计(第 2 版)306mov bx, axpop bxpop axpop bpret 6CFunc1 endp调用语句 CFunc1(a, 3, 4); 对应的汇
43、编语言代码如下:mov ax, 4 push axmov ax, 3 push axmov ax, offset a push axcall CFunc16-9dseg segmentI dw ?J dw 6K dw 2dseg endscseg1 segmentassume cs:cseg1, ds:dsegStart: mov ax, dsegmov ds, axcall Additiondd I, J, Kmov ah, 4chint 21hcseg1 endscseg2 segmentassume cs:cseg2Addition proc farpush bpmov bp, sppu
44、sh axpush bxpush sipush dspush eslds si, bp+2 ; 取返回地址 CS:IP到 DS:SIles bx, si+4 ; 取 J的地址到 ES:BXmov ax, es:bx ; 取 J的值les bx, si+8 ; 取 K的地址到 ES:BXadd ax, es:bxles bx, si ; 取 I的地址到 ES:BX mov es:bx, ax ; 存储结果add si, 12mov bp+2, si ; 修改返回地址pop espop ds习题参考答案307pop sipop bxpop axpop bpretAddition endpcseg2
45、 endsend Start6-10 call ProcPtrebx*46-11dseg segmentN dw 100SumN dw ?dseg endssseg segment stackdw 1024 dup (?)sseg endscseg segmentassume cs:cseg, ds:dseg, ss:ssegStart:mov ax, dsegmov ds, axpush axpush Ncall Summov SumN, axmov ah, 4chint 21h; 入口参数: N( 16位,调用前进栈); 出口参数: AX = Sum(N)Parm_N equ 4bpSum
46、 procpush bpmov bp, spmov ax, Parm_Ncmp ax, 0jz Exitdec axpush ax ; 参数 N-1进栈call Sumadd ax, Parm_N ; N + Sum(N-1)Exit: pop bpret 2Sum endpcseg endsend Start第 7 章7-1CrLf macro80x86 汇编语言程序设计(第 2 版)308push axpush dxmov dl, 0dhmov ah, 2int 21hmov dl, 0ahmov ah, 2int 21hpop axendm7-2MoveStr macro From, T
47、olocal Next, Donepush axpush sipush dilea si, Fromlea di, ToNext: mov al, simov di, alcmp al, 0jz Doneinc siinc dijmp NextDone: pop dipop sipop axendm7-3(1) mov cl, 4shr ax, cl(2) shl bx, 17-4DATA = 0repeat 100dw 0dw DATADATA = DATA + 2endm7-5(1)dseg segmentMsg1 db Message No. 1$Msg2 db Message No.
48、2$Msg3 db Message No. 3$Msg4 db Message No. 4$Msg5 db Message No. 5$dseg ends(2)dseg segmentforc No, 习题参考答案309MsgN Noendmdseg ends(3)dseg segmentNo = 1repeat 5MsgN %NoNo = No + 1endmdseg ends7-6宏定义:InitSeg macro DsegName, EsegNamepush axmov ax, DsegNamemov ds, axifnb mov ax, EsegNamemov es, axendifp
49、op axendm宏调用例:(1)将 DS 与 ES 的值分别设置为 dseg 与 eseg 段的段地址。InitSeg dseg, eseg(2)将 DS 的值设置为 dseg 段的段地址。InitSeg dseg7-7 相同之处:都只有 1 个段。不同之处:TINY 模型的段是 16 位,长度 64KB;FLAT 模型的段是 32 位,长度4GB。7-8 段装入内存的顺序如下。段 SSEG:由模块#1 和模块#3 的段 SSEG 组合而成,类别为STACK。段 DSEG:由模块#1 和模块#3 的段 DSEG 组合而成,类别为 DATA 。80x86 汇编语言程序设计(第 2 版)310段 DSEG:模块#2 的私有段 DSEG,类别为 DATA。段 CSEG1:模块#1 的段 CSEG,类别为