文档库 最新最全的文档下载
当前位置:文档库 › 汇编语言课后习题答案 王爽主编

汇编语言课后习题答案 王爽主编

补全编程,利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。

assume cs:code

code segment

start: mov ax,2000h

mov ds,ax

mov bx,0

s: mov ch,0

mov cl,[bx]

jcxz ok ;当cx=0时,CS:IP指向OK

inc bx

jmp short s

ok: mov dx,bx

mov ax ,4c00h

int 21h

code ends

end start

检测点9.3

补全编程,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。

assume cs:code

code segment

start: mov ax,2000h

mov ds,ax

mov bx,0

s:mov cl,[bx]

mov ch,0

inc cx

inc bx

loop s

ok:dec bx

mov dx,bx

mov ax,4c00h

int 21h

code ends

end start

书P101,执行loop s时,首先要将(cx)减1。

“loop 标号”相当于

dec cx

if((cx)≠0) jmp short 标号

检测点10.1

补全程序,实现从内存1000:0000处开始执行指令。

assume cs:code

stack segment

db 16 dup (0)

stack ends

code segment

start: mov ax,stack

mov ss,ax

mov sp,16

mov ax, 1000h

mov ax, 0

push ax

retf

code ends

end start

执行reft指令时,相当于进行:

pop ip

pop cs

根据栈先进后出原则,应先将段地址cs入栈,再将偏移地址ip入栈。

检测点10.3

下面的程序执行后,ax中的数值为多少?

内存地址机器码汇编指令执行后情况

1000:0 b8 00 00 mov ax,0 ax=0,ip指向1000:3

1000:3 9a 09 00 00 10 call far ptr s pop cs,pop ip,ip指向1000:9

1000:8 40 inc ax

1000:9 58 s:pop ax ax=8h

add ax,ax ax=10h

pop bx bx=1000h

add ax,bx ax=1010h

用debug进行跟踪确认,“call far ptr s”是先将该指令后的第一个字节段地址cs=1000h入栈,再将偏移地址ip=8h入栈,最后转到标号处执行指令。

出栈时,根据栈先进后出的原则,先出的为ip=8h,后出的为cs=1000h

检测点10.4

下面的程序执行后,ax中的数值为多少?

内存地址机器码汇编指令执行后情况

1000:0 b8 06 00 mov ax,6 ax=6,ip指向1000:3

1000:3 ff d0 call ax pop ip,ip指向1000:6

1000:5 40 inc ax

1000:6 58 mov bp,sp bp=sp=fffeh

add ax,[bp] ax=[6+ds:(fffeh)]=6+5=0bh

用debug进行跟踪确认,“call ax(16位reg)”是先将该指令后的第一个字节偏移地址ip入栈,再转到偏移地址为ax(16位reg)处执行指令。

检测点10.5

(1)下面的程序执行后,ax中的数值为多少?

assume cs:code

stack segment

dw 8 dup (0)

stack ends

code segment

start: mov ax,stack

mov ss,ax

mov sp,16

mov ds,ax

mov ax,0

call word ptr ds:[0eh]

inc ax

inc ax

mov ax,4c00h

int 21h

code ends

end start

推算:

执行call word ptr ds:[0eh]指令时,先cs入栈,再ip=11入栈,最后ip转移到(ds:[0eh])。(ds:[0eh])=11h,执行inc ax……最终ax=3

题中特别关照别用debug跟踪,跟踪结果不一定正确,但还是忍不住去试试,看是什么结果。

根据单步跟踪发现,执行call word ptr ds:[0eh]指令时,显示ds:[0eh]=065D。

ds:0000~ds:0010不是已设置成stack数据段了嘛,不是应该全都是0的嘛。

于是进行了更详细的单步跟踪,发现初始数据段中数据确实为0,但执行完mov ss,ax;mov sp,16这两条指令后,数据段中数据发生改变。这是为什么呢?中断呗~~~~

检测点10.5

(2)下面的程序执行后,ax和bx中的数值为多少?

assume cs:codesg

stack segment

dw 8 dup(0)

stack ends

codesg segment

start:

mov ax,stack

mov ss,ax

mov sp,10h

mov word ptr ss:[0],offset s ;(ss:[0])=1ah

mov ss:[2],cs ;(ss:[2])=cs

call dword ptr ss:[0] ;cs入栈,ip=19h入栈,转到cs:1ah处执行指令

;(ss:[4])=cs,(ss:[6])=ip

nop

s: mov ax,offset s ;ax=1ah

sub ax,ss:[0ch] ;ax=1ah-(ss:[0ch])=1ah-19h=1

mov bx,cs ;bx=cs=0c5bh

sub bx,ss:[0eh] ;bx=cs-cs=0

mov ax,4c00h

int 21h

codesg ends

end start

C:\DOCUME~1\ADMINI~1>debug jc10-5.exe

-u

0C5B:0000 B85A0C MOV AX,0C5A

0C5B:0003 8ED0 MOV SS,AX

0C5B:0005 BC1000 MOV SP,0010

0C5B:0008 36 SS:

0C5B:0009 C70600001A00 MOV WORD PTR [0000],001A

0C5B:000F 36 SS:

0C5B:0010 8C0E0200 MOV [0002],CS

0C5B:0014 36 SS:

0C5B:0015 FF1E0000 CALL FAR [0000]

0C5B:0019 90 NOP

0C5B:001A B81A00 MOV AX,001A

0C5B:001D 36 SS:

0C5B:001E 2B060C00 SUB AX,[000C]

-u

0C5B:0022 8CCB MOV BX,CS

0C5B:0024 36 SS:

0C5B:0025 2B1E0E00 SUB BX,[000E]

0C5B:0029 B8004C MOV AX,4C00

课程设计一

将实验7中的Power idea公司的数据按照图所示的格式在屏幕上显示现来

table segment

db '1975','1976','1977','1978','1979','1980','1981','1982','1983'

db '1984','1985','1986','1987','1988','1989','1990','1991','1992'

db '1993','1994','1995'

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

dw 11542,14430,15257,17800

dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239

dw 260,304,333

table ends

data segment

db 32 dup (0)

data ends

code segment

start: mov ax,data

mov ds,ax

mov ax,table

mov es,ax

mov bx,0

mov si,0

mov di,0

mov cx,21

mov dh,2

mov dl,30

g: push cx

push dx

mov ax,es:[bx]

mov [si],ax

mov ax,es:[bx].2

mov [si].2,ax ;年份入ds:si

add si,6

mov ax,es:[bx].84

mov dx,es:[bx].86

call dtoc2 ;收入转成十进制字符入ds:si

add si,10

mov ax,es:[di].168

mov dx,0

call dtoc2 ;人员数转成十进制字符入ds:si

add si,6

mov ax,es:[di].210

mov dx,0

call dtoc2 ;人均收入转成十进制字符入ds:si

mov si,0 ;设置ds:si指向需显示字符首地址

b: mov cx,29

c: push cx

mov cl,[si]

jcxz f ;(ds:si)=0转到f执行

d: inc si

pop cx

loop c

inc si

mov al,0

mov [si],al ;设置结尾符0

mov si,0 ;设置ds:si指向需显示字符首地址

pop dx

mov cl,2

call show_str

add bx,4 ;dword数据指向下一数据单元

add di,2 ;word数据指向下一数据单元

add dh,1 ;指向显存下一行

pop cx

loop g

mov ax,4c00h

int 21h

f: mov al,20h

mov [si],al ;(ds:si)=0的数据改成空格

jmp d

;名称:dtoc2

;功能:将dword型数据转变为表示十进制的字符串,字符串以0为结尾符。;参数:(ax)=dword型数据的低16位;

; (dx)=dword型数据的高16位;

; ds:si指向字符串首地址。

;返回:无。

dtoc2:

push ax

push bx

push cx

push dx

push si

push di

mov di,0

d20: mov cx,10 ;除数为10

call divdw

add cx,30h ;余数+30h,转为字符

push cx ;字符入栈

inc di ;记录字符个数

mov cx,ax

jcxz d21 ;低位商=0时,转到d21检测高位商

jmp d20

d21: mov cx,dx

jcxz d22 ;高低位商全=0时,转到d22执行

jmp d20

d22: mov cx,di

d23: pop ax ;字符出栈

mov [si],al

inc si ;ds:si指向下一单元

loop d23

mov al,0

mov [si],al ;设置结尾符0

pop di

pop si

pop dx

pop cx

