汇编学习--第三天
4.1 一个源程序从写出到执行的过程
汇编语言源程序包含两种指令:
- 1.汇编指令
- 2.伪指令
汇编指令会被编译为机器指令,被CPU执行
伪指令不会,会被编译器执行
assume cs:codesg codesg segment mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h int 21h codesg ends end
segment和ends的作用是定义一个段
codesg segment ;定义一个名叫codesg段的开始
codesg ends ;“codesg”段结束
end伪指令标记整个程序的结束
assume将有特定用途的段和相关的段寄存器关联起来
程序最先以汇编指令的形式存在源程序中,经编译,连接后转变为机器码,储存在可执行文件中。
“codesg”为标号,最终将被编译,连接为一个段的地址
mov ax,4100h int 21h
所实现的功能就是程序返回
问题4.1
DOS中直接直接执行test.exe,是正在运行的command,将test.exe中的程序加载进内存
command设置CPU的CS:IP指向程序的第一条指令,从而使程序运行
程序运行结束之后,返回到command,CPU继续执行command
command程序在DOS中称为命令解释器
debug中调试程序时,cx中存储的是程序长度
PSP是程序段前缀
ds的地址即PSP的地址,DS=129E,则PSP=129E:0,所以程序的地址为129E+10:0=12AE:0=CS:IP
实验3 编程,编译连接,跟踪
(1)(2)
(3)
第五章 [BX]和loop指令
完整描述一个内存单元:1.内存单元的地址 2.内存单元的长度
用“()”表示一个寄存器或者一个内存单元中的内容
“()”可以有:1.寄存器名 2.段寄存器名 3.内存单元的物理地址
idata表示常量
mov ax,[idata] = mov ax,[1] mov ax,[4]... ;合法 mov ax,idata = mov ax,1 mov ax,2... ;合法 mov ds,idata = mov ds,1... ;非法
问题 5.1
21000H | BE |
21001H | 00 |
21002H | BE |
21003H | 00 |
21004H | BE |
21005H | BE |
21006H | BE |
21007H |
inc 表示寄存器中的内容加1
5.2 Loop指令
计算2^2
assume cs:code code segment mov ax,2 add ax,ax mov ax,4c00h int 21h code ends end
计算2^10=0400h=1024
assume cs:code code segment mov ax,2 mov cx,9 s: add ax,ax loop s mov ax,4c00h int 21h code ends end
s为标号,标号代表一个地址
执行loop s进行:
- 1.(cx) = (cx) - 1;
- 2.判断cx中值是否为0,不为0跳转标号处执行,为0接着执行下一句指令
问题 5.2
assume cs:code code segment mov ax,0 mov cx,236 s: add ax,123 loop s mov ax,4c00h int 21h code ends end
问题 5.3
assume cs:code code segment mov ax,0 mov cx,123 s: add ax,236 loop s mov ax,4c00h int 21h code ends end