汇编习题
整理本人写的汇编代码源码和解题思路。参考书目:沈美明. IBM PC汇编语言程序设计(第二版)[M].北京:清华大学出版社.2001
KarrySmile
欢迎向我提问。Ask me anything.
展开
-
汇编语言程序设计 - AX二进制中,每2位为一组,打印8组中有多少个‘11‘
思路:说人话就是判断十六位里面,分成8组,又多少组'11'1,总共是循环8次,因为要用CL来做循环移位,所以要么用CH计数,要么计数前后压栈出栈处理,要么用其他寄存器计数。这里用压栈出栈处理。2,将AX循环移位两位到末尾,用TEST指令判断是否为'11'3,是的话,将计数器+1,继续循环4,不是的话,继续循环5,打印次数原创 2024-06-19 11:46:50 · 158 阅读 · 0 评论 -
汇编语言程序设计 - 显示EXE文件的头信息
本程序旨在读取并显示一个DOS可执行文件(.EXE文件)的头信息。具体来说,该程序需要打开一个名为“xxx.exe”的文件,读取其头部信息并将其逐项打印出来,并在每个信息前面加上相应的标注,使输出的信息清晰易读。原创 2024-06-19 12:57:00 · 1339 阅读 · 0 评论 -
汇编语言程序设计 - 求数组平均值(AX),以及少于平均值的个数(BX)
思路:1,计数器初始化100H,指针指向数组头2,因为AX,DX要用来加法,所以AX的值暂存BX;DX的值暂存DI3,每次做加法之后,把结果加到DI,BX中,注意ADC DI,DX用的是ADC4,做“有符号除法”,商就是AX,就是平均值5,再次遍历数组,找到比AX小的数,用BX作计数器。原创 2024-06-19 12:50:45 · 122 阅读 · 0 评论 -
汇编语言程序设计 - 在A、B和C单元中分别存放着三个数。若三个数都不是0,则求出三数之和存放在D单元中。若其中有一个数为0,则把其它两单元也清0。
思路:1,逐个判断A,B,C是否为零,为零则跳到置0部分,结束程序2,不为零则进行加法,存到D空间里。原创 2024-06-19 12:11:28 · 213 阅读 · 0 评论 -
汇编语言程序设计 - 比较数组ARRAY中的三个16位补码数,都不相等显示0,两个相等显示1,三个相等显示2
思路:1,把数字都放到寄存器上方便比较2,比较第一和第二,第二和第三,第一和第三个数,总共比较三组,相等的话计数,不相等的话跳走3,计数结果只能是“三个都不相同”,“有两个相同,一个不同”,“三个都相同”,也就是数值只能是0,2,3(注意,有两个相同,一个不同的时候,计数器是2)3,计数器的内容和题目要求不一样,调整一下输出就好。如果三个不相等,就显示0,其他情况,显示计数器-1原创 2024-06-19 12:09:08 · 127 阅读 · 0 评论 -
汇编语言程序设计 - 统计字符串中非数字字符的数
这个程序写得并不好,因为我做了偷懒处理,默认它输出的数字字符数是少于10个。根据题目理解,最好的做法应该是:逐个输入,立刻判断,计数器+1,下一个输入遇到$结束。然后用十六进制输出计数器的内容。原创 2024-06-19 12:01:17 · 393 阅读 · 0 评论 -
汇编语言程序设计 - 十六进制输入,二进制输出
思路:主要难点在于处理16进制输入的字母部分,这里采用分段处理,最好画个图,理清大于小于的关系。1,输入总共循环4次2,从小判断到大,小于'0'的不要,'0'-'9'的去做数字处理,'9'-'A'之间的不要,'A'-'Z'的去做大写字母处理,'Z'-'a'之间的不要,'a'-'z'的手动减20H作为大写字母处理。3,现在只有数字和大写字母了,再判断一下,是数字还是字母,数字的话直接减30H,字母的话再减7;4,利用移位加法的方式,将这四位十六进制数存到BX5,利用一位一位的循环移位方式原创 2024-06-19 11:53:31 · 172 阅读 · 0 评论 -
汇编语言程序设计 - 求出首地址为DATA的100D字数组中的最小偶数,并把它存放在AX中
思路1,先用指针定位到数组头部,计数器设为1002,取数据,判断先判断是否为偶数,是就跳去处理,不是则继续循环2.1,处理偶数:拿到偶数后,先暂存在AX,指针后移查下一个偶数2.1.1,如果一直没找到下一个,那么最小的已经在AX,退出2.1.2,如果找到下一个偶数,比较,将小的放在AX,重复步骤“2”循环。3,注意2循环的判断条件,如果LOOPNZ MOV1结束,证明100次已经完成,这是如果跳到JNZ,证明最后一个也不是偶数,直接退出。如果100次已完成,跳过了JNZ,那么证明最后原创 2024-06-19 11:40:24 · 211 阅读 · 0 评论 -
汇编语言程序设计 - 键盘接收一个个位数N,然后响铃 N 次(响铃的ASCII码为07)
思路:1,从键盘接收一个数,要控制在'0'-'9'之间2,将次数存放在CX中3,用LOOP循环,INT中断来响铃(我电脑没有蜂鸣器,用输出'A'字母来代替响铃)原创 2024-06-19 11:32:34 · 195 阅读 · 0 评论 -
汇编语言程序设计 - 要求比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示‘MATCH’, 若不相同则显示‘NO MATCH’
思路:1,利用串操作指令完成2,数据段和附加段指向同一段,SI,DI赋对应的值3,设定执行方向,指向长度,开始REP指令4,全部比较完没问题就输出MATCH,一旦不相等就跳去输出not match原创 2024-06-19 11:29:23 · 118 阅读 · 0 评论 -
汇编语言程序设计 - 将AX寄存器中的16位数分成4组, 每组4位, 然后把这四组数分别放在AL、BL、CL和DL中
思路:1,移动变量到AX中2,利用循环移动的思维去操作3,总共4组,循环4次,每循环一次,用与操作取最后4位即可4,注意:CL要用来循环移位的时候的参数,所以要其他寄存器暂存原创 2024-06-19 11:24:53 · 204 阅读 · 0 评论 -
汇编语言程序设计 - 从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符
思路:1,用1号功能接收一个字符到VAR,确保在a-z之间2,先将DL减一,再输出三次DL,DL逐次递增原创 2024-06-18 15:24:24 · 240 阅读 · 0 评论 -
汇编语言程序设计 - 对键盘输入的小写字母用大写字母显示出来
思路:1,用A号功能一次性输入一个字符串2,长度存入LENS3,指针SI移动到字符串首部。字符串首部在BUFF+2的位置4,逐个读取字符串的内容,如是小写字母,则转换成大写字母再输出显示原创 2024-06-18 15:20:11 · 166 阅读 · 0 评论 -
汇编语言程序设计 - 新建一个文件:d:\abc.txt,从键盘输入文件的内容(不超过100个字符)
思路:1,定义好文件名,记得末尾+02,定义好缓冲区3,创建文件,成功的话,把AX的文件代号存到FH中,也要处理失败情况4,准备A号功能缓冲区,用A号功能一次性接收5,把缓冲区的内容写到文件里6,关闭文件原创 2024-06-18 15:06:12 · 227 阅读 · 0 评论 -
汇编语言程序设计 - 将当前目录下文件 FIE10.TXT 的所有小写字母改为大写字母,然后拷贝到当前目录文件 FILE20.TXT。
思路:1,分别打开两个文件,保存文件句柄2,读取FILE10文件的一个字节到BUF内存中。3,判断是否为小写。非小写字母直接写入到FILE20文件中,小写字母转换后写入到FILE20文件中4,全部扫描之后,关闭两个文件。5,在文件操作时,遇到错误会返回CF标志位为1,每次文件操作都应该带上JC ERR,进行对应的错误处理。本程序为了方便,所有都跳转到了ERR,实际上要分开错误类型处理。原创 2024-06-18 15:00:26 · 290 阅读 · 0 评论 -
汇编语言程序设计 - 输入16位的2进制数到BX中
思路:1,用CX计数16次,清空BX2,用1号功能逐位输入,遇到回车提前结束3,输入到AL,右移AL一位到CF,把CF的左移到BX最后一位,循环16次4,以二进制输出——利用循环移位来解决问题,左移BX最高位到CF标志位,将这位放到DX,转为ACILL码——中断打印,循环原创 2024-06-18 14:29:03 · 192 阅读 · 0 评论 -
汇编语言程序设计 - 输入5位以内八进制的数,存入BX中
思路:1,清空BX,CL要用来移位,用SI记录循环次数;遇到回车提前结束2,用1号功能输入,BX移位3位做好准备,保留AL最后3位,加到BL,循环次数减一,继续输入3,以八进制形式输出3.1,每三位bit合起来显示一个八进制数,16/3=5余1,所以先处理一位最高位,再循环5次处理3.2,用循环移位的方法,先输出第一位(最高位3.3,用循环移位的方法,每次移动3位到最右边,将BL复制到DL中操作,按位与最后3位,加上'0'对应的aciil码3.4,中断输出DL的内容,继续循环。原创 2024-06-18 14:25:08 · 189 阅读 · 0 评论 -
汇编语言程序设计 - 将BX中的有符号数以十进制的形式输出
思路:1,往bx写入一个数2,测试最高位是否为零,为零则跳转到正数执行,为一则输出负数2.1,负数处理:BX减一取反,然后按正数部分操作3,将BX内容放到AX中,与DX一起做除数运算。因为除数不能是立即数,借个寄存器SI来用,把除数10放到SI中。4,清空DX,因为每次除完余数都会在DX。余数进栈,计数器加一,看看商是否为0,为0则表示除到了最后一位,可以结束,否则循环。5,出栈到DX,方便打印(打印的是DL的内容),加上'0'对应的aciil码,打印输出,循环。原创 2024-06-18 13:47:54 · 388 阅读 · 0 评论 -
汇编语言程序设计 - 将BX中的无符号数以十进制的形式输出
思路:1,往bx写入一个数2,将BX内容放到AX中,与DX一起做除数运算3,清空DX,因为每次除完余数都会在DX。因为除数不能是立即数,借个寄存器SI来用,把除数10放到SI中4,余数进栈,计数器加一,看看商是否为0,为0则表示除到了最后一位,可以结束,否则循环5,出栈到DX,方便打印(打印的是DL的内容),加上'0'对应的aciil码,打印输出,按CX的次数循环原创 2024-06-18 13:46:16 · 349 阅读 · 0 评论 -
汇编语言程序设计 - 将BX中的无符号数以十六进制形式输出
思路:1,往bx写入一个数2,每4bit认作一个十六进制数处理,用循环移位的方法,16/4=4,总共四组3,每次移动4位到最右边,将BL复制到DL中操作,按位与最后4位4,分类讨论,因为数字和字母的ACILL码表不是连着的,如果大于9要讨论,小于等于9直接输出,大于9加上7,也就是从9到A的相对距离,再输出5,加上'0'对应的aciil码,中断输出DL内容,循环。原创 2024-06-18 13:45:10 · 79 阅读 · 0 评论 -
汇编语言程序设计 - 将BX中的无符号数以八进制形式输出
思路:1,往bx写入一个数2,每三位bit合起来显示一个八进制数,16/3=5余1,所以先处理一位最高位,再循环5次处理3,用循环移位的方法,先输出第一位(最高位4,用循环移位的方法,每次移动3位到最右边,将BL复制到DL中操作,按位与最后3位,加上'0'对应的aciil码5,中断输出DL的内容,继续循环。原创 2024-06-18 13:43:56 · 341 阅读 · 0 评论 -
汇编语言程序设计 - 输入两个字数据(16位的数)X,Y,计算Z=X+Y,并把Z的结果显示出来
思路:1,总共输入两个数2,每个数前面用B,D,H选择进制3,放入寄存器进行加法4,用十六进制显示Z的结果原创 2024-06-18 13:51:52 · 176 阅读 · 0 评论 -
汇编语言程序设计 - 输入一个字符串“Hello,World!”,存放在内存,然后倒序输出
思路:1,INT 21H 的0A号功能输入2,DX是缓冲区首部,DX+1是输入的字符数量,DX+2是字符串首部,将BUF位置移到DX3,获取输入缓冲区的字符总个数存到AX4,将SI指向串尾5,逆序输出原创 2024-06-18 13:37:39 · 113 阅读 · 0 评论 -
汇编语言程序设计 - 使用INT 21H 的2号功能,实现“Hello,World!”的显示。
思路:1,利用变址寄存器进行地址的偏移变化2,检测到回车停止输出原创 2024-06-18 13:28:04 · 75 阅读 · 0 评论 -
汇编语言程序设计 - 输入一个字符串“Hello,World!”,存放在内存,然后倒序输出
思路:1,利用CX来计数2,1号功能输入3,是回车就去打印,不是回车就进栈,CX计数加一4,弹出到DX,打印DL的内容原创 2024-06-18 13:31:04 · 105 阅读 · 0 评论 -
汇编语言程序设计 - 将BX中的无符号数以二进制形式输出+反转输出BX内容
思路:1,往bx写入一个数2,设定循环次数,十六次,BX中有16位,逐位处理3,利用循环移位来解决问题,左移BX最高位到CF标志位,将这位放到DX,转为ACILL码4,中断打印,继续循环原创 2024-06-18 13:39:50 · 99 阅读 · 0 评论