汇编语言程序设计课后答案_第1页
汇编语言程序设计课后答案_第2页
汇编语言程序设计课后答案_第3页
汇编语言程序设计课后答案_第4页
汇编语言程序设计课后答案_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-. z.汇编语言程序设计(第二版)钱晓捷习题答案第二章2.11A*1200h 2A*0100h 3A*4C2Ah 4A*3412h 5A*4C2Ah 6A*7856h 7A*65B7h 2.2(1)两操作数类型不匹配 (2) IP指令指针制止用户访问 (3)立即数不允许传给段存放器 (4)段存放器之间不允许传送 (5)两操作数类型不匹配 (6)目的操作数应为 BP (7)源操作数应为 B*+DI(8)立即数不能作目的操作数2.3lea b*,table;获取table的首地址,B*200H mov al,8;传送欲转换的数字,AL8 *lat;转换为格雷码,AL12H 2.4堆栈是一种按“先

2、进后出原则存取数据的存储区域。 堆栈的两种根本操作是压栈和出栈,对应的指令是PUSH和POP。2.5mov a*,8057h push a* mov a*,0f79h push a* pop b* ;b*=0f79h pop b* ;DS:0f79h=8057h 2.6AL=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 12.7W=*+Y+24-Z2.81ADD D*,B* 2ADD AL,B*+S