pop bx

pop ax

ret

;名称:divdw

;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。;参数:(ax)=dword型数据的低16位;

; (dx)=dword型数据的高16位;

; (cx)=除数。

;返回:(dx)=结果的高16位;

; (ax)=结果的低16位;

; (cx)=余数。

divdw:

push si

push bx

push ax

mov ax,dx

mov dx,0

div cx ;被除数的高位/cx

mov si,ax

pop ax

div cx ;(被除数高位的商+低位)/cx

mov cx,dx ;余数入cx

mov dx,si ;高位的商入dx

pop bx

pop si

ret

;名称:show_str

;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。

;参数:(dh)=行号(取值范围0~24);

; (dl)=列号(取值范围0~79);

; (cl)=颜色;

; ds:si指向字符串的首地址。

;返回:无。

show_str:

push ax

push bx

push es

push si

mov ax,0b800h

mov es,ax

mov ax,160

mul dh

mov bx,ax ;bx=160*dh

mov ax,2

mul dl ;ax=dl*2

add bx,ax ;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址

mov al,cl ;把颜色cl赋值al

mov cl,0

show0:

mov ch,[si]

jcxz show1 ;(ds:si)=0时,转到show1执行

mov es:[bx],ch

mov es:[bx].1,al

inc si ;ds:si指向下一个字符地址

add bx,2 ;es:bx指向下一个显存地址

jmp show0

show1:

pop si

pop es

pop bx

pop ax

ret

code ends

end start

检测点11.1

写出下面每条指令执行后,ZF、PF、SF、等标志位的值。

sub al,al al=0h ZF=1 PF=1 SF=0

mov al,1 al=1h ZF=1 PF=1 SF=0

push ax ax=1h ZF=1 PF=1 SF=0

pop bx bx=1h ZF=1 PF=1 SF=0

add al,bl al=2h ZF=0 PF=0 SF=0

add al,10 al=12h ZF=0 PF=1 SF=0

mul al ax=144h ZF=0 PF=1 SF=0

检测点涉及的相关内容:

ZF是flag的第6位,零标志位,记录指令执行后结果是否为0,结果为0时,ZF=1

PF是flag的第2位,奇偶标志位,记录指令执行后结果二进制中1的个数是否为偶数,结果为偶数时,PF=1

SF是flag的第7位,符号标志位,记录有符号运算结果是否为负数,结果为负数时,SF=1

add、sub、mul、div 、inc、or、and等运算指令影响标志寄存器

mov、push、pop等传送指令对标志寄存器没影响。

检测点11.2

写出下面每条指令执行后,ZF、PF、SF、CF、OF等标志位的值。

al CF OF SF ZF PF

sub al,al 0h/0000 0000b 0 0 0 1 1

mov al,10h 10h/0010 0000b 0 0 0 1 1

add al,90h a0h/1010 0000b 0 0 1 0 1

mov al,80h 80h/1000 0000b 0 0 1 0 1

add al,80h 0h/0000 0000b 1 1 0 1 1

mov al,0fch 0fch/1111 1100b 1 1 0 1 1

add al,05h 1h/0000 0001b 1 0 0 0 0

mov al,7dh 7dh/1111 1101b 1 0 0 0 0

add al,0bh 88h/1000 1000b 0 1 1 0 1

检测点涉及的相关内容:

ZF是flag的第6位,零标志位,记录指令执行后结果是否为0,结果为0时,ZF=1

PF是flag的第2位,奇偶标志位,记录指令执行后结果二进制数中1的个数是否为偶数,结果为偶数时,PF=1

SF是flag的第7位,符号标志位,记录有符号运算结果是否为负数,结果为负数时,SF=1

CF是flag的第0位,进位标志位,记录无符号运算结果是否有进/借位,结果有进/借位时,SF=1

OF是flag的第11位,溢出标志位,记录有符号运算结果是否溢出,结果溢出时,OF=1

add、sub、mul、div 、inc、or、and等运算指令影响flag

mov、push、pop等传送指令对flag没影响

检测点11.3

(1)补全下面的程序,统计F000:0处32个字节中,大小在[32,128]的数据个数。

mov ax,0f000h

mov ds,ax

mov bx,0 ;ds:bx指向第一个字节

mov dx,0 ;初始化累加器

mov cx,32

s: mov al,[bx]

cmp al,32 ;和32进行比较

jb s0 ;如果低于al转到s0,继续循环

cmp al,128 ;和128进行比较

ja s0 ;如果高于al转到s0,继续循环

inc dx

s0: inc bx

loop s

[32,128]是闭区间,包括两端点的值

(32,128)是开区间,不包括两端点的值

检测点11.3

(2)补全下面的程序,统计F000:0处32个字节中,大小在(32,128)的数据个数。

mov ax,0f000h

mov ds,ax

mov bx,0 ;ds:bx指向第一个字节

mov dx,0 ;初始化累加器

mov cx,32

s: mov al,[bx]

cmp al,32 ;和32进行比较

jna s0 ;如果不高于al转到s0,继续循环

cmp al,128 ;和128进行比较

jnb s0 ;如果不低于al转到s0,继续循环

inc dx

s0: inc bx

loop s

[32,128]是闭区间,包括两端点的值

(32,128)是开区间,不包括两端点的值

检测点11.4

下面指令执行后,(ax)= 45h

mov ax,0

push ax

popf

mov ax,0fff0h

add ax,0010h

pushf

pop ax

and al,11000101B

and ah,00001000B

推算过程:

popf后,标志寄存器中,本章节介绍的那些标志位都为0(但是此时标志寄存器并不是所有位置都为0,这个不用关心,没学过的位置用*先代替),向下进行,那么pushf将计算后的当时状态的标志寄存器入栈,然后pop给ax,这是ax是寄存器的值(这个值中包含了我们的*号),接下来就是对那些没有学过的标志位的屏蔽操作,这就是最后两条指令的意义所在,将不确定的位置都归0,那么只剩下我们能够确定的位置了,所以,结果就可以推理出来了。

mov ax,0

push ax

popf

mov ax,0fff0h

add ax,0010h

pushf

pop ax 0 0 0 0 of df if tf sf zf 0 af 0 pf 0 cf

0 0 0 0 0 0 * * 0 1 0 * 0 1 0 1 ax=flag=000000** 010*0101b

and al,11000101B al=01000101b=45h

and ah,00001000B ah=00000000b=0h

C:\DOCUME~1\SNUSER>debug

-a

0BF9:0100 mov ax,0

0BF9:0103 push ax

0BF9:0104 popf

0BF9:0105 mov ax,fff0

0BF9:0108 add ax,10

0BF9:010B pushf

0BF9:010C pop ax

0BF9:010D and al,c5

0BF9:010F and ah,8

0BF9:0112

-r

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0BF9 ES=0BF9 SS=0BF9 CS=0BF9 IP=0100 NV UP EI PL NZ NA PO NC 0BF9:0100 B80000 MOV AX,0000

-t

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0BF9 ES=0BF9 SS=0BF9 CS=0BF9 IP=0103 NV UP EI PL NZ NA PO NC 0BF9:0103 50 PUSH AX

-t

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEC BP=0000 SI=0000 DI=0000 DS=0BF9 ES=0BF9 SS=0BF9 CS=0BF9 IP=0104 NV UP EI PL NZ NA PO NC 0BF9:0104 9D POPF

-t

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0BF9 ES=0BF9 SS=0BF9 CS=0BF9 IP=0105 NV UP DI PL NZ NA PO NC 0BF9:0105 B8F0FF MOV AX,FFF0

-t

AX=FFF0 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0BF9 ES=0BF9 SS=0BF9 CS=0BF9 IP=0108 NV UP DI PL NZ NA PO NC 0BF9:0108 051000 ADD AX,0010

-t

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0BF9 ES=0BF9 SS=0BF9 CS=0BF9 IP=010B NV UP DI PL ZR NA PE CY 0BF9:010B 9C PUSHF

-t

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEC BP=0000 SI=0000 DI=0000 DS=0BF9 ES=0BF9 SS=0BF9 CS=0BF9 IP=010C NV UP DI PL ZR NA PE CY 0BF9:010C 58 POP AX

-t

AX=3047 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0BF9 ES=0BF9 SS=0BF9 CS=0BF9 IP=010D NV UP DI PL ZR NA PE CY 0BF9:010D 24C5 AND AL,C5

-t

