题目
第一章1.1 解:五代,详细见书1.2 解:微型计算机:以大规模、超大规模集成电路[1]为主要部件,以集成了计算机主要部件——控制器和运算器[2]的微处理器[3]为核心,所构造出的计算机系统 。PC机:PC(Personal Computer)机就是面向个人单独使用的一类微机 。单片机:用于控制的微处理器芯片,部除CPU外还集成了计算机的其他一些主要部件,如:ROM、RAM、定时器、并行接口、串行接口,有的芯片还集成了A/D、D/A转换电路[4]等。数字信号处理器[5]DSP:主要面向大流量数字信号[6]的实时处理[7],在宿主系统中充当数据处理[8]中心,在网络通信、多媒体应用等领域正得到越来越多的应用1.3 解:微机主要有存储器[9]、I/O设备和I/O接口、CPU、系统总线、操作系统和应用软件组成,各部分功能如下:CPU:统一协调和控制系统中的各个部件系统总线:传送信息存储器:存放程序和数据I/O设备:实现微机的输入输出功能I/O接口:I/O设备与CPU的桥梁操作系统:管理系统所有的软硬件资源1.4 解:系统总线:传递信息的一组公用导线,CPU通过它们与存储器和I/O设备进行信息交换 。好处:组态灵活、扩展方便三组信号线[10]:数据总线[11]、地址总线[12]和控制总线[13] 。其使用特点是:在某一时刻,只能由一个总线主控[14]设备来控制系统总线,只能有一个发送者向总线发送信号;但可以有多个设备从总线上同时获得信号。1.5解:(1)用于数值计算、数据处理及信息管理方向。采用通用微机,要求有较快的工作速度、较高的运算精度、较大的存容量和较完备的输入输出设备[15],为用户提供方便友好的操作界面和简便快捷的维护、扩充手段。(2)用于过程控制[16]及嵌人应用方向。采用控制类微机,要求能抵抗各种干扰、适应现场的恶劣环境、确保长时间稳定地工作,要求其实时性要好、强调其体积要小、便携式应用强调其省电。1.6 解:1.7 解:I/O通道:位于CPU和设备控制器[17]之间,其目的是承担一些原来由CPU处理的I/O任务,从而把CPU从繁杂的I/O任务中解脱出来。由10根信号线组成(A9-A0)。子程序[18]和主程序使用同一个变量名存取数据就是利用共享变量(全局变量[19])进行参数传递[20]如果变量定义和使用不在同一个源程序[21]中,需要利用PUBLIC、EXTREN声明如果主程序还要利用原来的变量值,则需要保护和恢复利用共享变量传递参数,子程序的通用性较差,但特别适合在多个程序段[22]间、尤其在不同的程序模块间传递数据(3)用堆栈传递参数参数传递还可以通过堆栈这个临时存储区。主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈取得它们采用堆栈传递参数是程式化的,它是编译程序[23]处理参数传递、以及汇编语言[24]与高级语言[25]混合编程时的常规方法3.32 解:方法:主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈取得它们注意:压栈与弹栈必须要一一对应。3.33 解:方法1:neg32 proc ;入口参数:DX.AX=32位有符号数neg ax ;实现0-DX.AX功能neg dxsbb dx,0 ;这条指令也可以用dec dx代替retneg32 endp ;出口参数:DX.AX=32位有符号数的补码方法2:neg32 proc ;入口参数:DX.AX=32位有符号数not ax ;实现DX.AX求反加1not dxadd ax,1adc dx,0retneg32 endp ;出口参数:DX.AX=32位有符号数的补码3.34 解:;数据段array db 12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h ;数组count equ -array ;数组元素个数result db ? ;校验和[26];代码段mov bx,offset array ;BX←数组的偏移地址mov cx,count ;CX←数组的元素个数call checksum ;调用求和过程mov result,al ;处理出口参数mov ax,4c00hint 21h;计算字节校验和的通用过程;入口参数:DS:BX=数组的段地址:偏移地址,CX=元素个数;出口参数:AL=校验和;说明:除AX/BX/CX外,不影响其他寄存器[27]checksum procxor al,al ;累加器[28]清0sum: add al,[bx] ;求和inc bx ;指向下一个字节loop sumretchecksum endpend3.35 解:⑴.model small.stack.datawdata dw 34abh.code.startupmov ax,wdatacall dispa.exit 0;dispa procpush cxpush dxmov cl,4mov dl,ahshr dl,clcall dldispmov dl,ahand dl,0fhcall dldispmov dl,alshr dl,clcall dldispmov dl,aland dl,0fhcall dldisppop dxpop cxretdispa endp;dldisp procpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1: mov ah,2int 21hpop axretdldisp endpend⑵.model small.stack.datawdata dw 34abhwordtemp dw ?.code.startupmov ax,wdatamov wordtemp,axcall dispa.exit 0;dispa procpush cxpush dxmov cl,4mov dl,byte ptr wordtemp+1shr dl,clcall dldispmov dl,byte ptr wordtemp+1and dl,0fhcall dldispmov dl,byte ptr wordtempshr dl,clcall dldispmov dl,byte ptr wordtempand dl,0fhcall dldisppop dxpop cxretdispa endp;dldisp procpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1: mov ah,2int 21hpop axretdldisp endpend⑶.model small.stack.datawdata dw 34abh.code.startuppush wdatacall dispapop ax ;add sp,2.exit 0;dispa procpush bpmov bp,sppush axpush cxpush dxmov ax,[bp+4]mov cl,4mov dl,ahshr dl,clcall dldispmov dl,ahand dl,0fhcall dldispmov dl,alshr dl,clcall dldispmov dl,aland dl,0fhcall dldisppop dxpop cxpop axpop bpretdispa endp;dldisp procpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1: mov ah,2int 21hpop axretdldisp endpend3.36 解:如果利用共享变量传递函数[29],且变量定义和使用不在同一个源程序中,需要利用PUBLIC、EXTERN声明。3.37 解:(1)宏定义由一对宏汇编伪指令[30]MACRO和ENDM来完成,格式如下:宏名 MACRO [形参表]…… ;宏定义体ENDM宏定义之后就可以使用它,即宏调用:宏名 [实参[31]表](2)宏调用的格式同一般指令一样:在使用宏指令[32]的位置写下宏名,后跟实体参数;如果有多个参数,应按形参顺序填入实参,也用逗号分隔(3)宏展开:在汇编时,宏指令被汇编程序[33]用对应的代码序列替代,这就是宏展开宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体完全替代源程序的宏指令,同时用位置匹配的实参对形参进行取代3.38 解:宏调用的参数通过形参、实参结合实现传递,简捷直观、灵活多变。宏汇编的一大特色是它的参数。宏定义时既可以无参数,也可以有一个或多个参数;宏调用时实参的形式也非常灵活,可以是常数、变量、存储单元[34]、指令(操作码[35])或它们的一部分,也可以是表达式;只要宏展开后符合汇编语言的语法规则即可。3.39 解:宏:仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序[36],执行速度没有改变通过形参、实参结合实现参数传递,简捷直观、灵活多变子程序:还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码[37]较短,执行速度减慢需要利用寄存器、存储单元或堆栈等传递参数选择:宏与子程序具有各自的特点,程序员应该根据具体问题选择使用那种方法。通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序3.40 编写一个宏指令move doprnd,soprnd,它实现任意寻址方式[38]的字量源操作数[39]soprnd送到目的操作数doprnd,包括存储单元到存储单元的传送功能。答:move macro doprnd,soprndmov ax,soprndmov doprnd,axendm3.41 定义一个宏logical,用它代表4条逻辑运算指令:and/or/xor/test。注意需要利用3个形式参数[40],并给出一个宏调用以及对应宏展开的例子。答:logical macro lcode,dopd,sopdlcode dopd,sopdendm例如,如果使用“and ax,[bx]”指令,可以利用该宏定义,写出宏指令如下:logical and,ax,[bx]3.42 解:utol macrolocal nextcmp al,’A’ ;小于“A”不转换jb nextcmp al,’Z’ ;大于“A”不转换ja nextadd al,20h ;是大写字母则转换为小写字母next:endm3.43 定义一个宏movestr strn,dstr,sstr,它将strn个字符从一个字符区sstr传送到另一个字符区dstr
第一章
1.1 解:五代,详细见书
1.2 解:微型计算机:以大规模、超大规模集成电路[1]为主要部件,以集成了计算机主要部件——控制器和运算器[2]的微处理器[3]为核心,所构造出的计算机系统 。PC机:PC(Personal Computer)机就是面向个人单独使用的一类微机 。单片机:用于控制的微处理器芯片,部除CPU外还集成了计算机的其他一些主要部件,如:ROM、RAM、定时器、并行接口、串行接口,有的芯片还集成了A/D、D/A转换电路[4]等。数字信号处理器[5]DSP:主要面向大流量数字信号[6]的实时处理[7],在宿主系统中充当数据处理[8]中心,在网络通信、多媒体应用等领域正得到越来越多的应用
1.3 解:微机主要有存储器[9]、I/O设备和I/O接口、CPU、系统总线、操作系统和应用软件组成,各部分功能如下:CPU:统一协调和控制系统中的各个部件系统总线:传送信息存储器:存放程序和数据I/O设备:实现微机的输入输出功能I/O接口:I/O设备与CPU的桥梁操作系统:管理系统所有的软硬件资源
1.4 解:系统总线:传递信息的一组公用导线,CPU通过它们与存储器和I/O设备进行信息交换 。好处:组态灵活、扩展方便三组信号线[10]:数据总线[11]、地址总线[12]和控制总线[13] 。其使用特点是:在某一时刻,只能由一个总线主控[14]设备来控制系统总线,只能有一个发送者向总线发送信号;但可以有多个设备从总线上同时获得信号。
1.5解:(1)用于数值计算、数据处理及信息管理方向。采用通用微机,要求有较快的工作速度、较高的运算精度、较大的存容量和较完备的输入输出设备[15],为用户提供方便友好的操作界面和简便快捷的维护、扩充手段。(2)用于过程控制[16]及嵌人应用方向。采用控制类微机,要求能抵抗各种干扰、适应现场的恶劣环境、确保长时间稳定地工作,要求其实时性要好、强调其体积要小、便携式应用强调其省电。
1.6 解:
1.7 解:I/O通道:位于CPU和设备控制器[17]之间,其目的是承担一些原来由CPU处理的I/O任务,从而把CPU从繁杂的I/O任务中解脱出来。由10根信号线组成(A9-A0)。子程序[18]和主程序使用同一个变量名存取数据就是利用共享变量(全局变量[19])进行参数传递[20]如果变量定义和使用不在同一个源程序[21]中,需要利用PUBLIC、EXTREN声明如果主程序还要利用原来的变量值,则需要保护和恢复利用共享变量传递参数,子程序的通用性较差,但特别适合在多个程序段[22]间、尤其在不同的程序模块间传递数据(3)用堆栈传递参数参数传递还可以通过堆栈这个临时存储区。主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈取得它们采用堆栈传递参数是程式化的,它是编译程序[23]处理参数传递、以及汇编语言[24]与高级语言[25]混合编程时的常规方法
3.32 解:方法:主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈取得它们注意:压栈与弹栈必须要一一对应。
3.33 解:方法1:neg32 proc ;入口参数:D
X.AX=32位有符号数neg ax ;实现0-D
X.AX功能neg dxsbb dx,0 ;这条指令也可以用dec dx代替retneg32 endp ;出口参数:D
X.AX=32位有符号数的补码方法2:neg32 proc ;入口参数:D
X.AX=32位有符号数not ax ;实现D
X.AX求反加1not dxadd ax,1adc dx,0retneg32 endp ;出口参数:D
X.AX=32位有符号数的补码
3.34 解:;数据段array db 12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h ;数组count equ $-array ;数组元素个数result db ? ;校验和[26];代码段mov bx,offset array ;BX←数组的偏移地址mov cx,count ;CX←数组的元素个数call checksum ;调用求和过程mov result,al ;处理出口参数mov ax,4c00hint 21h;计算字节校验和的通用过程;入口参数:DS:BX=数组的段地址:偏移地址,CX=元素个数;出口参数:AL=校验和;说明:除AX/BX/CX外,不影响其他寄存器[27]checksum procxor al,al ;累加器[28]清0sum: add al,[bx] ;求和inc bx ;指向下一个字节loop sumretchecksum endpend
3.35 解:⑴.model small.stack.datawdata dw 34abh.code.startupmov ax,wdatacall dispa.exit 0;dispa procpush cxpush dxmov cl,4mov dl,ahshr dl,clcall dldispmov dl,ahand dl,0fhcall dldispmov dl,alshr dl,clcall dldispmov dl,aland dl,0fhcall dldisppop dxpop cxretdispa endp;dldisp procpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1: mov ah,2int 21hpop axretdldisp endpend⑵.model small.stack.datawdata dw 34abhwordtemp dw ?.code.startupmov ax,wdatamov wordtemp,axcall dispa.exit 0;dispa procpush cxpush dxmov cl,4mov dl,byte ptr wordtemp+1shr dl,clcall dldispmov dl,byte ptr wordtemp+1and dl,0fhcall dldispmov dl,byte ptr wordtempshr dl,clcall dldispmov dl,byte ptr wordtempand dl,0fhcall dldisppop dxpop cxretdispa endp;dldisp procpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1: mov ah,2int 21hpop axretdldisp endpend⑶.model small.stack.datawdata dw 34abh.code.startuppush wdatacall dispapop ax ;add sp,2.exit 0;dispa procpush bpmov bp,sppush axpush cxpush dxmov ax,[bp+4]mov cl,4mov dl,ahshr dl,clcall dldispmov dl,ahand dl,0fhcall dldispmov dl,alshr dl,clcall dldispmov dl,aland dl,0fhcall dldisppop dxpop cxpop axpop bpretdispa endp;dldisp procpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1: mov ah,2int 21hpop axretdldisp endpend
3.36 解:如果利用共享变量传递函数[29],且变量定义和使用不在同一个源程序中,需要利用PUBLIC、EXTERN声明。
3.37 解:(1)宏定义由一对宏汇编伪指令[30]MACRO和ENDM来完成,格式如下:宏名 MACRO [形参表]…… ;宏定义体ENDM宏定义之后就可以使用它,即宏调用:宏名 [实参[31]表](2)宏调用的格式同一般指令一样:在使用宏指令[32]的位置写下宏名,后跟实体参数;如果有多个参数,应按形参顺序填入实参,也用逗号分隔(3)宏展开:在汇编时,宏指令被汇编程序[33]用对应的代码序列替代,这就是宏展开宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体完全替代源程序的宏指令,同时用位置匹配的实参对形参进行取代
3.38 解:宏调用的参数通过形参、实参结合实现传递,简捷直观、灵活多变。宏汇编的一大特色是它的参数。宏定义时既可以无参数,也可以有一个或多个参数;宏调用时实参的形式也非常灵活,可以是常数、变量、存储单元[34]、指令(操作码[35])或它们的一部分,也可以是表达式;只要宏展开后符合汇编语言的语法规则即可。
3.39 解:宏:仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序[36],执行速度没有改变通过形参、实参结合实现参数传递,简捷直观、灵活多变子程序:还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码[37]较短,执行速度减慢需要利用寄存器、存储单元或堆栈等传递参数选择:宏与子程序具有各自的特点,程序员应该根据具体问题选择使用那种方法。通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序
3.40 编写一个宏指令move doprnd,soprnd,它实现任意寻址方式[38]的字量源操作数[39]soprnd送到目的操作数doprnd,包括存储单元到存储单元的传送功能。答:move macro doprnd,soprndmov ax,soprndmov doprnd,axendm
3.41 定义一个宏logical,用它代表4条逻辑运算指令:and/or/xor/test。注意需要利用3个形式参数[40],并给出一个宏调用以及对应宏展开的例子。答:logical macro lcode,dopd,sopdlcode dopd,sopdendm例如,如果使用“and ax,[bx]”指令,可以利用该宏定义,写出宏指令如下:logical and,ax,[bx]
3.42 解:utol macrolocal nextcmp al,’A’ ;小于“A”不转换jb nextcmp al,’Z’ ;大于“A”不转换ja nextadd al,20h ;是大写字母则转换为小写字母next:endm
3.43 定义一个宏movestr strn,dstr,sstr,它将strn个字符从一个字符区sstr传送到另一个字符区dstr
1.1 解:五代,详细见书
1.2 解:微型计算机:以大规模、超大规模集成电路[1]为主要部件,以集成了计算机主要部件——控制器和运算器[2]的微处理器[3]为核心,所构造出的计算机系统 。PC机:PC(Personal Computer)机就是面向个人单独使用的一类微机 。单片机:用于控制的微处理器芯片,部除CPU外还集成了计算机的其他一些主要部件,如:ROM、RAM、定时器、并行接口、串行接口,有的芯片还集成了A/D、D/A转换电路[4]等。数字信号处理器[5]DSP:主要面向大流量数字信号[6]的实时处理[7],在宿主系统中充当数据处理[8]中心,在网络通信、多媒体应用等领域正得到越来越多的应用
1.3 解:微机主要有存储器[9]、I/O设备和I/O接口、CPU、系统总线、操作系统和应用软件组成,各部分功能如下:CPU:统一协调和控制系统中的各个部件系统总线:传送信息存储器:存放程序和数据I/O设备:实现微机的输入输出功能I/O接口:I/O设备与CPU的桥梁操作系统:管理系统所有的软硬件资源
1.4 解:系统总线:传递信息的一组公用导线,CPU通过它们与存储器和I/O设备进行信息交换 。好处:组态灵活、扩展方便三组信号线[10]:数据总线[11]、地址总线[12]和控制总线[13] 。其使用特点是:在某一时刻,只能由一个总线主控[14]设备来控制系统总线,只能有一个发送者向总线发送信号;但可以有多个设备从总线上同时获得信号。
1.5解:(1)用于数值计算、数据处理及信息管理方向。采用通用微机,要求有较快的工作速度、较高的运算精度、较大的存容量和较完备的输入输出设备[15],为用户提供方便友好的操作界面和简便快捷的维护、扩充手段。(2)用于过程控制[16]及嵌人应用方向。采用控制类微机,要求能抵抗各种干扰、适应现场的恶劣环境、确保长时间稳定地工作,要求其实时性要好、强调其体积要小、便携式应用强调其省电。
1.6 解:
1.7 解:I/O通道:位于CPU和设备控制器[17]之间,其目的是承担一些原来由CPU处理的I/O任务,从而把CPU从繁杂的I/O任务中解脱出来。由10根信号线组成(A9-A0)。子程序[18]和主程序使用同一个变量名存取数据就是利用共享变量(全局变量[19])进行参数传递[20]如果变量定义和使用不在同一个源程序[21]中,需要利用PUBLIC、EXTREN声明如果主程序还要利用原来的变量值,则需要保护和恢复利用共享变量传递参数,子程序的通用性较差,但特别适合在多个程序段[22]间、尤其在不同的程序模块间传递数据(3)用堆栈传递参数参数传递还可以通过堆栈这个临时存储区。主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈取得它们采用堆栈传递参数是程式化的,它是编译程序[23]处理参数传递、以及汇编语言[24]与高级语言[25]混合编程时的常规方法
3.32 解:方法:主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈取得它们注意:压栈与弹栈必须要一一对应。
3.33 解:方法1:neg32 proc ;入口参数:D
X.AX=32位有符号数neg ax ;实现0-D
X.AX功能neg dxsbb dx,0 ;这条指令也可以用dec dx代替retneg32 endp ;出口参数:D
X.AX=32位有符号数的补码方法2:neg32 proc ;入口参数:D
X.AX=32位有符号数not ax ;实现D
X.AX求反加1not dxadd ax,1adc dx,0retneg32 endp ;出口参数:D
X.AX=32位有符号数的补码
3.34 解:;数据段array db 12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h ;数组count equ $-array ;数组元素个数result db ? ;校验和[26];代码段mov bx,offset array ;BX←数组的偏移地址mov cx,count ;CX←数组的元素个数call checksum ;调用求和过程mov result,al ;处理出口参数mov ax,4c00hint 21h;计算字节校验和的通用过程;入口参数:DS:BX=数组的段地址:偏移地址,CX=元素个数;出口参数:AL=校验和;说明:除AX/BX/CX外,不影响其他寄存器[27]checksum procxor al,al ;累加器[28]清0sum: add al,[bx] ;求和inc bx ;指向下一个字节loop sumretchecksum endpend
3.35 解:⑴.model small.stack.datawdata dw 34abh.code.startupmov ax,wdatacall dispa.exit 0;dispa procpush cxpush dxmov cl,4mov dl,ahshr dl,clcall dldispmov dl,ahand dl,0fhcall dldispmov dl,alshr dl,clcall dldispmov dl,aland dl,0fhcall dldisppop dxpop cxretdispa endp;dldisp procpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1: mov ah,2int 21hpop axretdldisp endpend⑵.model small.stack.datawdata dw 34abhwordtemp dw ?.code.startupmov ax,wdatamov wordtemp,axcall dispa.exit 0;dispa procpush cxpush dxmov cl,4mov dl,byte ptr wordtemp+1shr dl,clcall dldispmov dl,byte ptr wordtemp+1and dl,0fhcall dldispmov dl,byte ptr wordtempshr dl,clcall dldispmov dl,byte ptr wordtempand dl,0fhcall dldisppop dxpop cxretdispa endp;dldisp procpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1: mov ah,2int 21hpop axretdldisp endpend⑶.model small.stack.datawdata dw 34abh.code.startuppush wdatacall dispapop ax ;add sp,2.exit 0;dispa procpush bpmov bp,sppush axpush cxpush dxmov ax,[bp+4]mov cl,4mov dl,ahshr dl,clcall dldispmov dl,ahand dl,0fhcall dldispmov dl,alshr dl,clcall dldispmov dl,aland dl,0fhcall dldisppop dxpop cxpop axpop bpretdispa endp;dldisp procpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1: mov ah,2int 21hpop axretdldisp endpend
3.36 解:如果利用共享变量传递函数[29],且变量定义和使用不在同一个源程序中,需要利用PUBLIC、EXTERN声明。
3.37 解:(1)宏定义由一对宏汇编伪指令[30]MACRO和ENDM来完成,格式如下:宏名 MACRO [形参表]…… ;宏定义体ENDM宏定义之后就可以使用它,即宏调用:宏名 [实参[31]表](2)宏调用的格式同一般指令一样:在使用宏指令[32]的位置写下宏名,后跟实体参数;如果有多个参数,应按形参顺序填入实参,也用逗号分隔(3)宏展开:在汇编时,宏指令被汇编程序[33]用对应的代码序列替代,这就是宏展开宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体完全替代源程序的宏指令,同时用位置匹配的实参对形参进行取代
3.38 解:宏调用的参数通过形参、实参结合实现传递,简捷直观、灵活多变。宏汇编的一大特色是它的参数。宏定义时既可以无参数,也可以有一个或多个参数;宏调用时实参的形式也非常灵活,可以是常数、变量、存储单元[34]、指令(操作码[35])或它们的一部分,也可以是表达式;只要宏展开后符合汇编语言的语法规则即可。
3.39 解:宏:仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序[36],执行速度没有改变通过形参、实参结合实现参数传递,简捷直观、灵活多变子程序:还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码[37]较短,执行速度减慢需要利用寄存器、存储单元或堆栈等传递参数选择:宏与子程序具有各自的特点,程序员应该根据具体问题选择使用那种方法。通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序
3.40 编写一个宏指令move doprnd,soprnd,它实现任意寻址方式[38]的字量源操作数[39]soprnd送到目的操作数doprnd,包括存储单元到存储单元的传送功能。答:move macro doprnd,soprndmov ax,soprndmov doprnd,axendm
3.41 定义一个宏logical,用它代表4条逻辑运算指令:and/or/xor/test。注意需要利用3个形式参数[40],并给出一个宏调用以及对应宏展开的例子。答:logical macro lcode,dopd,sopdlcode dopd,sopdendm例如,如果使用“and ax,[bx]”指令,可以利用该宏定义,写出宏指令如下:logical and,ax,[bx]
3.42 解:utol macrolocal nextcmp al,’A’ ;小于“A”不转换jb nextcmp al,’Z’ ;大于“A”不转换ja nextadd al,20h ;是大写字母则转换为小写字母next:endm
3.43 定义一个宏movestr strn,dstr,sstr,它将strn个字符从一个字符区sstr传送到另一个字符区dstr
题目解答
答案
解:(假设它们都在数据段)
movestr macro strn,dstr,sstr
mov cx,ds
mov es,cx
mov cx,strn
mov di,offset dstr
mov si,offset sstr
cld
rep movsb ;;重复传送ES:[DI]←DS:[SI]
endm