(1)1000超出了一个字节范围
(2)寄存器的值只有程序执行时才能确定,而offset是汇编过程计算的偏移地址,故无法确定,改
为lea bx,myword[si]
(3)两个都是存储单元,指令不允许
(4)变量值只有执行时才确定,汇编过程不能计算 (5)字节量AL与字量myword,类型不匹配 (6)Jcc指令只有相对寻址方式,不支持间接寻址方式
〔习题3.10〕OPR1是一个常量,问下列语句中两个AND操作有什么区别?
AND AL,OPR1 AND 0feh
〔解答〕
前者为“与”操作硬指令助记符,可汇编成机器代码。 后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。
〔习题3.11〕给出下列语句中,指令立即数(数值表达式)的值:
(1) mov al,23h AND 45h OR 67h
(2) mov ax,1234h/16+10h (3) mov ax,NOT(65535 XOR 1234h) (4) mov al,LOW 1234h OR HIGH 5678h
(5) mov ax,23h SHL 4 (6) mov ax,1234h SHR 6 (7) mov al,?a? AND (NOT(?a?-?A?)) (8) mov al,?H? OR 00100000b (9) mov ax,(76543 LT 32768) XOR 7654h
〔解答〕
注:对于逻辑运算,有关操作数可化为二进制数。
(1)67h (2)133h (3)1234h (4)76h (5)0234h (6)0048h
(7)41h (8)68h (9)7654h
〔习题3.12〕为第2章例题2.54定义变量count、block、dplus和dminus。
〔解答〕
假设block开始的数据块有32个字节数据:16个正数+100 (64h)、16个负数 -48 (0d0h)
分别连续分布:
block db 16 dup(100),16 dup(-48) ;也可以是任意字节数据,随意分布。
dplus db 32 dup(?) ;为正数预留存储空间 dminus db 32 dup(?) ;为负数预留存储空间
count equ 32 ;字节数
〔习题3.13〕为第2章例题2.55定义相应变量,并形成一个完整的汇编语言程序。
〔解答〕 ;lt239b.asm .model small
.stack .data
string1 db 'good morning !' ;两字符串可相同或不同,但字符数要求相同。
string2 db 'Good morning !' result db ? ;预留结果字节 count = 14 ;字符数
.code .startup
mov ax,ds ;所有数据在同一个段,所以使es=ds
mov es,ax mov si,offset string1 mov di,offset string2
mov cx,count again: cmpsb
jnz unmat dec cx jnz again mov al,0 jmp output unmat: mov al,0ffh output: mov result, al
.exit0 end
〔习题3.14〕画图说明下列语句分配的存储空间及初始化的数据值:
(1) byte_var DB ?ABC?,10,10h,?EF?,3 DUP(-1,?,3 DUP(4))
(2) word_var DW 10h,-5,?EF?,3 DUP(?)
〔解答〕
(1)从低地址开始,依次是(十六进制表达):
41 42 43 0a 10 45 46 ff - 04 04 04 ff - 04 04 04 ff - 04 04 04
(2)从低地址开始,依次是(十六进制表达): 10 00 FB FF 46 45 - - - - - -
〔习题3.15〕请设置一个数据段mydataseg,按照如下要求定义变量:
(1) my1b为字符串变量:Personal Computer (2) my2b为用十进制数表示的字节变量:20 (3) my3b为用十六进制数表示的字节变量:20 (4) my4b为用二进制数表示的字节变量:20
(5) my5w为20个未赋值的字变量
(6) my6c为100的常量
(7) my7c表示字符串:Personal Computer
〔解答〕 mydataseg segment my1b db ?Personal Computer?
my2b db 20
my3b db 14h ;20h my4b db 00010100b my5w dw 20 dup(?)
my6c equ 100 ;my6c = 100 my7c equ
mydataseg ends
〔习题3.16〕分析例题3.2的数据段,并上机观察数据的存储形式。
〔解答〕
以字节为单位从低地址向高地址依次是:
16 00 12
FFH FFH FFH FFH 00 00 00 00 00 00 00 00
1 2 3 4 5
45H 23H 00 00 00 00 00 00 00 00
?a? ?b? ?c?
?H? ?e? ?l? ?l? ?o? 13 10 ?$?
12个字符串?month?,每个字符串从低地址到高地址依次是:?m? ?o? ?n? ?t? ?h?
25×4个字节未定义初值的存储单元,操作系统设置为0
〔习题3.17〕修改例题3.3,现在用字定义伪指令dw、字串传送指令movsw和字符串显示9号功能调用
实现。 〔解答〕 .model small .stack .data
source dw 3433h,3635h target dw 40 dup(?),'$'
.code .startup mov ax,ds
mov es,ax
cld
mov si,offset source mov di,offset target
mov cx,40 rep movsw mov si,0 mov dx,offset target
mov ah,9 int 21h .exit 0 end
〔习题3.18〕变量和标号有什么属性?
〔解答〕
段地址:表示变量和标号所在代码段的段地址; 偏移地址:表示变量和标号所在代码段的段内偏移地址;
类型:引用变量时,表示是字节、字、双字等数据量。引用该标号时,表示它所在同一个段――near
类型,还是另外一个段――far类型。
〔习题3.19〕设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:
mydata segment ORG 100H VARW DW 1234H,5678H
VARB DB 3,4 ALIGN 4 VARD DD 12345678H
EVEN BUFF DB 10 DUP(?) MESS DB ?HELLO? BEGIN: MOV AX,OFFSET MESS
MOV AX,TYPE BUFF+TYPE MESS+TYPE VARD