AX=3045 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0BF9 ES=0BF9 SS=0BF9 CS=0BF9 IP=010F NV UP DI PL NZ NA PO NC 0BF9:010F 80E408 AND AH,08

-t

AX=0045 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0BF9 ES=0BF9 SS=0BF9 CS=0BF9 IP=0112 NV UP DI PL ZR NA PE NC 0BF9:0112 4C DEC SP

(1)用debug查看内存,情况如下:

0000:0000 68 10 A7 00 8B 01 70 00-16 00 9D 03 8B 01 70 00

则3号中断源对应的中断处理程序入口的偏移地址的内存单位的地址为: 0070:018b

检测点涉及相关内容:

一个表项存放一个中断向量,也就是一个中断处理程序的入口地址,这个入口地址包括段地址和偏移地址,一个表项占两个字,高地址存放段地址,低地址存放偏移地址

检测点12.1

(2)

存储N号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为: 4N

存储N号中断源对应的中断处理程序入口的段地址的内存单元的地址为: 4N+2

检测点涉及相关内容:

一个表项存放一个中断向量,也就是一个中断处理程序的入口地址,这个入口地址包括段地址和偏移地址,一个表项占两个字,高地址存放段地址,低地址存放偏移地址

实验11(letterc子程序)小写改成大写

编写一个子程序,将包含任意字符,以0结尾的字符串的小写字母转变成大写字母

程序一:此题为小写改成大写,根据书P141页介绍,小写字母'a'-'z'对应ASCII码为61h-86h,只要[61,86]这段区间里的ASCII减去20h,就改成了大写字母。

assume cs:codesg

datasg segment

db "Seginner's All-purpose Symbolic Instruction Code.",'0'

datasg ends

codesg segment

begin:

mov ax,datasg

mov ds,ax

mov si,0 ;ds:si指向第一个字节

call letterc

mov ax,4c00h

int 21h

;名称:letterc

;功能:将以0结尾的字符中的小写字母转变成大写字母

;参数:ds:si指向字符串首地址

letterc:push ax

push si

let: cmp byte ptr [si],0 ;和0进行比较

je let0 ;如果等于0则转到let0,结束

cmp byte ptr [si],61h ;和61h进行比较

jb let1 ;如果低于60h则转到let1,继续循环

cmp byte ptr [si],86h ;和86h进行比较

ja let1 ;如果高于86h则转到let1,继续循环

mov al,[si]

sub al,20h ;转为大写字母

mov [si],al

let1:

inc si

jmp let

let0:

pop ax

ret

codesg ends

end begin

------------------------华丽的分割线----------------------------

程序二:参考书中P143页内容,有更好的办法,无需用到寄存器。

可以用and直接修改内存,将ASCII码的第5位置为0,变为大写字母。

assume cs:codesg

datasg segment

db "Seginner's All-purpose Symbolic Instruction Code.",'0'

datasg ends

codesg segment

begin: mov ax,datasg

mov ds,ax

mov si,0 ;ds:si指向第一个字节

call letterc

mov ax,4c00h

int 21h

;名称:letterc

;功能:将以0结尾的字符中的小写字母转变成大写字母

;参数:ds:si指向字符串首地址

letterc:push si

let: cmp byte ptr [si],0 ;和0进行比较

je let0 ;如果等于0则转到let0,结束

cmp byte ptr [si],61h ;和61h进行比较

jb let1 ;如果低于60h则转到let1,继续循环

cmp byte ptr [si],86h ;和86h进行比较

ja let1 ;如果高于86h则转到let1,继续循环

and byte ptr [si],11011111b ;ASCII码的第5位置为0,转为大写

let1:

inc si

jmp let

let0:

pop si

ret

codesg ends

end begin

检测点13.1

7ch中断例程如下:

lp: push bp

mov bp,sp

dec cx

jcxz lpret

add [bp+2],bx

lpret: pop bp

iret

(1)在上面的内容中,我们用7ch中断例程实现loop的功能,则上面的7ch中断例程所能进行的最大转移位移是多少?

最大位移是FFFFH

(2)用7ch中断例程完成jmp near ptr s指令功能,用bx向中断例程传送转移位移。

应用举例:在屏幕的第12行,显示data段中以0结尾的字符串。

assume cs:code

data segment

db 'conversation',0

data ends

code segment

start:

mov ax,data

mov ds,ax

mov si,0

mov ax,0b800h

mov es,ax

mov di,12*160

s: cmp byte ptr [si],0

je ok

mov al,[si]

mov es:[di],al

inc si

add di,2

mov bx,offset s-offset ok

int 7ch

ok: mov ax,4c00h

int 21h

code ends

end start

jmp near ptr s指令的功能为:(ip)=(ip)+16位移,实现段内近转移

检测点13.2

判断下面说法的正误:

(1)我们可以编程改变FFFF:0处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序。答:错误,FFFF:0处的内容无法改变。

检测点13.2

判断下面说法的正误:

(2)int 19h中断例程,可以由DOS提供。

答:错误,先调用int 19h,后启动DOS。

实验13

(1)编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。;名称:int 7ch中断例程

;功能:显示一个0结束的字符串,中断例程安装在0:200处

;参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址

assume cs:code

code segment

start: mov ax,cs

mov ds,ax

mov si,offset show_str ;设置ds:si指向源地址

mov ax,0

mov es,ax

mov di,200h ;设置es:di指向目标地址

mov cx,offset show_strend-offset show_str ;设置cx为传输长度 cld ;设置传输方向为正

rep movsb

mov ax,0

mov es,ax

mov word ptr es:[7ch*4],200h

mov word ptr es:[7ch*4+2],0 ;设置中断向量表

mov ax,4c00h

int 21h

;名称:show_str

;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。

;参数:(dh)=行号(取值范围0~24);

; (dl)=列号(取值范围0~79);

; (cl)=颜色;

; ds:si指向字符串的首地址。

;返回:无。

show_str:push ax

push bx

push es

push si

mov ax,0b800h

mov es,ax

mov ax,160

mul dh

mov bx,ax ;bx=160*dh

mov ax,2

mul dl ;ax=dl*2

add bx,ax ;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址 mov al,cl ;把颜色cl赋值al

mov cl,0

show0: mov ch,[si]

jcxz show1 ;(ds:si)=0时,转到show1执行

mov es:[bx],ch

mov es:[bx].1,al

inc si ;ds:si指向下一个字符地址

add bx,2 ;es:bx指向下一个显存地址

jmp show0

show1: pop si

pop es

pop bx

pop ax

iret

mov ax,4c00h

int 21h

show_strend:nop

code ends

end start

;实验13(1)应用举例

assume cs:code

data segment

db 'welcome to masm!',0

data ends

code segment

start: mov dh,10

mov dl,10

mov cl,2

mov ax,data

mov ds,ax

mov si,0

int 7ch

mov ax,4c00h

int 21h

code ends

end start

实验13

(2)编写并安装int 7ch中断例程,功能为完成loop指令功能

;名称:int 7ch中断例程

;功能:完成loop指令功能,中断例程安装在0:200处

;参数:(cx)=循环次数,(bx)=位移

assume cs:code

code segment

start: mov ax,cs

mov ds,ax

mov si,offset lp ;设置ds:si指向源地址

mov ax,0

mov es,ax

mov di,200h ;设置es:di指向目标地址

mov cx,offset lpend-offset lp ;设置cx为传输长度

cld ;设置传输方向为正

rep movsb

mov ax,0

mov es,ax

mov word ptr es:[7ch*4],200h

mov word ptr es:[7ch*4+2],0 ;设置中断向量表

mov ax,4c00h

int 21h

lp: push bp

mov bp,sp

dec cx

jcxz lpret

add [bp+2],bx

lpret: pop bp

iret

mov ax,4c00h

int 21h

lpend:nop

code ends

end start

;实验13(2)应用举例

assume cs:code

code segment

start: mov ax,0b800h

mov es,ax

mov di,160*12

mov bx,offset s-offset se ;设置从标号se到标号s的转移位移 mov cx,80

s: mov byte ptr es:[di],'!'

add di,2

int 7ch ;(cx)≠0,转移到标号s处

se: nop

mov ax,4c00h

int 21h

code ends

end start

实验13

(3)下面的程序,分别在屏幕的第2、4、6、8行显示4句英文诗,补全代码。assume cs:code

code segment

s1: db 'Good,better,best,','$'

s2: db 'Never let it rest,','$'

s3: db 'Till good is better,','$'

