dispa
dispa
dldisp
dldisp1:
dldisp ⑵
wdata wordtemp
参考
. . . .
proc push cx push dx mov cl,4 mov dl,ah shr dl,cl call dldisp mov dl,ah and dl,0fh call dldisp mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx ret endp ; proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 mov ah,2 int 21h pop ax ret endp end
.model small .stack .data dw 34abh dw ? .code .startup mov ax,wdata mov wordtemp,ax call dispa
dispa
dispa
dldisp
dldisp1:
dldisp ⑶
wdata
参考
. . . .
.exit 0 ; proc push cx push dx mov cl,4
mov dl,byte ptr wordtemp+1 shr dl,cl call dldisp
mov dl,byte ptr wordtemp+1 and dl,0fh call dldisp
mov dl,byte ptr wordtemp shr dl,cl call dldisp
mov dl,byte ptr wordtemp and dl,0fh call dldisp pop dx pop cx ret endp ; proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 mov ah,2 int 21h pop ax ret endp end
.model small .stack .data dw 34abh .code .startup push wdata call dispa
. . . .
pop ax ;add sp,2 .exit 0 ; dispa proc push bp mov bp,sp push ax push cx push dx mov ax,[bp+4] mov cl,4 mov dl,ah shr dl,cl call dldisp mov dl,ah and dl,0fh call dldisp mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx pop ax pop bp ret dispa endp ; dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 dldisp1: mov ah,2 int 21h pop ax ret dldisp endp end 3.36 解:
如果利用共享变量传递函数,且变量定义和使用不在同一个源程序中,需要利用
参考
. . . .
PUBLIC、EXTERN声明。
3.37 解:
(1)宏定义由一对宏汇编伪指令MACRO和ENDM来完成,格式如下: 宏名 MACRO [形参表] …… ;宏定义体 ENDM 宏定义之后就可以使用它,即宏调用: 宏名 [实参表]
(2)宏调用的格式同一般指令一样:在使用宏指令的位置写下宏名,后跟实体参数;如果有多个参数,应按形参顺序填入实参,也用逗号分隔
(3)宏展开:在汇编时,宏指令被汇编程序用对应的代码序列替代,这就是宏展开 宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体完全替代源程序的宏指令,同时用位置匹配的实参对形参进行取代
3.38 解:
宏调用的参数通过形参、实参结合实现传递,简捷直观、灵活多变。宏汇编的一大特色是它的参数。宏定义时既可以无参数,也可以有一个或多个参数;宏调用时实参的形式也非常灵活,可以是常数、变量、存储单元、指令(操作码)或它们的一部分,也可以是表达式;只要宏展开后符合汇编语言的语法规则即可。
3.39 解:
宏:仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序,执行速度没有改变
通过形参、实参结合实现参数传递,简捷直观、灵活多变
子程序:还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢 需要利用寄存器、存储单元或堆栈等传递参数
选择:宏与子程序具有各自的特点,程序员应该根据具体问题选择使用那种方法。通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序
3.40 编写一个宏指令move doprnd,soprnd,它实现任意寻址方式的字量源操作数soprnd送到目的操作数doprnd,包括存储单元到存储单元的传送功能。 答: move macro doprnd,soprnd mov ax,soprnd mov doprnd,ax endm
3.41 定义一个宏logical,用它代表4条逻辑运算指令:and/or/xor/test。注意需要利用3个形式参数,并给出一个宏调用以及对应宏展开的例子。 答: logical macro lcode,dopd,sopd
参考
. . . .
lcode dopd,sopd endm
例如,如果使用“and ax,[bx]”指令,可以利用该宏定义,写出宏指令如下: logical and,ax,[bx]
3.42 解: utol macro local next cmp al,’A’ ;小于“A”不转换 jb next cmp al,’Z’ ;大于“A”不转换 ja next add 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
第五章
5.1 解:
主存的作用:保存正在使用的、处于活动状态的程序和数据。
辅存的作用:长期保存程序文件和数据文件,在需要时将这些文件调入RAM内存并激活使用。
cache的作用:提高对存储器的访问速度。
虚拟存储:由容量较小的主存和容量较大的辅存构成,其目标是扩大程序员眼中的主存容量。
区别:通过存储器访问指令用户可对主存进行随机访问;用户利用操作系统提供的用户命令和功能调用对辅存进行访问。
5.2 在半导体存储器中,RAM指的是 随机存取存储器 ,他可读可写,但断电后信息一般会 丢失 ;而ROM指的是 只读存储器 ,正常工作时只能从中 读取 信息,但断电后信息 不会丢失 。以EPROM芯片2764为例,其存储容量为8K×8位,共有 8 条数据线
参考