1.5 习题
1.使用你最喜欢的编程语言开发一个十进制加法器模拟器,该加法器的操作方式与巴贝奇分析机中的操作方式相同。首先,提示用户输入0~9内的两个数:加数和被加数。显示加数、被加数和进位,进位的初始值为零。执行如下循环:
a.如果加数为零,则显示加数、被加数以及进位和结果的值,否则进入步骤b。
b.加数减1,被加数加1。
c.如果被加数从9递增到0,则进位加1。
d.返回步骤a。
用如下用例对代码进行测试:0+0、0+1、1+0、1+2、5+5、9+1和9+9。
2.为加数、被加数和进位各自创建40位的十进制数的数组。提示用户输入两个十进制整数,每个最多40位。使用习题1中描述的循环逐位执行加法,并从进位数组中的每个数字位置收集进位输出。循环完成后,让被加数与进位相加,在必要时形成新的进位并处理从而完成加法运算。在每个循环之后与运算结束时显示结果。使用习题1中的测例,并额外测试99+1、999999+1、49+50和50+50。
3.修改习题2的程序,实现40位十进制数的减法。根据需要进行借位。使用0-0、1-0、1000000-1和0-1进行测试。0-1的结果是什么?
4.6502汇编语言使用包含地址(没有指示立即值的#字符)的操作数访问内存中的数据。例如,LDA $00指令将内存地址$00处的字节加载到寄存器A中。STA $01将寄存器A中的字节存储到地址$01中。地址可以是0~$FFFF范围内的任何数值,前提是内存中有该地址,并且该地址尚未用于其他目的。使用读者首选的6502模拟器,编写6502汇编代码实现将16位数据存储到地址$00~$01,将另一个数据存储到地址$02~$03,然后将这两个值相加并将结果存储在$04~$05中。确保妥善处理两个字节之间的任何进位,并忽略16位结果中的任何进位。用$0000+$0001、$00FF+$0001和$1234+$5678进行测试。
5.编写6502汇编代码,以类似于习题4的方式对两个16位数据执行相减。用$0001-$0000、$0001-$0001、$0100-$00FF和$0000-$0001进行测试。$0000-$0001的结果是什么?
6.编写6502汇编代码,将两个32位整数分别存储到地址$00~$03和$04~$07,然后将它们相加,并将结果存储在$08~$0B中。使用循环结构(包括一个标签和一条分支指令)对要相加的两个数据的字节进行迭代。在网上搜索6502递减和分支指令的详细信息,以及汇编语言中标签的用法。提示:6502中的零页索引寻址模式(zero-page indexed addressing mode)将适用于该应用程序。