s4: db 'And better,best.','$'

s : dw offset s1,offset s2,offset s3,offset s4

row: db 2,4,6,8

start: mov ax,cs

mov ds,ax

mov bx,offset s

mov si,offset row

mov cx,4

ok: mov bh,0 ;第0页

mov dh,[si] ;dh中放行号

mov dl,0 ;dl中放列号

mov ah,2 ;置光标

int 10h

mov dx,[bx] ;ds:dx指向字符串首地址

mov ah,9 ;在光标位置显示字符

int 21h

inc si ;行号递增

add bx,2 ;指向下一字符串

loop ok

mov ax,4c00h

int 21h

code ends

end start

检测点14.1 读取写入CMOS RAM单元内容

(1)编程,读取CMOS RAM的2号单元内容。

assume cs:code

code segment

start: mov al,2 ;赋值al

out 70h,al ;将al送入端口70h

in al,71h ;从端口71h处读出单元内容

mov ax,4c00h

int 21h

code ends

end start

检测点14.1

(2)编程,向CMOS RAM的2号单元写入0。

assume cs:code

code segment

start: mov al,2 ;赋值al

out 70h,al ;将al送入端口70h

mov al,0 ;赋值al

out 71h,al ;向端口71h写入数据al

mov ax,4c00h

int 21h

code ends

end start

检测点14.2 用加法和移位指令计算

编程,用加法和移位指令计算(ax)=(ax)*10

提示:(ax)*10=(ax)*2+(ax)*8

assume cs:code

code segment

start: mov bx,ax

shl ax,1 ;左移1位(ax)=(ax)*2

mov cl,3

shl bx,cl ;左移3位(bx)=(ax)*8

add ax,bx ;(ax)=(ax)*2+(ax)*8

mov ax,4c00h

int 21h

code ends

end start

;应用举例:计算ffh*10

assume cs:code

code segment

start: mov ax,0ffh

mov bx,ax

shl ax,1 ;左移1位(ax)=(ax)*2

mov cl,3

shl bx,cl ;左移3位(bx)=(ax)*8

add ax,bx ;(ax)=(ax)*2+(ax)*8

mov ax,4c00h

int 21h

code ends

end start

PS:

左移1位,N=(N)*2

左移2位,N=(N)*4

左移3位,N=(N)*8

左移4位,N=(N)*16

左移5位,N=(N)*32

实验14 访问CMOS RAM

