汇编语言程序设计 【课后习题答案】
第五章高级汇编语言程序设计
第四版
--囮裑爲檤
5. 1条件表达式中逻辑与 “ &&表示两者都为真,整个条件才为真,
对于程序
段:
.if (X==5) && (ax!=bx) inc ax .endif
请用转移指令实现上述分支结构,并比较汇编程序生成的代码序列。解:
cmp X, 5 je abc jmp done abc: cmp ax, bx
jne cde jmp done cde: inc ax
done:....
5. 2条件表达式中逻辑与“|表示两者之一为真,整个条件就为真,.if (X==5) || (ax!=bx) inc ax .endif
请用转移指令实现上述分支结构,并比较汇编程序生成的代码序列。cmp X, 5 je abc jmp done cmp ax, bx jne abc jmp done abc: inc ax done: ....
5.3、对于程序段: .while ax!=10 mov [bx],ax inc bx
对于程序段:
解:
inc bx inc ax
.endw 请用处理器指令实现上述循环结构,并比较汇编程序生成的代码序列。
5.4、 对于程序段: .repeat
mov [bx],ax inc bx inc bx inc ax
■until ax=10 请用处理器指令实现上述循环结构,并比较汇编程序生成的代码序列。
5.5、 宏是如何定义、调用和展开的?
解:
宏定义采用一对伪指令实现,格式如下(其中方括号表示可选): 宏名 macro [形参表]
宏定义体
endm
宏调用时,利用宏名带上实参即可,格式如下: 宏名[实参表]
5.6、 宏定义中的形式参数有什么特点,它是如何进行形参和实参结合的?
解:
宏的参数功能非常强大,即可以没有参数,也可以带有一个或多个参数;而且 参数的形式非常灵活,可以是常量、变量、存储单元、指令或它们的一部分, 还可以是表达式等。
宏展开时的形参与实参结合是用位置匹配的实参对形参进行取代。实参个数与 形参个数不同时,多余的实参没有作用,缺少的实参则用空格代替。取代时, 不进行有效性等检查。
5.7、 宏结构和子程序在应用中有什么不同,如何选择采用何种结构?
解:宏汇编的特点是在汇编阶段进行语句展开,无需返回,不减少目标程序代 码,执行速度没有改变;通过形参、实参结合传递参数。宏汇编适合于程序段 较短或要求执行速度快的场合。
子程序在执行阶段需要由主程序执行调用指令
CALL进行调用,进而转入子
程序执行,子程序执行结束执行返回指令 RET返回主程序。子程序如果被多次 使用,则会减少目标程序代码;主程序与子程序之间主要采用寄存器、存储单 元、堆栈等传递参数。子程序适合于程序段较长或为减少目标代码的场合
5.8 没有。。。
5.9、 对于例题5.5b的宏定义shrot,对应如下宏指令的宏展开是什么? shrot word ptr [bx],4,ror
解: shrot word ptr [bx],4,ror
1 push cx 1 mov cl,4
1 ror word ptr [bx],cl
1 pop cx
5.10、 定义一个宏logical,用它代表4条逻辑运算指令:and/or/xor/test,注意需 要利用3个形式参数,并给一个宏调用以及对应宏展开的例子。
解: logical macro lcode,dopd,sopd
lcode dopd,sopd endm
例如,如果使用“ and ax,[bx]指令,可以利用该宏定义,写出宏指令如下:
logical and,ax,[bx]
初看起来,这个问题似乎比较难解决。实际上,这 指令操作数格式,所以可以归纳为如上宏定义。
4条逻辑指令都具有相同的
5.11没有。。
5.12、编写一个宏指令move doprnd,soprnd它实现任意寻址方式的字量源操作 数送
到目的操作数,包括存储单元到存储单元的传送功能。 解:move MACRO doprnd,soprnd
push ax mov ax,soprnd mov doprnd,ax pop ax ENDM
5.13;
movstr strN, dstr,sstr
lea si, sstr lea di, dstr mov cx, strN
cld rep movsb endm
5.14;①ABSDIF Pl , P2, DISTANCE
1 push ax 1 mov ax,P1 1 sub ax,P2 1 cmp ax,0 1 jge ?? 0000 1 neg ax 1 ?? 0000
② ABSDIF [BX] , [SI], [DI]
答:1 push ax
1 mov ax,[bx] 1 sub ax,[si] 1 cmp ax,0 1 jge ?? 0000 1 neg ax 1 ?? 0000
1 mov [di],ax
1 pop ax
1 mov DISTANCE, ax 1 pop ax
5.15; wtemp =2 repeat 100 dw 0
dw wtemp wtemp =wtemp+2 endm
5.18; DOS21H MACRO callnum,calladdress mov ah,callnum
ifnb
mov dx,calladdress endif int 21h ENDM
5.22; 1.编写主程序,并进行汇编产生 OBJ模块; 2. 编写独立的子程序,也进行汇编产生 OBJ模块;
3. 分别编写主程序与子程序时,需要处理好共用变量、过程、逻辑段属性、参 数传递等问
题;
4. 利用连接程序将主程序模块和子程序模块连接起来,形成完整的可执行程序 5.28;;数
据段 table dw 2277,2138,1808,1709,1522,1356,1208,1139
;对应中音1 ~ 7和高音i的定时器记数值
;代码段
mov al,0b6h out 43h,al
aga in: mov ah,1
int 21h cmp al, ' 1' jb n ext
cmp al, ' 8' ja n ext sub al,30h
;设置定时器2工作方式
;等待按键
;判断是否为数字1?8
;1?8的ASCII码转换为二进制数
sub al,1
;再减1,将数字1?8变为0?7,以便查表
xor ah,ah shl ax,1 mov bx,ax
;记数值表是16位数据,无法采用xlat指令
;乘以 2
mov ax,table[bx] ;取出对应的记数值
out 42h,al
;设置定时器2的记数值
mov al,ah out 42h,al in al,61h
;打开扬声器声音
or al,03h out 61h,al jmp aga in
;使D1D0= PB1PB4 11b,其他位不变
;连续发声,直到按下另一个键
n ext: push ax
in al,61h and al,Ofch
;不是数字1?8,则关闭扬声器声音
;使 D1DB PB1PB4 00b,其他位不变