汇编语言程序设计钱晓捷课后答案.docx

上传人:b****5 文档编号:5778111 上传时间:2023-01-01 格式:DOCX 页数:8 大小:18.83KB
下载 相关 举报
汇编语言程序设计钱晓捷课后答案.docx_第1页
第1页 / 共8页
汇编语言程序设计钱晓捷课后答案.docx_第2页
第2页 / 共8页
汇编语言程序设计钱晓捷课后答案.docx_第3页
第3页 / 共8页
汇编语言程序设计钱晓捷课后答案.docx_第4页
第4页 / 共8页
汇编语言程序设计钱晓捷课后答案.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

汇编语言程序设计钱晓捷课后答案.docx

《汇编语言程序设计钱晓捷课后答案.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计钱晓捷课后答案.docx(8页珍藏版)》请在冰豆网上搜索。

汇编语言程序设计钱晓捷课后答案.docx

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

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

汇编语言程序设计(第二版)钱晓捷习题答案

第二章(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

leabx,table;获取table的首地址,BX=200H

moval,8;传送欲转换的数字,AL=8

xlat;转换为格雷码,AL=12H

2.4

堆栈是一种按“先进后出”原则存取数据的存储区域。

堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。

2.5

movax,8057h

pushax

movax,0f79h

pushax

popbx;bx=0f79h

pop[bx];DS:

[0f79h]=8057h

2.6

AL=89hCFZFSFOFPF

AL=12h10011

AL=0afh00101

AL=0afh10101

AL=00h01001

AL=0ffh00101

AL=00h01001

2.7W=X+Y+24-Z

2.8

(1)ADDDX,BX

(2)ADDAL,[BX+SI]

(3)ADD[BX+0B2H],CX

(4)ADDWORDPTR[0520H],3412H

(5)ADDAL,0A0H

2.9;为了避免与操作数地址混淆,将题中X,Y,Z,V字操作数改为A,B,C,D

movax,X;ax=A

imulY;dx,ax=A*B(将操作数看作符号数,以下同)

movcx,ax

movbx,dx;bx,axDI,转到above执行

cmpdx,di

jaabove;=jnbeabove

(2)若AX>SI,转到greater执行

cmpax,si

jggreater;=jnlegreater

(3)若CX=0,转到zero执行

cmpcx,0jcxzzero

jzzero

(4)若AX-SI产生溢出,转到overflow执行;

cmpax,di

jooverflow

(5)若SI≤AX,转到less_eq执行;

cmpsi,ax

cmpax,si

jleless_eq

jgeless_eq

(6)若DI≤DX,转到below_eq执行。

cmpdi,dx

cmpdx,di

jbebelow_eq

jaebelow_eq

2.25;答:

将首地址为array得20个字的数组求和,并将结果存入total单元中。

2.26;

(1)

movsi,0

movdl,string[si];第1个字符送dl寄存器

movsi,5

movdh,string[si];第6个字符送dh寄存器

(2)

xorsi,si;si清零

moval,buffer[si];第一字节

incsi

movah,buffer[si];第二字节

movcl,4

shlah,cl;BCD码移到高半字节

oral,ah;组合成压缩BCD码

movdl,al;存入dl寄..

incsi

moval,buffer[si];第三字节

incsi

movah,buffer[si];第四字节

movcl,4

shlah,cl;BCD码移到高半字节

oral,ah;组合成压缩BCD码

movdh,al;存入dh寄..

(3)

testdx,0f000h

jzzero

movax,-1

jmpdone

zero:

movax,0

done:

ret

(4)

leabx,buffer1

leadx,buffer2

movcx,8;8个字节

xorsi,si;si=0

clc;CF=0

(5)

movax,0b800h

movds,ax;段地址

xorsi,si;地址偏移量si=0

xordx,dx;和的高字dx=0

movcx,99;加的次数

movax,[si];第一个数

again:

incsi;指向下一个字单元

incsi

addax,[si];加下一个数

jncnoc;无进位转

incdx;有进位dx=dx+1

noc:

deccx;次数-1

jnzcx,again;非0继续加

ret

(6)

movsi,offsetstring

movcx,8000h;32k=2^15=8000h

again:

cmp[si],?

$?

jnznext

mov[si],20h;if[si]=?

$?

[si]<--?

?

next:

incsi

loopagain

(7)

xorsi,si;si<--0

movcx,100;循环次数

again:

decarray[si]

deccx

jnzagain

(8)

xorsi,si;si<--0

coun:

cmpstring[si],?

$?

jedone

incsi

jmpcoun

done:

ret

2..27;

(1)使CF=0:

clc;andax,ax;orax,ax

(2)使AX=0:

xorax,ax;andax,0;movax,0

(3)同时使AX=0和CF=0:

andax,0;xorax,ax;subax,ax

2.29;压缩BCD码加法:

AX←AX+BX

出口参数:

AX=BCD码和

2.34;okmsgdb…OK?

…$?

errmsgdb…Error!

Overflow!

?

…$?

movax,X

subax,Y

jooverflow

movdx,offsetokmsg

jmpnext

overflow:

movdx,errmsg

next:

movah,9

int21h

错误:

movax,X

subax,Y

jooverflow

movdx,offsetokmsg

okmsgdb…OK?

…$?

movdx,errmsg;错误1:

数据定义在代码中

movah,9

int21h

overflow:

errmsgdb…Error!

Overflow!

?

…$?

movdx,errmsg;错误2:

缺少JMP指令

movah,9

int21h

2.37;;xt237.asm

.modelsmall

.stack

.data

arraydb255

db0

array1db255dup('$')

array2db0dh,0ah,'$'

.code

.startup

movah,0ah;键盘输入字符串

movdx,offsetarray

int21h

movdx,offsetarray2;回车换行

movah,09h

int21h

movbx,offsetarray1

again:

moval,[bx]

cmpal,'$'

jzdone

cmpal,'a';小于a和大于z的字符不是小写字母

jbnext

cmpal,'z'

janext

subal,20h;在a和z之间的字符才是小写字母,转换为大写mov[bx],al;保存到原位置

next:

incbx

jmpagain

done:

movdx,offsetarray1

movah,09h

int21h

.exit0

end

第三章(01)

3.1;硬指令:

每个硬指令就是一个处理器指令,在CPU执行时产生相应功能;伪指令:

伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。

3.2;

3.5;⒈编辑文本编辑程序汇编语言源程序.asm

⒉汇编汇编程序目标模块文件.obj

⒊连接连接程序可执行文件.exe或.com

⒋调试调试程序应用程序

3.6;;xt236.asm简化段定义格式

.modelsmall;定义程序的存储模式(小模式)

.stack;定义堆栈段(默认1024个字节)

.data;定义数据段

str1ab?

InputNumber:

0~9:

?

0dh,0ah,?

$?

str2ab?

Error!

?

0dh,0ah,?

$?

.cade;定义代码段

.startup;说明程序的起始点,建立ds,ss的内容。

movah,09h;显示str1字符串

movdx,offsetstr1

int21h

gtekey:

movah,1;调用BIOS判断按键功能

int16h

jzgetkey;如zf=0,无键按下,等待

cmpal,…0?

;有键按下,键值与…0?

比较

jberror;如<…0?

,出错处理

cmpal,…9?

;有键按下,键值与…9?

比较

jaerror;如〉…9?

,出错处理

movah,02h;调用DOS显示字符功能,显示该数字

movdl,al

int21h

.exit0;终止程序执行,返回DOS

error:

movah,09h;出错,调用DOS功能显示str2字符串

movdx,offsetstr2

int21h

jmpgetkey;等待按键

end;汇编结束

3.7;;xt307.asm

stacksegment

dw512dup(?

stackends

datasegment

arraydb255

db0

array1db255dup('$')

array2db0dh,0ah,'$'

dataends

codesegment'code'

assumecs:

code,ds:

data,ss:

stack

start:

movax,data

movds,ax

movah,0ah;键盘输入字符串

movdx,offsetarray

int21h

movdx,offsetarray2;回车换行

movah,09h

int21h

movbx,offsetarray1

again:

moval,[bx]

cmpal,'$'

jzdone

cmpal,'a';小于a和大于z的字符不是小写字母

jbnext

cmpal,'z'

janext

subal,20h;在a和z之间的字符才是小写字母,转换为大写

mov[bx],al;保存到原位置

next:

incbx

jmpagain

done:

movdx,offsetarray1

movah,09h

int21h

movax,4c00h

int21h

codeends

endstart

3.9;

(1)movbyteptr[bx],1000;1000超出了一个字节范围

(2)movbx,offsetmyword[si];寄存器的值只有程序执行时才能确定,;而offset是汇编过程计算偏移地址,故无法确定

;可以改为leabx,myword[si]

(3)cmpmybyte1,mybyte2;两个都是存储单元,指令不允许

(4)moval,mybyte1+mybyte2;变量值只有执行时才确定,汇编过程不能计算

(5)subal,myword;字节量AL与字量myword,类型不匹配(6)jnzmyword;Jcc指令只有相对寻址方式,不支持间接寻址方式

3.10;前者为“与”操作硬指令助记符,可汇编成机器代码。

后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。

3.11;注:

对于逻辑运算,有关操作数可化为二进制数。

(1)moval,23hAND45hOR67h;67h

(2)movax,1234h/16+1Oh;133h

(3)movax,NOT(65535XOR1234h);1234h

(4)moval,LOW1234hORHIGH5678h;76h

(5)movax,23hSHL4;0234h

(6)movax,1234hSHR6;0048h

(7)moval,’a’AND(NOT(’a’-’A’));41h

(8)moval,’H’OR00100000b;68h

(9)movax,(76543LT32768)XOR7654h;7654h

3.12;假设block开始的数据块有32个字节数据:

16个正数+100(64h),16个负数-48(0doh)

分别连续分布:

blockdb16dup(100),16dup(-48);也可以是任意字节数据,随意分布。

dplusdb32dup(?

);为正数预留存储空间dminusdb32dup(?

);为负数预留存储空间

countequ32;字节数

3.15;mydatasegsegment

my1bdb‘PersonalComputer’

my2bdb20

my3bdb14h;20h

my4bdb00010100b

my5wdw20dup(?

my6cequ100;my6c=100

my7cequ

mydatasegends

3.18;段地址:

表示标号所在代码段的段地址;

偏移地址:

表示标号所在代码段的段内偏移地址;

类型:

引用该标号时,表示它所在同一个段――near类型,还是另外一个段――far类型。

3.19;mydatasegment

ORGlO0h

VARWDWl234H,5678H

VARBDB3,4

AGLIN4

VARDDD12345678H

EVEN

BUFFDB10DUP(?

MESSDB’HELLO’

MOVAX,OFFSETVARB+OFFSETMESS;AX=4+16H=1AH

MOVAX,TYFETYPEBUFF+TYPEMESS+TYPEVARD;AX=1+1+4=06HMOVAX,SIZEVARW+SIZEBUFF+SIZEMESS;AX=4+10+5=19=13HMOVAX,LENGTHVARW+LENGTHVARD;AX=2+1=03H

MOVAX,LENGTHBUFF+SIZEVARW;AX=10+4=14=0EH

MOVAX,TYPEBIGIN;AX=FF02H(近)

MOVAX,OFFSETBEGIN;AX=1BH

3.22;段定义伪指令段名定位组合类别组名

.CODE_TEXTWORDPUBLIC’CODE’

.DATA_DATAWORDPUBLIC’DATA’DGROUP

.STACKSTACKPARASTACK’STACK’DGROUP

3.25;.modelsmall

.stack

.data

numequ5

datalistdw-1,0,2,5,4,?

.code

.startup

movbx,offsetdatalist

movcx,num

xorax,ax

again:

addax,[bx]

incbx

incbx

loopagain

mov[bx],ax

.exit0

end

3.26;stacksegmentpara‘stack’

dw512dup(?

stackends

datasegment

dwordarraydb100dup(?

dataends

codesegment‘code’

assumecs:

code,ds:

data,es:

data,ss:

stack

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1