给出一个汇编语言汇编程序指令语句,该语句在存储位置15
上初始化值-25
,F7H
,\CpE363
,字符串200H
“ ,201H
,202
和300H
(注意字符串,指定的地址是起始地址)。
我正在尝试解决它,但不确定
ORG 200H
START:
MOV A,#15
MOV A,#0E7H
MOV A,#0F7H
ORG 300H
Temp: DB “CpE363”
STOP:AJMP $
END
答案 0 :(得分:0)
常见CPU上的指令本身被编码为字节,因此请执行以下操作:
ORG 200H
MOV A,#15
可能会产生两个或三个字节(取决于您的汇编程序所针对的CPU),例如8051 CPU mov A,#immediate
被编码为两个字节74h, 0Fh
,并且由于{{1} }指令,字节ORG
位于地址200h,字节74h
位于地址201h,因此您的任务失败。
该任务已经包含提示,而不是指令,而是关于“汇编程序指令” 的说明,因此您定义0Fh
的字符串似乎也应该用于三个数值。
((您仍然可以将这三个字节定义为指令,如果您要检查哪些指令确实按这三个请求的字节进行汇编,那么您将不使用“汇编程序指令”,而是“ CPU指令”)< / p>
关于字符串的定义...如果您想要类似C的字符串,那么它也需要零终止符:DB
会那样工作,在其后再添加一个零字节。没有终止符的原始字符串只能由知道字符串长度的代码使用,而“终止”的字符串可以由代码搜索终止符值,因此您只能将它们的指针传递给子例程(但是弄清楚长度会浪费额外的运行时间) ,检查字节的终止符值。
将DB “CpE363”,0
放在后面可能没用,因为这样的源代码仅按请求定义字节,不包含任何有意执行的指令(您仍然可以执行定义的数据,CPU会对其进行解码如一些说明,并知道谁知道。同样,如果有人将您的代码按原样对待,并在“开始:”执行,则CPU将按预期执行三条STOP:AJMP $
指令,那么它将在地址206h..2FFh处击中一些内存内容(如果填充零,它们由CPU解码为指令MOV
,因此CPU会逐步执行它们),然后在地址300h处将其作为CPU指令执行字符串(我没有反汇编程序)对于手头的8051,因此我无法确定将从该字符串中解码出哪些指令),并且即使它完全到达该标签,它也可能以非常意外的状态到达该NOP
标签。
这是“冯·诺依曼体系结构”计算机的一个功能,数据字节和指令占用相同类型的内存(并且内存可用于两者),而CPU无法确定哪个是哪个,因此维护(由程序员决定)通过仅指令存储器内容的CPU正确流至关重要。一旦由于某种错误而丢失了它,CPU将执行它所达到的任何内存内容,并根据这些值执行相应的操作(在极少数情况下,如果连接了一些敏感设备,CPU可能会意外地通过执行一些I / O破坏外围设备命令,例如某些带有旧VGA卡的旧CRT显示器可能被迫将整个图像显示在屏幕护罩的单个点上,从而在短时间内有效地将点烧入了荧光粉层中-但我从未听说过代码在做什么这种无意的错误或错误,大多数人只是擦除了整个磁盘或被卡住的打印机等,并且有99%的意外执行数据是由于机器重置而造成的,没有任何其他伤害)。
这就是为什么结尾的普通代码中STOP:
会无限跳本身,从而防止CPU开始游荡到设计代码之外的内存中并执行一些随机的废话。但是在您的任务中,没有代码要执行,因此也没有必要在末尾添加无限循环。