3、I 3ADD B*+0B2H,C* 4ADD WORD PTR 0520H,3412H 5ADD AL,0A0H 2.9;为了防止与操作数地址混淆,将题中*,Y,Z,V 字操作数改为A,B,C,D mov a*,*;a*=A imul Y;d*,a* = A*B (将操作数看作符号数,以下同 mov c*,a* mov b*,d*;b*,a* - d*,a* =A*B mov a*,Z;a* = C cwd;d*,a* =C扩展符号后为双字 add c*,a* adc b*,d*;b*,c* - b*,c*+d*,a*=A*B+C sub c*,540 sbb b*,0;b*,c* DI,转到

4、above执行 cmp d*,di ja above;jnbe above 2假设A* SI,转到greater执行 cmp a*,si jg greater;jnle greater 3假设C* = 0,转到zero执行 cmp c*,0 jc*z zero jz zero4假设A*SI产生溢出,转到overflow执行; cmp a*,di jo overflow 5假设SIA*,转到less_eq执行; cmp si,a* cmp a*,si jle less_eq jge less_eq 6假设DID*,转到below_eq执行。 cmp di,d* cmp d*,di e below

5、_eq jae below_eq2.25; 答:将首地址为array得20个字的数组求和,并将结果存入 total 单元中。2.26; (1) mov si,0 mov dl,stringsi;第1个字符送dl存放器 mov si,5 mov dh,stringsi;第6个字符送dh存放器 (2) *or si,si;si清零 mov al,buffersi;第一字节 inc si mov ah,buffersi;第二字节 mov cl,4 shl ah,cl;BCD码移到高半字节 or al,ah;组合成压缩BCD码 mov dl,al;存入dl寄. inc si mov al,buffer

6、si;第三字节 inc si mov ah,buffersi;第四字节 mov cl,4 shl ah,cl;BCD码移到高半字节 or al,ah;组合成压缩BCD码 mov dh,al;存入dh寄. (3) test d*,0f000h jz zero mov a*,-1 jmp done zero: mov a*,0 done: ret (4) lea b*,buffer1 lea d*,buffer2 mov c*,8;8个字节 *or si,si;si=0 clc;CF=0 (5) mov a*,0b800h mov ds,a*;段地址 *or si,si;地址偏移量si=0 *or

7、 d*,d*;和的高字d*=0 mov c*,99;加的次数 mov a*,si;第一个数 again: inc si;指向下一个字单元 inc si add a*,si;加下一个数 jnc noc;无进位转 inc d*;有进位d*=d*+1 noc: dec c*;次数-1 jnz c*,again;非0继续加 ret (6) mov si,offset string mov c*,8000h;32k=215=8000h again: cmp si,$ jnz ne*t mov si,20h;if si=$ si- ne*t: inc si loop again (7) *or si,si

8、;si-0 mov c*,100;循环次数 again: dec arraysi dec c* jnz again (8) *or si,si ;si-0 coun: cmp stringsi,$ je done inc si jmp coun done: ret2.27; (1)使CF0 : clc; and a*,a*;or a*,a* (2)使A*0 : *or a*,a*; and a*,0;mov a*,0 (3)同时使A*0和CF0: and a*,0 ;*or a*,a* ;sub a*,a*2.29; 压缩BCD码加法:A*A*B* 出口参数:A*BCD码和2.34; okms

9、g db OK, $errmsg db Error ! Overflow !, $ mov a*,* sub a*,Y jo overflow mov d*,offset okmsg jmp ne*t overflow: mov d*,errmsg ne*t: mov ah,9 int 21h 错误: mov a*,* sub a*,Y jo overflow mov d*,offset okmsg okmsg db OK, $ mov d*,errmsg ;错误1:数据定义在代码中 mov ah,9 int 21h overflow: errmsg db Error ! Overflow !

10、, $ mov d*,errmsg ; 错误2:缺少JMP指令 mov ah,9 int 21h 2.37; ;*t237.asm.model small.stack.dataarray db 255db 0array1 db 255 dup($)array2 db 0dh,0ah,$ .code.startupmov ah,0ah ; 键盘输入字符串mov d*,offset arrayint 21hmov d*,offset array2 ; 回车换行mov ah,09hint 21hmov b*,offset array1again: mov al,b*cmp al,$jz donecm

11、p al,a ; 小于a和大于z的字符不是小写字母 ne*tcmp al,zja ne*tsub al,20h ; 在a和z之间的字符才是小写字母,转换为大写mov b*,al ; 保存到原位置ne*t: inc b*jmp againdone: mov d*,offset array1mov ah,09hint 21h.e*it 0end第三章(01) 3.1; 硬指令:每个硬指令就是一个处理器指令,在CPU执行时产生相应功能; 伪指令:伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进展汇编。3.2;3.5; 编辑文本编辑程序汇编语言源程序.asm 汇编汇编程序目标模块文件.obj

12、 连接连接程序可执行文件.e*e或. 调试调试程序应用程序3.6; ;*t236.asm简化段定义格式 .model small ;定义程序的存储模式小模式 .stack;定义堆栈段默认1024个字节 .data;定义数据段 str1 ab Input Number:09 : ,0dh,0ah,$str2 ab Error!,0dh,0ah,$ .cade;定义代码段 .startup;说明程序的起始点,建立ds,ss的内容。 mov ah,09h;显示str1字符串 mov d*,offset str1 int 21h gtekey: mov ah,1;调用BIOS判断按键功能 int 16

13、h jz getkey;如 zf = 0,无键按下,等待 cmp al,0;有键按下,键值与0比拟 error;如 0,出错处理 cmp al, 9 ;有键按下,键值与 9比拟 ja error;如 9,出错处理 mov ah,02h;调用DOS显示字符功能,显示该数字 mov dl,al int 21h .e*it 0;终止程序执行,返回DOS error: mov ah,09h; 出错,调用DOS 功能显示str2字符串 mov d*,offset str2 int 21h jmp getkey;等待按键 end; 汇编完毕3.7; ;*t307.asmstack segment dw 5

14、12 dup() stack endsdata segmentarray db 255db 0array1 db 255 dup($)array2 db 0dh,0ah,$ data endscode segment codeassume cs:code, ds:data, ss:stackstart: mov a*,data mov ds,a* mov ah,0ah ; 键盘输入字符串mov d*,offset arrayint 21hmov d*,offset array2 ; 回车换行mov ah,09hint 21hmov b*,offset array1again: mov al,b

15、*cmp al,$jz donecmp al,a ; 小于a和大于z的字符不是小写字母 ne*tcmp al,zja ne*tsub al,20h ; 在a和z之间的字符才是小写字母,转换为大写mov b*,al ; 保存到原位置ne*t: inc b*jmp againdone: mov d*,offset array1mov ah,09hint 21hmov a*,4c00hint 21hcode endsend start3.9; 1 mov byte ptr b*,1000;1000超出了一个字节*围 2 mov b*,offset mywordsi;存放器的值只有程序执行时才能确定,

16、 ;而offset是汇编过程计算偏移地址,故无法确定 ;可以改为lea b*,mywordsi 3 cmp mybyte1,mybyte2;两个都是存储单元,指令不允许 4 mov al,mybyte1+mybyte2 ;变量值只有执行时才确定,汇编过程不能计算 5 sub al,myword;字节量AL与字量myword,类型不匹配 6 jnz myword;Jcc指令只有相对寻址方式,不支持间接寻址方式3.10; 前者为“与操作硬指令助记符,可汇编成机器代码。 后者为逻辑运算符,在汇编时进展“与运算,产生具体数值。3.11; 注:对于逻辑运算,有关操作数可化为二进制数。 (1)mov al

17、,23h AND 45h OR 67h; 67h (2)mov a*,1234h/16 + 1Oh; 133h (3)mov a*,NOT(65535 *OR 1234h); 1234h (4)mov al, LOW 1234h OR HIGH 5678h; 76h (5)mov a*,23h SHL 4; 0234h (6)mov a*, 1234h SHR 6; 0048h (7)mov al,a AND (NOT(a-A) ; 41h (8)mov al,H OR 00100000b; 68h (9)mov a*,(76543 LT 32768) *OR 7654h; 7654h3.12

18、; 假设block开场的数据块有32个字节数据:16个正数+100 (64h),16个负数 -48 0doh 分别连续分布: block db 16 dup100,16 dup-48 ;也可以是任意字节数据,随意分布。 dplus db 32 dup();为正数预留存储空间 dminus db 32 dup();为负数预留存储空间 count equ 32;字节数3.15; mydataseg segment my1b db Personal puter my2b db 20 my3b db 14h ;20h my4b db 00010100b my5w dw 20 dup() my6c eq

19、u 100 ;my6c = 100 my7c equ mydataseg ends3.18; 段地址:表示标号所在代码段的段地址; 偏移地址:表示标号所在代码段的段内偏移地址; 类型:引用该标号时,表示它所在同一个段near类型,还是另外一个段far类型。3.19; mydata segment ORG lO0h VARW DW l234H,5678H VARB DB 3,4 AGLIN 4 VARD DD 12345678H EVEN BUFF DB 10 DUP() MESS DB HELLO MOV A*, OFFSET VARB + OFFSET MESS;A* = 4+16H = 1

20、AH MOV A*, TYFE TYPE BUFF+TYPE MESS+TYPE VARD;A* = 1+1+4 = 06H MOV A*,SIZE VARW+SIZE BUFF+SIZE MESS;A* = 4+10+5 = 19 = 13H MOV A*,LENGTH VARW + LENGTH VARD;A* = 2+1 = 03H MOV A*,LENGTH BUFF + SIZE VARW;A* = 10+4 =14 = 0EH MOV A*,TYPE BIGIN;A* = FF02H (近 MOV A*,OFFSET BEGIN;A* = 1BH3.22; 段定义伪指令段名定位组合

21、类别组名 .CODE _TE*T WORD PUBLIC CODE.DATA _DATA WORD PUBLIC DATA DGROUP .STACK STACKPARA STACK STACK DGROUP 3.25; .model small .stack .data num equ 5 datalist dw -1,0,2,5,4, .code .startup mov b*,offset datalist mov c*,num *or a*,a* again: add a*,b* inc b* inc b* loop again mov b*,a* .e*it 0 end3.26; s

22、tack segment para stackdw 512 dup() stack ends data segment dword array db 100 dup() data ends code segment code assume cs:code,ds:data,es:data,ss:stack org 100h start: mov a*,data mov ds,a* mov es,a* mov di,offset array mov al,64h mov c*,100 cld rep stosb mov a*,4c00h int 21h code ends end start3.2

23、7;解答;*t327.asm .model small .stack 256;定义堆栈段大小为256个字节 .data anum dd 11223344h;定义两个双字的数随意 bnum dd 77553311h sum dd ;定义结果,执行后为:88776655h .code .startup *or si, si;相对于变量的位移量清零 mov c*, 2;分上下字分别相加,共两次 clc;清零cf again:mov a*, anumsi;取第一个数的一个字先低字后高字 adc a*, bnumsi;取第二个数的一个字先低字后高字 mov sumsi, a*;存和的一个字先低字后高字

24、inc si;修改位移量指向下一个字加2 inc si loop again;c*=c*-1 ,if c*0 ,jump again .e*it 0 end 3.28; .startup *or si, si;位移量清零 mov al, bdatasi;取第一个数 mov c*, num-1;累加次数 again: inc si;指向下一个数 adc al, bdatasi;累加 loop again;如未完,继续累加 mov sum, al;完了,存结果 .e*it 0 end4.3; 思路:设这四组从低位到高位分别放在AL、BL、CL和DL存放器中。这里仅列出代码段: mov bl, al

25、;将al中的两组分开 and al, 0fh;屏蔽高四位后送al mov cl, 4;原al中的数据逻辑右移4次送bl shr bl, cl mov dl, ah;将ah中的两组分开 and dl, 0f0h;屏蔽低高四位后送dl mov cl, 4;原ah中的数据逻辑右移4次送dl shr dl, cl mov cl, ah;屏蔽高四位后送cl and cl, 0fh4.4; getkey: mov ah, 1;从键盘输入,出口:al存键值 int 21h cmp al, a;判键值是小写字母? getkay cmp al, z ja getkay sub al,20h;是小写字母转换为大写

26、字母 mov ah, 09h;显示 int 21h4.8; 1 将jmp tableb*指令改为:mov d*, tableb*2 去掉源程序中:.e*it 0-end之间的语句4.17; .model small .stack 256 .data stri1 db please input number:1-9,odh,oah,$ .code .startup again: mov d*,offset stri1;显示stri1,提示输入 mov ah,09h int 21h mov ah,01h;调用输入一个字符 int 21h;输入一个字符存在al中 cmp al, 1;判该字符,如不在

27、1-9 again;重新输入 cmp al, 9 ja again and al,0fh;在1-9,屏蔽高4位 mov c*, al;振铃次数送c* .repeat mov dl, 07h;调用一次振铃 mov ah, 02h int 21h mov d* ,0ffffh;延时 abc: dec d* jnz abc .untilc*z;c*=c*-1,c*=0 退出 .e*it 0 end4.22;crazy PROC;crazy PROC push a*; *or a*,a*; *or a*,a* *or d*,d*; *or d*,d* again: add a*,b*;again: a

28、dd a*,b* adc d*,0; adc d*,0 inc b*; inc b* inc b*; inc b* loop again; loop again ret; ret ENDP crazy; crazy ENDP425;子程序中又调用子程序就形成子程序嵌套。 子程序中直接或间接调用该子程序本身就形成子程序递归。426; .model small .stack 256 .data stdng db HeLLO eveRyboDy ! , 0 .code .startup mov b*, offset atring again: mov al, b* call chan;调用过程 mo

29、v b* , al ne*t: inc b* jmp againdone: .e*it 0chan proc;大写转换为小写字母的过程 or al, al jz done cmp al,A ne*t cmp al, Z ja ne*t or al, 20h ret chan endp end 427;astob proc and dh, 0fh;十位数的ASCII码转为二进制数 mov al, dh mul 10;al= 10*dh and dl, 0fh;个位数的ASCII码转为二进制数 add al, dl;al= 10*dh + dl ret astob endp51; cmp *, 5

30、 je abc jmp done abc: cmp a*, b* jne cde jmp done cde: inc a* done:.52;cmp *, 5 je abc jmp done cmp a*, b* jne abc jmp done abc: inc a* done: .54;宏定义采用一对伪指令实现,格式如下其中方括号表示可选: 宏名 macro 形参表 宏定义体 endm 宏调用时,利用宏名带上实参即可,格式如下: 宏名 实参表56;宏的参数功能非常强大,即可以没有参数,也可以带有一个或多个参数;而且参数的形式非常灵活,可以是常量、变量、存储单元、指令或它们的一局部,还可以是

31、表达式等。 宏展开时的形参与实参结合是用位置匹配的实参对形参进展取代。实参个数与形参个数不同时,多余的实参没有作用,缺少的实参则用空格代替。取代时,不进展有效性等检查。57;宏汇编的特点是在汇编阶段进展语句展开,无需返回,不减少目标程序代码,执行速度没有改变;通过形参、实参结合传递参数。宏汇编适合于程序段较短或要求执行速度快的场合。 子程序在执行阶段需要由主程序执行调用指令CALL进展调用,进而转入子程序执行,子程序执行完毕执行返回指令RET返回主程序。子程序如果被屡次使用,则会减少目标程序代码;主程序与子程序之间主要采用存放器、存储单元、堆栈等传递参数。子程序适合于程序段较长或为减少目标代码

32、的场合。59;shrot word ptr b*,4,ror 1 push c* 1 mov cl,4 1 ror word ptr b*,cl 1 pop c*5.10;logical macro lcode,dopd,sopd lcode dopd,sopd endm 例如,如果使用“and a*,b*指令,可以利用该宏定义,写出宏指令如下: logical and,a*,b* 初看起来,这个问题似乎比拟难解决。实际上,这4条逻辑指令都具有一样的指令操作数格式,所以可以归纳为如上宏定义。5.12; move MACRO doprnd,soprnd push a* mov a*,soprnd

33、 mov doprnd,a* pop a* ENDM 第五章(02)5.13;解答movstr strN,dstr,sstr lea si, sstr lea di, dstr mov c*, strN cld rep movsb endm 5.14; ABSDIF Pl,P2,DISTANCEABSDIF B*,SI,DI 1 push a*答:1 push a* 1 mov a*,P1 1 mov a*,b* 1 sub a*,P2 1 sub a*,si 1 cmp a*,0 1 cmp a*,0 1 jge 0000 1 jge 0000 1 neg a* 1 neg a* 1 000

34、0 1 0000 1 mov DISTANCE, a* 1 mov di,a* 1 pop a* 1 pop a*5.15; wtemp =2 repeat 100 dw 0 dw wtemp wtemp =wtemp+2 endm5.18; DOS21H MACRO callnum,calladdress mov ah,callnum ifnb mov d*,calladdress endif int 21h ENDM5.22; 1.编写主程序,并进展汇编产生OBJ模块;2.编写独立的子程序,也进展汇编产生OBJ模块;3.分别编写主程序与子程序时,需要处理好共用变量、过程、逻辑段属性、参数传

35、递等问题;4.利用连接程序将主程序模块和子程序模块连接起来,形成完整的可执行程序。5.28; ;数据段 table dw 2277,2138,1808,1709,1522,1356,1208,1139 ;对应中音1 7和高音i的定时器记数值 ;代码段 mov al,0b6h;设置定时器2工作方式 out 43h,al again: mov ah,1;等待按键 int 21h cmp al,1;判断是否为数字18 ne*t cmp al,8 ja ne*t sub al,30h ;18的ASCII码转换为二进制数 sub al,1 ;再减1,将数字18变为07,以便查表 *or ah,ah sh

36、l a*,1;乘以2 mov b*,a* ;记数值表是16位数据,无法采用*lat指令 mov a*,tableb*;取出对应的记数值 out 42h,al;设置定时器2的记数值 mov al,ah out 42h,al in al,61h;翻开扬声器声音 or al,03h;使D1D0PB1PB011b,其他位不变 out 61h,al jmp again;连续发声,直到按下另一个键 ne*t: push a* in al,61h;不是数字18,则关闭扬声器声音 and al,0fch;使D1D0PB1PB000b,其他位不变 out 61h,al pop a* cmp al,1bh;判断是

37、否为ESC键对应ASCII码1bh jne again;不是ESC,继续;否则程序执行完毕 -1。.1立即寻址没有2直接寻址7237H3使用B*的存放器寻址没有4使用B*的间接寻址637DH5使用B*的存放器相对寻址0D5F0H(6)基址变址寻址8E18H7相对基址变址004FH2。根据以下要求,写出相应的汇编指令。1ADDD*,B*(2)ADDAL,B*SI(3)ADDB*0B2H,C*(4)MOVA*,2A59HADD0524H,A*(5)ADDAL,0B5H3。1存放器间接寻址MOVB*,OFFSETBLOCKADDB*,OAHMOVD*,B*2存放器相对寻址MOVB*,0AHMOVD*

38、,BLOCKB*(3)基址变址寻址MOVB*,OFFSETBLOCKMOVSI,OAHMOVD*,B*SI4。现有DS=2000H,(B*)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(20201)=4CH,(21202)=B7H,(21203)=65H,试说明以下各条指令执行完后,A*存放器的内容。1MOVA*,1200H1200H(2)MOVA*,B*0100H(3)MOVA*,12004C2AH4MOVA*,B*3412H5MOV1100B*4C2AH(6)MOVA*,B*SI

39、7856H(7)MOVA*,1100B*SI65B7H5。17CD9H(2)212A0+1200H=0600H(3)212A0H+1200H+5119HH=098AH6。MOVB*,2000H或LESB*,2000LESDI,B*MOVA*,ES:B*MOVA*,ES:DI7。转向地址OBJ的值分别为:1064DH(2)0691H(3)05ECH注意有符号数的符号位8。1MOVA*,0ABH立即数寻址无物理地址2MOVA*,B*存放器寻址同上3MOVA*,100直接寻址20100H4MOVA*,VAL直接寻址20050H(5)MOVA*,B*存放器间接寻址20100H(6)MOVA*,ES:B

40、*直接寻址21100H(7)MOVA*,BP存放器间接寻址20010H8MOVA*,SI同上200A0H(9)MOVA*,B*+10存放器相对寻址20110H10MOVA*,VALB*同上20150H(11)MOVA*,B*SI基址变址寻址201A0H(12)MOVA*,VALB*SI相对基相变址寻址201F0H9。1的指令:MOVA*,B*0CHMOVZREO,A*(2)的指令:MOVA*,ARRAYB*MOVZREO,A*10。MOVA*,TABLE是把符号地址TABLE里的内容送到A*里,指令执行完后,(A*)=1234HLEAA*,TABLE是把符号地址TABLE的有效地址这里是偏移量

41、送到指定存放器A*里,指令执行完后,A*=0032H11。执行完指令后,A*=1E00H12。LEAA*,CSTRINGMOVDL,A*MOVDH,A*+613。这个嘛不想做了,麻烦啊14。LESB*,2000MOVA*,ES:B*注意:一开场我写的是:MOVA*,ES:8000H,后来看到题目里要求写两条指令,所以一条就不行了,就要画蛇添足15。运算结果SF,ZF,CF,OF各位的值从左至右依次往下174D4H0000(2)A5C1H1001(3)4240H0010(4)0000H011016。接上表(1)5D140000(2)A8701001(3)D8701000(4)34E4001017

42、。(1).MOVA*,Z;把Z送到A*SUBA*,*;Z-*ADDA*,W;W+(Z-*)MOVZ,A*;结果保存在Z中(2).MOVA*,R;R送到A*中ADDA*,9;R+9MOVB*,*;*送到B*中ADDB*,6;*+6ADDA*,B*;R+9+(*+6),结果保存在A*中MOVB*,W;W送到B*中SUBB*,A*;W-R+9-(*+6),连续减去两个数,相当于减去这两个数的和MOVZ,B*;最终结果送到Z中(3)MOVA*,W;把W送到A*IMUL*;W*注意:低十六位保存在A*里,高十六位保存在D*里MOVB*,Y;把Y送到B*里ADDB*,6;Y+6IDIVB*;W*/(Y+6

43、)注意:商保存在A*里,余数保存在D*里MOVZ,A*;把商送到Z中,MOVR,D*;把余数送到R中(4)MOVA*,W;把W送到A*中SUBA*,*;W-*CWD;把A*中的十六位带符号数扩展成为32位,低十六位保存在A*中,高十六位保;在D*中MOVB*,5;把5送到B*中IDIVB*;W-*/5被除数为32位,除数为16位商为16位IMULY;上一步结果再乖以Y,积为32位MOVB*,2;把2送到B*中IMULB*;上一步乘法所得的积再乘以2,各为64位MOVZ,EA*;把结果中低32位放入Z双字单元中MOVZ+4,ED*;把结果中高32位放入Z+4双字单元中18。指令本条指令执行完后A

44、*的内容执行完后CF,SF,ZF的值MOVA*,1234H1234H000MOVCL,41234H000ROLA*,CL2341H100DECA*2340H100MOVC*,42340H100MULC*8918H000INT20H程序完毕后,A*=8918H(D*)=0000H19。指令执行完后A*的内容执行完后CF,SF,ZF和OF的值MOVA*,000010DECA*FFFFH0100ADDA*,7FFFH7FFEH0000ADDA*,28000H0101NOTA*7FFFH0101SUBA*,0FFFFH8000H1101ADDA*,8000H0000H1011SUBA*,1FFFFH1

45、101ANDA*,58D1H58D1H0000SALA*,1B1A2H0101SARA*,1D8D1H0100NEGA*272FH1000RORA*,19397H100120。1MOVA*,DATA*ADDDATAY,A*2MOVA*,DATA*ADDDATAY,A*MOVA*,DATA*+2ADDDATAY+2,A*3本組指令的作用是:B*-DATA*+DATAY+1(CF的值)帶進位加法4MOVA*,DATA*MULDATAY;結果的高十六位保存在D*裏,低十六位保存在A*裏5MOVA*,DATA*MOVD*,DATA*+2MULDWORDDATAY;結果的高三十二位保存在ED*裏,低三十

46、二位保存在EA*裏;這裏所用的DWORD為一屬性操作符,在第四章會學到6MOVA*,DATA*DIV17H;結果商保存在AL中,余數在AH中7MOVA*,DATA*CDWDIVDATAY21。NEGD*NEGA*SBBD*,022。MOVA*,A;把雙字長數的低字放到A*中MOVD*,A+2;把雙字長數的高字放到D*中TESTD*,8000H;測試雙字長數的符號JZRIGHT;如果是非負數,則直接保存NEGD*;如果是負數,則求補NEGA*SBBD*,0RIGHT:MOVB,A*MOVB+2,D*1。指令以下指令的错误1MOVAH,B*源操作数与目的操作数长度不一样2MOVB*,SI这是两个内

47、存单元在传递数据,而这在汇编语言中是不允许的(3)MOVA*,SIDI不能用两个变址连用,其中一个应为基址4MOVMYDATB*SI,ES:A*同25MOVBYTEPTRB*,1000必须有一个为存放器6MOVB*,OFFSETMYDATSIOFFSET不能与复杂操作数相连7MOVCS,A*不能对CS赋值8MOVEC*,A*操作数类型不同2。1合法2非法3非法4非法3。1非法,操作数类型不同2合法3非法,不允许两个内存单元直接传递数据,你把人家CPU放哪了?呵4合法5合法6合法7非法,必须有一个存放器把CPU放哪了?8非法,两个内存单元地址相加没有意义9合法10非法,同34。1两内存单元传递数

48、据2操作数类型不同3跳转指令只能跳转到符号地址4转移指令后不能为变量,只能为标号5格式不对,应为NEARPTR。5。图,就不画了6。1DW5150H2MOVA*,5150HMOVADDRESS,A*等,写出几个就可以7。DATASGSEGMENTFLD1BDBpersonalputerFLD2BDB10DUP(32)FLD3BDB20HFLD4BDB01011001BFLD5BDB32654FLD6BDB10DUP(0)FLD7BDBPART1,DUP20(),PART2,DUP50(),PART3,DUP14()FLD1WDW0FFF0HFLD2WDW01011001BFLD3WDWFLD7

49、BFLD4WDW5,6,7,8,9FLD5WDW5DUP0FLD6WDWFLD6W-FLD1W-FLD7B-FLD1B8。PLENTH的值为22,GE表示该数据段的长度9。L的值为710。1MOVA*,OFFSETLNAME2MOVSI,WORDPTRCODE_LIST3CODE_LENGHTEQU$-CODE_LIST11。代码如下:DATA_SEGSEGMENTDB5DATA_LISTDW0FFFFH,0,2,5,4,5DUP()DATA_SEGENDSCODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATA_SEGMOVA*,5MOVMA*,A*MOVA*,0FF

50、FFHMOVMIN,A*CODE_SEGENDS12。1100252193254843510360FFFFH718313。分别汇编成为:MOVA*,0AHMOVBL,0AHMOVCL,114。1A*=12A*=23C*=14H4D*=32H5C*=115。1操作符错误改为:DATA_SEGSEGMENT(2)缺少段名在前面加个段名3引用应该从;开场把那个“/改成“;4构造混乱改为:MAIN_PROCPROCFAR。MAIN_PROCENDPEND16。程序框架如下:DATA_SEGSEGMENT;定義數據段ORG0E000H;讓下一字節地址為0E000HFIRST_TYPEEQUTHISWOR

51、D;建立一個與下一存儲單元有一样段地址和偏移地址的操作數DATA_GROUPDB100DUP();給DATA_GROUP分配100個字節的空間DATA_SEGENDS;數據段結束STACK_SEGSEGMENT;定義堆棧段ALIGN16;讓下一字節從小段首地址開始STACKDB100DUP();為堆棧分配空間STACK_SEGENDS;CODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEGORG1000H;讓下條指令的第一個字節從1000H開始START:MOVA*,DATA_SEGMOVDS,A*MOVA*,STACK_SEGMOV

52、SS,A*.CODE_SEGENDSENDSTART;結束17。程序如下:D_SEGSEGMENT;数据段定义AUGENDDD99251D_SEGENDSE_SEGSEGMENT;附加段定义ADDENDDD-15926E_SEGENDSC_SEGSEGMENT;代码段定义ASSUMECS:C_SEG,DS:D_SEG,ES:E_SEGSTART:MOVA*,D_SEGMOVDS,A*MOVA*,E_SEGMOVES,A*MOVEA*,DS:AUGENDADDEA*,ES:ADDENDMOVDS:SUM,EA*C_SEGENDSENDSTART;完毕18。19。需要加上PTR伪操作的有:34;2

53、不需要加,因为B*自动转化为字节类型5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来.modelsmall.stack100H.codemainprocfarStart:pushd*mova*,0pusha*movah,01Hint21Hcmpal,61Hjllop1cmpal,7BHjgelop1subal,20Hmovdl,allop1:movah,2int21HretEndstart5.2编写一个程序,从键盘承受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符.modelsmall.386.codeMAINPROCFARstart:pushds

54、suba*,a*pusha*input:movah,7Hint21Hcmpe:cmpal,20HJEe*itcmpal,61HJLinputcmpal,7AHJGinputprint:subal,01Hmovdl,almovah,02Hint21Haddal,01Hmovdl,almovah,02Hint21Haddal,01Hmovdl,almovah,02Hint21H;输出换行回车movdl,0AHmovah,02Hint21Hjmpinpute*it:retMAINENDPENDstart5.3将A*存放器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。

55、.modelsmall.data*DB4dup().stack100H.codeMAINPROCFARstart:pushdsanda*,00Hpusha*mova*,1234Hmovc*,04Hmovsi,00Hlop:pushc*movcl,04Hrola*,clpusha*andal,0FHmovBYTEPTR*si,alpopa*popc*addsi,2Looplopmoval,*movbl,*+2movcl,*+4movdl,*+6print:movah,02Hint21Hmovdl,almovah,02Hint21Hmovdl,blmovah,02Hint21Hmovdl,clmo

56、vah,02Hint21He*it:retMAINENDPENDstart5.4编写一个程序,要求比拟两个字符串STRING1和STRING2所含字符是否一样,假设一样则显示MATCH,假设不同在显示:NOMATCH。.modelsmall.dataSTRING1DBImuststudyhardSTRING2DBImuststudyhard*DBMATCH.$YDBNOMATCH.$.stack100H.codemainprocfarStart:pushd*mova*,0pusha*mova*,datamovds,a*moves,a*leasi,STRING1leadi,STRING2cldm

57、ovc*,(string2-string1)/typeSTRING2retEndstart5.5编写一个程序,要求能从键盘接收一个个位数N,然后响铃N次,响铃的ASCII为07。这题比拟有意思,呵呵。modelsmall.codemainprocfarstart:pushdssuba*,a*pusha*input:movah,01Hint21Hcmpal,20Hjee*itcmpal,30Hjleinputcmpal,3AHjgeinputsubal,30Hmovc*,a*andc*,0FFHlop:movdl,07Hmovah,2Hint21Hlooplopjmpinpute*it:retm

58、ainendpendstart5.6编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组和负数数组N,并分别把这两个数组中的数据个数显示出来。.modelsmall.386.dataMDB1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10PDB20dup()NDB20dup().codeMAINPROCFARstart:PUSHdsANDa*,0PUSHa*MOVa*,datamovds,a*MOVb*,0MOVsi,0MOVdi,0MOVc*,20Dcmpe:CMPMb*,0JLifLowhight:MOVal,byteptrMb

59、*MOVbyteptrPsi,alincsiJMPmonContrlifLow:MOVal,byteptrMb*MOVbyteptrNdi,alINCdimonContrl:INCb*loopcmpemova*,sicallshowNumbercallprintCRmova*,dicallshowNumbere*it:retMAINENDP;注意,ShowNumber这个子过程有问题,请自行修改;showNumberPROCNEARcovernum:DAAMOVd*,a*MOVcl,2Hshow:ROLdl,4Hpushd*ANDdl,0fHADDdl,30HMOVah,02Hint21Hpo

60、pd*loopshowretshowNumberENDP;printCRPROCNEARmovdl,0aHmovah,02Hint21Hmovdl,0dHmovah,02Hint21HretprintCRENDPendstart5.7编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在A*中。此题根据题意要求应该使用完整汇编格式,因为精简格式也使用DATA.dataaresegmentDATADW3322H,4555H,200H,3544H,1245HnumDB($-DATA)/2dataareendscodesegmentassumecs:code,ds:dat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论