编程,以“年/月/日时:分:秒”的格式,显示当前的日期、时间。(两个程序程序一:

assume cs:code

code segment

start: mov ax,0

mov al,9

mov si,0

mov cx,6

s: push cx

push ax

out 70h,al ;将al送入端口70h

in al,71h ;从端口71h处读出单元内容

mov ah,al

mov cl,4

shr ah,cl

and al,00001111b ;al分成两个表示BCD码值的数据

add ah,30h

add al,30h ;BCD码+30h=10进制数对应的ASCII码

mov bx,0b800h

mov es,bx

mov byte ptr es:[160*12+40*2][si],ah ;显示十位数码

mov byte ptr es:[160*12+40*2+2][si],al ;显示个位数码

pop ax

dec ax ;指向前一数据单元

jmp s1

s0: pop cx

add si,6

loop s

mov ax,4c00h

int 21h

s1: cmp ax,10

ja s0

cmp ax,0

je s0

cmp ax,6

ja s2 ;ax>6,为年/月/日

je s3 ;ax=6,为日结尾

jb s4 ;ax<6,为时:分:秒

s2: mov byte ptr es:[160*12+40*2+4][si],'/' ;添加'/'

jmp s0

s3: sub ax,2

jmp s0

s4: sub ax,1

mov byte ptr es:[160*12+40*2+4][si],':' ;添加':'

jmp s0

code ends

end start

==============================华丽的分割线=============================== 程序二:

assume cs:code

code segment

time db 'yy/mm/dd hh:mm:ss','$'

cmos db 9,8,7,4,2,0

start: mov ax,cs

mov ds,ax

mov bx,0

mov si,0

mov cx,6

a: push cx

mov al,cmos[bx]

out 70h,al ;将al送入地址端口70h

in al,71h ;从数据端口71h处读出单元内容

mov ah,al

mov cl,4

shr al,cl ;右移4位

and ah,0fh ;al分成两个表示BCD码值的数据

add ax,3030h ;BCD码+30h=10进制数对应的ASCII码

mov cs:[si],ax ;ASCII码写入time段

inc bx

add si,3

pop cx

loop a

;名称:BIOS中断(int 10h)

;功能:(ah)=2置光标到屏幕指定位置、(ah)=9在光标位置显示字符

;参数:(al)=字符、(bh)=页数、(dh)=行号、(dl)=例号

; (bl)=颜色属性、(cx)=字符重复个数

mov ah,2 ;置光标

mov bh,0 ;第0页

mov dh,13 ;dh中放行号

mov dl,32 ;dl中放例号

int 10h

;名称:DOS中断(int 21h)

;功能:(ah)=9显示用'$'结束的字符串、(ah)=4ch程序返回

;参数:ds:dx指向字符串、(al)=返回值

mov dx,0

mov ah,9

int 21h

;结束

mov ax,4c00h

int 21h

code ends

end start

检测点15.1

(1)仔细分析一下书中的in9中断例程,看看是否可以精简一下?

其实在我们的int 9中断例程中,模拟int指令调用原int 9中断例程的程序段是可以精简的,因为在进入中断例程后,IF和TF都已置0,没有必要再进行设置了,对于程序段:

pushf ;标志寄存器入栈

pushf

pop bx

and bh,11111100b ;IF和TF为flag的第9位和第8位

push bx

popf ;TF=0,IF=0

call dword ptr ds:[0] ;CS、IP入栈;(IP)=ds:[0],(CS)=ds:[2]

可以精简为:

pushf ;标志寄存器入栈

call dword ptr ds:[0] ;CS、IP入栈;(IP)=ds:[0],(CS)=ds:[2]

两条指令。

检测点15.1

(2)仔细分析程序中的主程序,看看有什么潜在的问题?

在主程序中,如果在设置执行设置int 9中断例程的段地址和偏移地址的指令之间发生了键盘中段,则CPU 将转去一个错误的地址执行,将发生错误。

找出这样的程序段,改写他们,排除潜在的问题。

;在中断向量表中设置新的int 9中断例程的入口地址

cli ;设置IF=0屏蔽中断

mov word ptr es:[9*4],offset int9

mov es:[9*4+2],cs

sti ;设置IF=1不屏蔽中断

============更改后的int 9中断例程================

;功能:在屏幕中间依次显示'a'~'z',并让人看清。在显示过程中按下Esc键后,改变显示的颜色。assume cs:code

stack segment

db 128 dup (0)

stack ends

data segment

dw 0,0

data ends

code segment

start: mov ax,stack

mov ss,ax

mov sp,128

;将原来的int 9中断例程的入口地址保存在ds:0、ds:2单元中

mov ax,data

mov ds,ax

mov ax,0

mov es,ax

push es:[9*4]

pop ds:[0]

push es:[9*4+2]

pop ds:[2]

;在中断向量表中设置新的int 9中断例程的入口地址

cli ;设置IF=0屏蔽中断

mov word ptr es:[9*4],offset int9

mov word ptr es:[9*4+2],cs

sti ;设置IF=1不屏蔽中断

;依次显示'a'~'z'

mov ax,0b800h

mov es,ax

mov ah,'a'

s: mov es:[160*12+40*2],ah ;第12行第40列

inc ah

cmp ah,'z'

jnb s

;将中断向量表中int 9中断例程的入口恢复为原来的地址

mov ax,0

mov es,ax

push ds:[0]

pop ss:[9*4]

push ds:[2]

pop es:[9*4+2]

;结束

mov ax,4c00h

int 21h

;循环延时,循环100000h次

delay: push ax

push dx

mov dx,1000h

mov ax,0

delay1: sub ax,1

sbb dx,0 ;(dx)=(dx)-0-CF

cmp ax,0

jne delay1

cmp dx,0

jne delay1

pop dx

pop ax

ret

;以下为新的int 9中断例程

int9: push ax

push bx

push es

in al,60h ;从端口60h读出键盘输入

;对int指令进行模拟,调用原来的int 9中断例程

pushf ;标志寄存器入栈

call dword ptr ds:[0] ;CS、IP入栈;(IP)=ds:[0],(CS)=ds:[2]

;如果是ESC扫描码,改变显示颜色

cmp al,1 ;和esc的扫描码01比较

jne int9ret ;不等于esc时转移

mov ax,0b800h

mov es,ax

inc byte ptr es:[160*12+40*2+1] ;将属性值+1,改变颜色

int9ret:pop es

pop bx

pop ax

iret

code ends

end start

实验15 安装新的int 9中断例程(按'A'键后显示满屏幕的'A')

任务:安装一个新的int 9中断例程

;功能:在DOS下,按'A'键后除非不再松开,如果松开,就显示满屏幕的'A',其他键照常处理assume cs:code

stack segment

db 128 dup (0)

stack ends

code segment

start: mov ax,stack

mov ss,ax

mov sp,128

push cs

pop ds

mov ax,0

mov es,ax

mov si,offset int9 ;设置ds:si指向源地址

mov di,204h ;设置es:di指向目标地址

汇编语言课后习题答案

2.1已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12345678H,[21200H]~[21203H]依次存放2A4C B765H,说明下列每条指令执行完后AX寄存器的内容。 (1)mov ax,1200h (2)mov ax,bx (3)mov ax,[1200h] (4)mov ax,[bx] (5)mov ax,[bx+1100h] (6)mov ax,[bx+si] (7)mov ax,[bx][si+1100h] 〔解答〕 (1)AX=1200H (2)AX=0100H (3)AX=4C2AH;偏移地址=bx=0100h (4)AX=3412H;偏移地址=bx=0100h (5)AX=4C2AH;偏移地址=bx+1100h=1200h (6)AX=7856H;偏移地址=bx+si=0100h+0002h=0102h (7)AX=65B7H;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h 〔习题2.2〕指出下列指令的错误 (1)mov cx,dl (2)mov ip,ax (3)mov es,1234h (4)mov es,ds (5)mov al,300 (6)mov[sp],ax (7)mov ax,bx+di

(8)mov20h,ah 〔解答〕 (1)两操作数类型不匹配 (2)IP指令指针禁止用户访问 (3)立即数不允许传给段寄存器 (4)段寄存器之间不允许传送 (5)两操作数类型不匹配 (6)目的操作数应为[SI] (7)源操作数应为[BX+DI] (8)立即数不能作目的操作数 〔习题2.5〕已知SS=2200H、SP=00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化?mov ax,8057h push ax mov ax,0f79h push ax pop bx pop[bx] 〔解答〕 mov ax,8057h push ax mov ax,0f79h push ax pop bx;bx=0f79h pop[bx];DS:[0f79h]=8057h

汇编语言课后习题解答

第1章基础知识 检测点1.1(第9页) (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13位。 (2)1KB的存储器有1024个存储单元,存储单元的编号从0到1023。 (3)1KB的存储器可以存储8192(2^13)个bit,1024个Byte。 (4)1GB是1073741824(2^30)个Byte、1MB是1048576(2^20)个Byte、1KB是1024(2^10)个Byte。 (5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为: 64(KB)、1(MB)、16(MB)、4(GB)。 (6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为: 1(B)、1(B)、2(B)、2(B)、4(B)。 (7)从内存中读取1024字节的数据,8086至少要读512次,80386至少要读256次。 (8)在存储器中,数据和程序以二进制形式存放。

(1)1KB=1024B,8KB=1024B*8=2^N,N=13。 (2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。 (3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。 (4)1GB=1073741824B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。(5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU 最多可以寻找2的N次方个内存单元。(一个内存单元=1Byte)。 (6)8根数据总线一次可以传送8位二进制数据(即一个字节)。 (7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。 (8)在存储器中指令和数据没有任何区别,都是二进制信息。

汇编语言 第二版 王爽 完整答案

第1章基础知识 检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13。 (2)1KB的存储器有1024个存储单元。存储单元的编号从0到1023。 (3)1KB的存储器可以存储1024*8个bit,1024个Byte。 (4)1GB、1MB、1KB分别是2^30、2^20、2^10 Byte。(n^m的意思是n的m次幂) (5)8080、8088、80286、80386的地址总线宽度分别是16根、20根、24根、32根,则它们的寻址能力分别为:64(KB)、1(MB)、16(MB)、4(GB)。 (6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为:1(B)、1(B)、2(B)、2(B)、4(B)。 (7)从内存中读取1024字节的数据,8086至少要读512次、80386至少要读256次。 (8)在存储器中,数据和程序以二进制形式存放。 第2章寄存器答案 检测点2.1 (1) 写出每条汇编指令执行后相关寄存器中的值。 mov ax,62627 AX=F4A3H mov ah,31H AX=31A3H mov al,23H AX=3123H add ax,ax AX=6246H mov bx,826CH BX=826CH mov cx,ax CX=6246H mov ax,bx AX=826CH add ax,bx AX=04D8H mov al,bh AX=0482H mov ah,bl AX=6C82H add ah,ah AX=D882H add al,6 AX=D888H add al,al AX=D810H mov ax,cx AX=6246H (2) 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。 解: mov ax,2 add ax,ax add ax,ax add ax,ax 检测点2.2 (1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为00010H到1000FH。 (2) 有一数据存放在内存 20000H 单元中,先给定段地址为SA,若想用偏移地址寻到此单元。

汇编语言课后习题答案___郑晓薇(整理后的)

习题一 1 无符号数: 11010011=211=D3H,01110111=119=77H, 10000011=131=83H, 00101111=47=2FH, 10101010=170=AAH 带符号数:11010011= -45=D3H,01110111=+119=77H,10000011= -125=83H, 00101111=+47=2FH,10101010= -86=AAH 2 5E8AH,0BE6H,3DEH,4940H 3 00011101+00110101=01010010=5 2H=82 01001001+11101000=00110001=3 1H=49 10111110+01010010=00010000=1 0H=16 10011010+11110001=10001011=8 BH= -117 4 00101001+01010011=01111100+0 0000110=10000010=82H=82 01110011-00100100=01001111-00000110=01001001=49H=49 01100110+00011000=01111110+0 0000110=10000100=84H=84 0000000100110010+01110101=00 00000110100111+00000110 =0000001000000111=0207H=207 5 000020A3H,FF94H,00003456H,007FH,FFFFEC00H 6 无符号数:0~65535,0000H~FFFFH;带符号数:-32768~+32767,8000H~7FFFH 7 (1) 38H等于十进制数56,是十进制数56的补码,数字8的ASCII码,十进制数38的压缩BCD码 (2) FFH等于十进制数-1,是带符号数-1的补码,无符号数为255 (3) 5AH等于十进制数90,是十进制数90的补码,大写字母Z的ASCII码 (4) 0DH等于十进制数13,是十进制数13的补码,回车符的ASCII码 8 (1) 108=01101100B=6CH,补码01101100B,压缩BCD码0000000100001000,ASCII码313038H (2) 46=00101110B=2EH,补码00101110B,压缩BCD码01000110,ASCII码3436H (3) –15=11110001B=F1H,补码11110001B,ASCII码2D3135H (4) 254=0000000011111110B=00FEH,补码0000000011111110B,压缩BCD 码0000001001010100,ASCII码323534H 9 (1) 56+63=01110111B,CF=0,SF=0,ZF=0,OF=0 (2) 83-45=00100110B,CF=0,SF=0,ZF=0,OF=0 (3) -74+29=11010011B,CF=0, SF=1,ZF=0,OF=0 (4) -92-37=01111111B,CF=1, SF=0,ZF=0,OF=1 10 回车、换行、响铃、ESC键、空格键、@、P、p 习题二 9 最少划分为16个逻辑段,最多划分为65536个逻辑段(每段16个字节) 10 CS:IP,DS:BX、SI、DI,ES:BX、SI、DI,SS:SP、BP 11 字节单元保存8位数,字单元保存16位数。根据源操作数的属性确定要访问的是字节单元还是字单元。 12 对于字节单元来说,偶地址和奇地址一样;对于字单元而言,最好用偶地址保存,可减少CPU的访存次数。 13 首单元的物理地址=38AE8H,末单元的物理地址 =38AE8H+7FFFH=40AE7H

汇编语言程序设计(钱晓捷)课后答案

汇编语言程序设计(第二版) 钱晓捷习题答案 第二章(01) 2.1 (1)AX=1200h (2)AX=0100h (3)AX=4C2Ah (4)AX=3412h (5)AX=4C2Ah (6)AX=7856h (7)AX=65B7h 2.2(1) 两操作数类型不匹配 (2) IP指令指针禁止用户访问 (3) 立即数不允许传给段寄存器 (4) 段寄存器之间不允许传送 (5) 两操作数类型不匹配 (6) 目的操作数应为[ BP ] (7) 源操作数应为[BX+DI] (8) 立即数不能作目的操作数 2.3 lea bx,table ;获取table的首地址,BX=200H mov al,8 ;传送欲转换的数字,AL=8 xlat ;转换为格雷码,AL=12H 2.4 堆栈是一种按“先进后出”原则存取数据的存储区域。 堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。 2.5 mov ax,8057h push ax mov ax,0f79h push ax pop bx ;bx=0f79h pop [bx] ;DS:[0f79h]=8057h 2.6 AL=89h CF ZF SF OF PF AL=12h 1 0 0 1 1 AL=0afh 0 0 1 0 1 AL=0afh 1 0 1 0 1 AL=00h 0 1 0 0 1 AL=0ffh 0 0 1 0 1 AL=00h 0 1 0 0 1 2.7 W=X+Y+24-Z

2.8 (1)ADD DX,BX (2)ADD AL,[BX+SI] (3)ADD [BX+0B2H],CX (4)ADD WORD PTR [0520H],3412H (5)ADD AL,0A0H 2.9;为了避免与操作数地址混淆,将题中X,Y,Z,V 字操作数改为A,B,C,D mov ax,X ;ax=A imul Y ;dx,ax = A*B (将操作数看作符号数,以下同) mov cx,ax mov bx,dx ;bx,ax <-- dx,ax =A*B mov ax,Z ;ax = C cwd ;dx,ax =C (扩展符号后为双字) add cx,ax adc bx,dx ;bx,cx <-- bx,cx+dx,ax=A*B+C sub cx,540 sbb bx,0 ;bx,cx<-- A*B+C-540 mov ax, V ;ax= D cwd ;dx,ax= D (扩展符号后为双字) sub ax, cx sbb dx, bx ;dx,ax = dx,ax - bx,cx = D-(A*B+C-540) idiv X ;运算结果:[D-(A*B+C-540h)]/A ;ax存商,dx存余数 2.10;(1)xchg的操作数不能是立即数 (2不能对CS直接赋值 (3)两个操作数不能都是存储单元 (4)堆栈的操作数不能是字节量 (5)adc的操作数不能是段寄存器 (6)没有确定是字节还是字操作 (7)in不支持超过FFH的直接寻址 (8)out只能以AL/AX为源操作数 第二章(02) 2.11; 指令AX的值CF OF SF ZF PF Mov ax,1407h1470h----- And ax,ax1470h00000 Or ax,ax1470h00000 Xor ax,ax000011 Not ax0ffffh----- Test ax,0f0f0h0ffffh00101 注意: 1. mov, not指令不影响标志位 2. 其他逻辑指令使CF=OF=0, 根据结果影响其他标志位。

《汇编语言与接口技术》答案习题解答(第三章)

解: mov ah,1 ;只允许输入小写字母 int 21h sub al,20h ;转换为大写字母 mov dl,al mov ah,2 int 21h ;显示 解: mov ax, bufX cmp ax, bufY jge done mov ax, bufY done: mov bufZ, ax 解:

.model small .stack .data bufX dw -7 signX db .code .startup cmp bufX,0 ;test bufX,80h jl next ;jnz next mov signX,0 jmp done next: mov signX,-1 done: .exit 0 end 解: mov dl,’2’ mov ax,bufX cmp ax,bufY je next1 dec dl next1: cmp ax,bufZ je next2 dec dl next2: mov ah,2 int 21h

编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。 ; .model small .stack .data b_data db 12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h ;原始数据num equ 10 ;数据个数 sum db ;预留结果单元 .code .startup xor si, si ;位移量清零 xor al, al ;取第一个数 mov cx, num ;累加次数 again: add al, b_data[si] ;累加 inc si ;指向下一个数 loop again ;如未完,继续累加 mov sum, al ;完了,存结果 .exit 0 end 解: lucase proc push bx mov bx,offset string cmp al,0 je case0 cmp al,1

汇编语言复习题(附答案)

汇编语言复习题 注:蓝色标记的为答案,此答案仅供参考,大家自己做一下或看以一下,认为不对的地方,可以提出来一起讨论一下,另外看一下课后老师布置的相应作业。在此文档最后最后附有课后四、六章的答案,大家抓紧时间复习哦! 一、选择题 1.把要执行的程序与库文件连接起来形成可执行文件的系统程序是( B ) 。 A.汇编程序 B.连接程序 C.机器语言程序 D.源代码程序 2.在8088/8086的寄存器组中,CPU确定下一条指令的物理地址时需要用到的寄存器对是 ( C )。 A..SS和SP B.DS和DI C.CS和IP D.ES和SI 3.为了使主机访问外设方便起见,外设中的每个寄存器给予一个( C )。 A.物理地址 B. 逻辑地址 C. 端口地址 D.段地址 4.MOV AX,3064H,该指令中源操作数采用的寻址方式是( A )。 A.立即 B.直接 C.寄存器相对 D.寄存器间接 5.换码指令的助记符是( C )。 A. XCHG B. LEAS C.XLAT D. MOV 6.如果A≥B(A、B有符号数)发生转移,应选择的条件转移指令是 ( JGE )。 7.下列符号中,可用作标识符的是( C )。 A.MOV B.AX C.MSG1 D.1ABC 8.X DB 10H DUP(1,2)内存变量定义语句拥有了( A )个字节的存储空间。 A.20D B.10D C.20H D.10H 9.当DF=0时,执行串操作指令MOVSB,变址寄存器SI、DI的值将( C )。 A. 不变 B.减1 C.加1 D.无法确定 10.如下指令可将AX寄存器内容改变的是( A )。 A.AND AX , BX B.TEST AX , BX C.CMP AX , BX D.XCHG AX , AX 11.16位CPU支持的I/O地址范围是( D )。 A.0~0FFFFFH B.0~0FFFFH C.0~0FFFH D.0~0FFH

汇编语言程序设计课后习题解答宋人杰2版

第1章汇编语言基础知识 1.简述汇编语言源程序、汇编程序、和目标程序的关系。 答:用汇编语言编写的程序称为汇编源程序;汇编源程序在汇编程序的翻译下转换成计算机语言变成目标程序。 2. 简述汇编语言的优缺点。 答:(1) 汇编语言的优点: ①可有效地访问、控制计算机各种硬件设备,如磁盘、存储器、CPU、I/O端口等。. ②目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。 ③可与高级语言配合使用,应用十分广泛。 (2) 汇编语言的缺点: ①通用性和可移植性较差 ②相对于高级语言来说较繁锁、易出错、不够直观。 3.CPU的寻址能力为8KB,那么它的地址总线的宽度为多少? 答:13 4. 1KB的存储器有多少个存储单元? 答:1024个字节。 5. 指令中的逻辑地址由哪两部分组成? 答:指令中的逻辑地址由段基址和偏移量组成。 6. 以下为用段基址:偏移量形式表示的内存地址,试计算它们的物理地址。 (1) 12F8:0100 (2) 1A2F:0103 (3) 1A3F:0003 (4) 1A3F:A1FF 答: (1) 13080H (2) 1A3F3H (3) 1A3F3H (4) 245EFH 7. 自12FA:0000开始的内存单元中存放以下数据(用十六进制形式表示): 03 06 11 A3 13 01,试分别写出12FA:0002的字节型数据、字型数据及双字型数据 的值。 答:字节型数据:11H 字型数据:0A311H 双字型数据:0113A311H 8. 内存中某单元的物理地址是19318H,段基地址为1916H,则段内偏移地址为 多少?若段内偏移地址为2228H,则段基地址为多少? 答:若段基地址为1916H,则段内偏移地址为01B8H;若段内偏移地址为2228H,则段基地址为170FH 9. 在实模式环境中,一个段最长不能超过多少字节? 答:64KB 10. 实模式可寻址的内存范围是多少? 答:1MB

汇编语言课后习题答案郑晓薇后的

汇编语言课后习题答案郑 晓薇后的 Modified by JEEP on December 26th, 2020.

习题一1 2 5E8AH,0BE6H,3DEH,4940H 3 00011101+00110101=0101001 0=52H=82 4 5000020A3H,FF94H,00003456H,007FH, FFFFEC00H 6无符号数:0~65535,0000H~FFFFH;带符号数:-32768~ +32767,8000H~7FFFH 7 (1) 38H等于十进制数56,是十进制数56的补码,数字8的ASCII 码,十进制数38的压缩BCD码(2) FFH等于十进制数-1,是带符号数-1的补码,无符号数为255(3) 5AH等于十进制数90,是十进制数90的补码,大写字母Z的ASCII码(4) 0DH等于十进制数13,是十进制数13的补码,回车符的ASCII码8 (2) 46=00101110B=2EH,补码00101110B,压缩BCD码01000110,ASCII码3436H 9 (1) 56+63=01110111B, CF=0,SF=0,ZF=0,OF=0(2) 83-45=00100110B,CF=0, SF=0,ZF=0,OF=0(4) -92-37=01111111B,CF=1,SF=0,ZF=0,OF=1 10 回车、换行、响铃、ESC键、空格键、@、P、p 习题二 9 最少划分为16个逻辑段,最多划分为65536个逻辑段(每段16个字节) 10CS:IP,DS:BX、SI、DI,ES:BX、SI、DI,SS:SP、BP 11 字节单元保存8位数,字单元保存16位数。根据源操作数的属性确定要访问的是字节单元还是字单元。

汇编语言程序设计第3章【课后答案】

汇编语言程序设计第四版 【课后习题答案】--囮裑為檤第3章汇编语言程序格式 〔习题〕伪指令语句与硬指令语句的本质区别是什么伪指令有什么主要作用 〔解答〕 伪指令语句与硬指令语句的本质区别是能不能产生CPU动作; 伪指令的作用是完成对如存储模式、主存变量、子程序、宏及段定义等很多不产生CPU动作的说明,并在程序执行前由汇编程序完成处理。 〔习题〕什么是标识符,汇编程序中标识符怎样组成 〔解答〕 为了某种需要,每种程序语言都规定了在程序里如何描述名字,程序语言的名字通常被称为标识符; 汇编语言中的标识符一般最多由31个字母、数字及规定的特殊符号(如-,$,,@)组成,不能以数字开头。 〔习题〕什么是保留字,汇编语言的保留字有哪些类型,并举例说明。 〔解答 保留字是在每种语言中规定了有特殊意义和功能的不允许再做其它用处的字符串;汇编语言的保留字主要有硬指令助记、伪指令助记符、运算符、寄存器名以及预定义符号等。汇编语言对大小写不敏感。如定义字节数和字符串的DB就是伪指令助记符。 〔习题〕汇编语句有哪两种,每个语句由哪4个部分组成 〔解答〕 汇编语句有执行性语句和说明性语句; 执行性语句由标号、硬指令助记符、操作数和注释四部分组成; 说明性语句由名字、伪指令助记符、参数和注释四部分组成 〔习题〕汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。 〔解答〕 ⒈编辑文本编辑程序汇编语言源程序.asm ⒉汇编汇编程序目标模块文件.obj ⒊连接连接程序可执行文件.exe或

⒋调试调试程序应用程序 〔习题〕区分下列概念: (1)变量和标号 (2)数值表达式和地址表达式 (3)符号常量和字符串常量 〔解答〕 (1)变量是在程序运行过程中,其值可以被改变的量;标号是由用户自定义的标识符,指向存储单元,表示其存储内容的逻辑地址。 (2)数值表达式一般是由运算符连接的各种常数所构成的表达式,地址表达式是由名字、标号以及利用各种的操作符形成的表达式。 (3)在程序中,为了使常量更便于使用和阅读,经常将一些常量用常量定义语句定义为符号常量,被一对双引号括起来的若干个字符组成的字符序列被称为字符串常量。 〔习题〕假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的错误原因。 (1) mov byte ptr [bx],1000 (2) mov bx,offset myword[si] (3) cmp mybyte1,mybyte2 (4) mov al,mybyte1+mybyte2 (5) sub al,myword (6) jnz myword 〔解答〕 (1)1000超出了一个字节范围 (2)寄存器的值只有程序执行时才能确定,而offset是汇编过程计算的偏移地址,故无法确定,改为lea bx,myword[si] (3)两个都是存储单元,指令不允许 (4)变量值只有执行时才确定,汇编过程不能计算 (5)字节量AL与字量myword,类型不匹配 (6)Jcc指令只有相对寻址方式,不支持间接寻址方式 〔习题〕OPR1是一个常量,问下列语句中两个AND操作有什么区别 AND AL,OPR1 AND 0feh 〔解答〕

汇编语言程序设计习题答案

第一章. 习题 1.1用降幂法和除法将下列十进制数转换为二进制数和十六进制数: (1) 369 (2) 10000 (3) 4095 (4) 32767 答:(1) 369=1 0111 0001B=171H (2) 10000=10 0111 0001 0000B=2710H (3) 4095=1111 1111 1111B=FFFH (4) 32767=111 1111 1111 1111B=7FFFH 1.2将下列二进制数转换为十六进制数和十进制数: (1) 10 1101 (2) 1000 0000 (3) 1111 1111 1111 1111 (4) 1111 1111 答:(1) 10 1101B=2DH=45 (2) 1000 0000B=80H=128 (3) 1111 1111 1111 1111B=FFFFH=65535 (4) 1111 1111B=FFH=255 1.3将下列十六进制数转换为二进制数和十进制数: (1) FA (2) 5B (3) FFFE (4) 1234 答:(1) FAH=1111 1010B=250 (2) 5BH=101 1011B=91 (3) FFFEH=1111 1111 1111 1110B=65534 (4) 1234H=1 0010 0011 0100B=4660 1.4完成下列十六进制数的运算,并转换为十进制数进行校核: (1) 3A+B7 (2) 1234+AF (3) ABCD-FE (4) 7AB×6F 答:(1) 3A+B7H=F1H=241 (2) 1234+AFH=12E3H=4835 (3) ABCD-FEH=AACFH=43727 (4) 7AB×6FH=35325H=217893 1.5下列各数均为十进制数,请用8位二进制补码计算下列各题,并用十六进制数表示其 运算结果。 (1) (-85)+76 (2) 85+(-76) (3) 85-76 (4) 85-(-76) (5) (-85)-76 (6) -85-(-76) 答:(1) (-85)+76=1010 1011B+0100 1100B=1111 0111B=0F7H;CF=0;OF=0 (2) 85+(-76)=0101 0101B+1011 0100B=0000 1001B=09H;CF=1;OF=0 (3) 85-76=0101 0101B-0100 1100B=0101 0101B+1011 0100B=0000 1001B=09H;CF=0; OF=0 (4) 85-(-76)=0101 0101B-1011 0100B=0101 0101B+0100 1100B=10100001B=0A1H; CF=0;OF=1 (5) (-85)-76=1010 1011B-0100 1100B=1010 1011B+1011 0100B=0101 1111B=5FH; CF=0;OF=1 (6) -85-(-76)=1010 1011B-1011 0100B=1010 1011B+0100 1100B=11110111B=0F7H; CF=0;OF=0 1.6下列各数为十六进制表示的8位二进制数,请说明当它们分别被看作是用补码表示的 带符号数或无符号数时,它们所表示的十进制数是什么?

汇编语言课后习题答案 王爽主编

补全编程,利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。 assume cs:code code segment start: mov ax,2000h mov ds,ax mov bx,0 s: mov ch,0 mov cl,[bx] jcxz ok ;当cx=0时,CS:IP指向OK inc bx jmp short s ok: mov dx,bx mov ax ,4c00h int 21h code ends end start 检测点9.3 补全编程,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。 assume cs:code code segment start: mov ax,2000h mov ds,ax mov bx,0 s:mov cl,[bx] mov ch,0 inc cx inc bx loop s ok:dec bx mov dx,bx mov ax,4c00h int 21h code ends end start 书P101,执行loop s时,首先要将(cx)减1。 “loop 标号”相当于 dec cx if((cx)≠0) jmp short 标号 检测点10.1 补全程序,实现从内存1000:0000处开始执行指令。 assume cs:code stack segment db 16 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax, 1000h

IBM-PC汇编语言程序设计课后习题答案

第五章 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。 答:程序段如下: BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用 INT 21H CMP AL, ‘a’ ;输入字符<‘a’吗 JB STOP CMP AL, ‘z’ ;输入字符>‘z’吗 JA STOP SUB AL, 20H ;转换为大写字母,用AND AL, 1101 1111B也可 MOV DL, AL ;显示一个字符的DOS调用 MOV AH, 2 INT 21H JMP BEGIN STOP: RET 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。 答:程序段如下: BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用 INT 21H CMP AL, ‘a’ ;输入字符<‘a’吗 JB STOP CMP AL, ‘z’ ;输入字符>‘z’吗

DEC AL ;得到前导字符 MOV DL, AL ;准备显示三个字符 MOV CX, 3 DISPLAY: MOV AH, 2 ;显示一个字符的DOS调用 INT 21H INC DL LOOP DISPLAY STOP: RET 将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL和DL中。 答:程序段如下: DSEG SEGMENT STORE DB 4 DUP () DSEG ENDS ┇ BEGIN: MOV CL, 4 ;右移四次 MOV CH, 4 ;循环四次 LEA BX, STORE A10: MOV DX, AX AND DX, 0FH ;取AX的低四位 MOV [BX], DL ;低四位存入STORE中 INC BX SHR AX, CL ;右移四次

《汇编语言》第二版习题答案(全)

教材:《汇编语言》 检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位。 (2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 。 (3)1KB的存储器可以存储 8192(2^13)个bit, 1024个Byte。 (4)1GB是 1073741824 (2^30)个Byte、1MB是 1048576(2^20)个Byte、1KB是 1024(2^10)个Byte。 (5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为: 64 (KB)、 1 (MB)、 16 (MB)、 4 (GB)。 (6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为: 1 (B)、 1 (B)、 2 (B)、 2 (B)、 4 (B)。 (7)从内存中读取1024字节的数据,8086至少要读 512 次,80386至少要读 256 次。 (8)在存储器中,数据和程序以二进制形式存放。 解题过程: (1)1KB=1024B,8KB=1024B*8=2^N,N=13。 (2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。 (3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。 (4)1GB=1073741824B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。 (5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N 次方个内存单元。(一个内存单元=1Byte)。 (6)8根数据总线一次可以传送8位二进制数据(即一个字节)。 (7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。(8)在存储器中指令和数据没有任何区别,都是二进制信息。 检测点 2.1 (1) 写出每条汇编指令执行后相关寄存器中的值。 mov ax,62627 AX=F4A3H mov ah,31H AX=31A3H mov al,23H AX=3123H add ax,ax AX=6246H mov bx,826CH BX=826CH mov cx,ax CX=6246H mov ax,bx AX=826CH add ax,bx AX=04D8H mov al,bh AX=0482H mov ah,bl AX=6C82H add ah,ah AX=D882H add al,6 AX=D888H add al,al AX=D810H mov ax,cx AX=6246H Microsoft(R) Windows DOS

《汇编语言》习题及解答

第1章基础知识 检测点(第9页) (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13位。 (2)1KB的存储器有1024个存储单元,存储单元的编号从0到1023。 (3)1KB的存储器可以存储8192(2^13)个bit,1024个Byte。 ~ (4)1GB是24(2^30)个Byte、1MB是1048576(2^20)个Byte、1KB是1024(2^10)个Byte。 (5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为: 64(KB)、1(MB)、16(MB)、4(GB)。 (6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为: 1(B)、1(B)、2(B)、2(B)、4(B)。 (7)从内存中读取1024字节的数据,8086至少要读512次,80386至少要读256次。 (8)在存储器中,数据和程序以二进制形式存放。 解题过程: ' (1)1KB=1024B,8KB=1024B*8=2^N,N=13。 (2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。 (3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。 (4)1GB=24B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。 (5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N次方个内存单元。(一个内存单元=1Byte)。 (6)8根数据总线一次可以传送8位二进制数据(即一个字节)。 (7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。 (8)在存储器中指令和数据没有任何区别,都是二进制信息。

汇编语言课后习题答案 郑晓薇

习题一 1分别将下列二进制数作为无符号数和带符号数转换为十进制和十六进制数 ,01110111,,00101111 , 查看正确答案 无符号数: =211=D3H,01110111=119=77H,=131=83H, 00101111=47=2FH,=170=AAH 带符号数:= -45=D3H,01110111=+119=77H,= -125=83H, 00101111=+47=2FH,= -86=AAH 2十六进制运算 1A52H+4438H ,3967H-2D81H,37H×12H ,1250H×4H 查看正确答案 5E8AH,0BE6H,3DEH,4940H 3将十进制数变为8位补码,做运算(结果用二进制、十六进制、十进制表示) 29+53,73-24,-66+82 ,-102-15 查看正确答案 00011101+00110101=01010010=52H=82 01001001+=00110001=31H=49 +01010010=00010000=10H=16 +==8BH= -117 4用压缩BCD码计算(结果用二进制、BCD码、十进制表示) 29+53,73-24,66+18 ,132+75 查看正确答案 00101001+01010011=01111100+00000110==82H=82 01110011-00100100=01001111-00000110=01001001=49H=49 01100110+00011000=01111110+00000110==84H=84 00000000+01110101=00000001+00000110 =00000011=0207H=207 5符号位扩展(字节扩展为字,字扩展为双字) 20A3H,94H ,3456H ,7FH ,EC00H 查看正确答案 000020A3H,FF94H,00003456H,007FH,FFFFEC00H 6若机器字长为16位,其无符号数表示范围是多少带符号数表示范围是多少分别用十进制和十六进制表示。查看正确答案 无符号数:0~65535,0000H~FFFFH;带符号数:-32768~+32767,8000H~7FFFH 7写出下列十六进制数所能代表的数值或编码: (1)38H (2)FFH (3)5AH (4)0DH 查看正确答案

C汇编语言程序设计课后习题答案第二版沈美明

第五章 5.1 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。 答:程序段如下: BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用 INT 21H CMP AL, ‘a’ ;输入字符<‘a’吗? JB STOP CMP AL, ‘z’ ;输入字符>‘z’吗? JA STOP SUB AL, 20H ;转换为大写字母,用AND AL, 1101 1111B也可 MOV DL, AL ;显示一个字符的DOS调用 MOV AH, 2 INT 21H JMP BEGIN STOP: RET 5.2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。 答:程序段如下: BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用 INT 21H CMP AL, ‘a’ ;输入字符<‘a’吗? JB STOP CMP AL, ‘z’ ;输入字符>‘z’吗?

DEC AL ;得到前导字符 MOV DL, AL ;准备显示三个字符 MOV CX, 3 DISPLAY: MOV AH, 2 ;显示一个字符的DOS调用 INT 21H INC DL LOOP DISPLAY STOP: RET 5.3 将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL和DL中。 答:程序段如下: DSEG SEGMENT STORE DB 4 DUP (?) DSEG ENDS ┇ BEGIN: MOV CL, 4 ;右移四次 MOV CH, 4 ;循环四次 LEA BX, STORE A10: MOV DX, AX AND DX, 0FH ;取AX的低四位 MOV [BX], DL ;低四位存入STORE中 INC BX SHR AX, CL ;右移四次

汇编语言课后习题答案---郑晓薇(整理后的)doc资料

汇编语言课后习题答案---郑晓薇(整理后 的)

习题一 1 无符号数: 11010011=211=D3H,01110111=119=77H,10000011=131=83H,00101111=47=2FH,10101010=170=AAH 带符号数:11010011= - 45=D3H, 01110111=+119=77H,10000011= -125=83H,00101111=+47=2FH,10101010= -86=AAH 2 5E8AH,0BE6H,3DEH,4940H 3 00011101+00110101=0101001 0=52H=82 01001001+11101000=0011000 1=31H=49 10111110+01010010=0001000 0=10H=16 10011010+11110001=1000101 1=8BH= -117 4 00101001+01010011=0111110 0+00000110=10000010=82H= 82 01110011- 00100100=01001111-00000110=01001001=49H=49 01100110+00011000=0111111 0+00000110=10000100=84H= 84 0000000100110010+01110101 =0000000110100111+0000011 0 =0000001000000111=0207H= 207 5 000020A3H,FF94H,00003456H,007FH,FFFFEC00H 6 无符号数:0~65535, 0000H~FFFFH;带符号数:-32768~+32767,8000H~ 7FFFH 7 (1) 38H等于十进制数56,是十进制数56的补码,数字8的ASCII 码,十进制数38的压缩BCD码(2) FFH等于十进制数-1,是带符号数-1的补码,无符号数为255 (3) 5AH等于十进制数90,是十进制数90的补码,大写字母Z的ASCII码

相关文档
相关文档 最新文档