当前位置:首页 > 内存 > 正文

汇编把指令写入内存的过程

  • 内存
  • 2024-06-11 09:10:50
  • 5453

一、汇编写入内存,谁懂的教教我假设cs:cods,ds:data
datasegment
db'welcometomasm!'
dataends
codssegment
start:movax,data
movds,斧头;写入命令ds
movax,0b800h
moves,ax的数据段;写入命令显示段es
;写入第一行字符显示内存,并以命令的形式显示
movsi,0;数据段偏移变量
movdi,0;显示变量段偏移
movah,02h;保存颜色属性
movcx,16;循环16次
s:movel,[si];将数据段中的数据读入al
moves:[640h+di],al;然后将al数据写入显存
incsi
incdi;移动次数增加1
移动:[640h+di],啊;将字体颜色属性写入内存
incdi
loops
codsends
endstart
//本例是写入字符“欢迎! »将数据存储段写入显存中,然后显示在屏幕上。这只能在DOS下显示。或者可以在Windows上的cmd中的调试中显示。


二、简述CPU执行一条指令的过程

几乎所有冯·诺依曼计算机CPU的工作都可以分为五个阶段:取指令、译码指令、执行指令、访问数据和写回结果。

1.取指令阶段

在取指令阶段(IF),一条指令从主存储器取入指令寄存器。

程序计数器PC中的值用于指示当前指令在主存中的位置。当取命令时,PC中的值会根据命令字长自动递增:如果是单字长命令,则(PC)+1àPC,如果是双字长命令。然后(PC)+2àPC等等。

2.指令解码阶段

计算机取指令后,立即进入指令解码(ID)阶段。

在指令解码阶段,指令解码器根据给定的指令格式对检索到的指令进行划分和解释,识别和区分不同的指令类别和不同的获取方式。

在组合逻辑控制的计算机中,指令译码器为不同的指令操作码产生不同的控制电位,形成不同的微操作序列。在微程序控制的计算机中,指令译码器使用指令操作码来查找执行该指令的微程序的入口,并从该入口开始执行。

3.指令执行阶段

在指令获取和指令译码阶段之后,进入指令执行阶段(Execute,EX)。

该阶段的任务是完成指令指定的各种操作,具体实现指令的功能。为此,CPU的不同部分被连接起来以执行所需的操作。

4.存取访问阶段

根据指令要,可能需要访问主存并读取操作数,从而进入存取访问阶段(存储器,MEM)。

该阶段的任务是根据指令地址码获取操作数在主存中的地址,并从主存中读取操作数进行操作。

5.结果回写阶段

作为最后一个阶段,结果回写阶段(WriteBack,WB)将执行指令阶段的运行结果数据“写回”到存储形式中:

结果数据通常会被写入CPU的内部寄存器中,以便后续指令可以快速访问它们。

在某些情况下,结果数据也可以相对缓慢地写入,但更便宜并具有更大的主存储器。许多指令还会更改程序状态字寄存器中标志位的状态。这些标志位标识各种操作的结果,并可用于影响程序的操作。

指令执行完毕,结果数据写回后,并且没有发生意外事件(如结果溢出等),计算机从程序中接收下一条指令地址PC并开始新的循环。下一个指令周期将一条一条地取出下一条指令。

高级信息:

命令执行过程示例:

启动时,程序计算器PC切换到0000H。然后单片机在时序电路的作用下自动进入执行程序过程。执行过程实际上是一个取指令(取出之前存储在内存中的指令)和指令执行(解析并执行指令)的循环过程。

执行指令:MOVA,#0E0H时,机器码为“74HE0H”。该指令的作用是将操作数E0H送入累加器。

74H存储在0000H单元中,E0H存储在0001H单元中。单片机开始运行时,首先进入取指令阶段,顺序为:

1将程序计数器的内容(此时为0000H)发送到地址寄存器。

2.程序计数器的内容自动加1(变成0001H);
3地址寄存器的内容(0000H)通过内部地址总线送到存储器,然后由地址译码电路处理
4、CPU使读控制线有效;
5.所选存储单元的内容在读命令(此时应为74H)的控制下通过数据总线发送到内部数据总线命令寄存器。至此,取指令阶段完成,译码、分析和指令执行阶段开始。

因为这次输入命令寄存器的内容是74H(操作码),用解码器解码后,单片机知道该命令是向A电池发送一个数字,该数字为这段代码中的下一个内存位置。

要执行该命令,必须从内存中取出数据(E0H)并将其发送到CPU,即H。第二个字节必须从内存中检索。该过程与命令获取阶段非常相似,只不过此时PC已经是0001H。指令译码器结合时序组件产生74H操作码的微操作系列,从而从0001H单元中取出数字E0H。

由于该命令要求将取数发送到A累加器,因此取数通过内部数据总线送到A累加器,而不是发送到命令寄存器。至此,一条指令执行完毕。单片机中的PC=“0002H”,CPU每从内存中取一条指令或数字,PC就自动加1,单片机进入下一个取指令阶段。

此过程会重复,直到收到暂停命令或循环等待暂停命令。这样CPU就依次执行指令并遵守所有规定。

参考:CPU


三、汇编语言从键盘输一字符串,存入BUFIN为首地址的内存区(长20H)中,从此内存中调用,在屏幕显示该字符串dosseg
.modelsmall
.stack
.data
msgdb13,'Doyouwanttoinputstring?(Y/N)'
bkspdb8,32,8,36
crlfdb13,10,36
msg1db13,10,'Thestringyouhaveenter:$'
bufindb20hdup(?)
msg2db13,10,'Stringlengthinbyte(s):$'
。code
.startup
@@:movdx,offsetmsg;'Doyouwanttoinputstring?'
callputs
callgetchar
andal,not20h;to_uppercase
cmpal,'N'
jequit
cmpal,'Y'
je@f
movdx,offsetbksp;eraseinvalidkeyechoonscreen
调用路径
jmp@b
@@:movdx,offsetcrlf;enterstringatanewline
callputs
pushds
popes
movdi,offsetbufin
xorcx,cx
cld
getk:callgetchar
cmpal,13;ENTER?
jedone
cmpal,8;BKSP?
jnz@f
jcxzgetk;ignoreBKSPisbufferisempty
deccx
decdi
movdx,offsetbksp+1;删除前一个字符,我们不需要1stbkspc因为我们有来自keyecho
调用
jmpgetk
@@:cmpcx,lengthbufin-1;ithasreachedbuffertail?
jae@f
stosb
inccx
jmpgetk
@@:movdx,offsetbksp;removethekeyecho
调用
jmpgetk
准备好:moval,'$';
stosb
movdx,offsetmsg1;'Thestringyouhaveentered'
调用
movdx,offsetbufin;thestringjustentered
调用
movdx,offsetmsg2;'Stringlengthinbyte(s)'
调用
movax,cx;CX=字符串长度
callprintax
quit:movah,4ch
int21h
;以十进制格式打印无符号整数
printaxproc
movbx,10;以十进制格式输出
orax,ax,直接输出
jnz;@f
movdl,'0'
callputc
ret
@@:xordx,dx
divbx
movcx,ax
orcx,dx;如果商和余都为0,则结束递归
jz@f
pushdx;将余数存储在DX中,以便递归后输出
call@b;Recurse
;popdx;从最高位开始恢复余数
addl,'0'
callputc
@@:ret
printaxendp
putsproc
movah,9
int21h
ret
putsendp
putcproc
movah,2
int21h
ret
putcendp
getcharproc
movah,1
int21h
ret
getcharendp
end