[精通Objective-C] 使用自定义下标模拟32位计算机寄存器操作
参考书籍:《精通Objective-C》【美】 Keith Lee
目录
程序功能简介
创建一个命令行程序用于模拟32位计算机的寄存器操作。它可以设置和获取寄存器的内容。该程序含有3个命令行输入参数:寄存器的初始化设置(32位的十六进制值)、选中的用于执行获取/设置操作的寄存器字节,以及(可选的)用于设置的寄存器字节值(十六进制)。
寄存器类
首先创建一个用于存放寄存器常量的头文件RegEditConstants.h
#ifndef RegEditConstants_h
#define RegEditConstants_h
#define kByteMultiplier 0xFF // 用于辅助执行寄存器的位操作
#define kRegisterSize (sizeof(uint32)) // 寄存器的宽度(以位为单位)
#endif
接下来是模拟寄存器操作的RegEdit类:
#import <Foundation/Foundation.h>
@interface RegEdit : NSObject
@property(readonly) uint32 regSetting;
-(id) initWithValue:(uint32)value;
// 实现数组型自定义下标必须实现的两个方法
-(id) objectAtIndexedSubscript:(NSInteger)index;
-(void) setObject:(id)newValue atIndexedSubscript:(NSUInteger)index;
@end
#import "RegEdit.h"
#import "RegEditConstants.h"
@interface RegEdit()
@property(readwrite) uint32 regSetting;
@end
@implementation RegEdit
// 寄存器的初始化设置
-(id) initWithValue:(uint32)value{
if ((self = [super init])) {
_regSetting = value;
}
return self;
}
// 读寄存器操作,操作单位为1个字节(8位)
-(id) objectAtIndexedSubscript:(NSInteger)index{
NSUInteger byteNumber = index * 8;
if ((1 << byteNumber) > self.regSetting) {
[NSException raise:NSRangeException format:@"Byte selected(%ld) exceeds number value", index];
}
unsigned int byteValue = (self.regSetting & (kByteMultiplier << byteNumber)) >> byteNumber;
return [NSNumber numberWithUnsignedInt:byteValue];
}
// 写寄存器操作,操作单位为1个字节(8位)
-(void) setObject:(id)newValue atIndexedSubscript:(NSUInteger)index{
if (newValue == nil) {