汇编编程

汇编编程

一个源程序从写入到执行的过程

共分为三部:

  1. 编写源程序
  2. 编译连接,编译后生成的可执行文件分为两部分:
    • 程序和数据
    • 相关的描述信息(提供给操作系统的)
  3. 执行
    在操作系统中,执行可执行文件时。操作系统将按照可执行文件中的描述信息,将可执行文件中的机器码和数据加载进入内存,并进行相应的初始化。

源程序

assume cs:codesg
codesg segment
    mov ax,0123H
    mov bx,0456H
    add ax,bx
    add ax,ax
codesg ends
end

该段源程序分为三部分

  1. 伪指令
  2. 程序(汇编指令)
  3. 标号

伪指令没有对应的机器码(不是汇编指令)。被编译器来执行。
比如segmentends就是一对成对使用的伪指令,这是编写被编译器编译的汇编程序必须要使用的一对伪指令。segment和ends的功能就是声明一个段。segment说明一个段的开始,而ends则说明一个段的结束。一个段必须有一个名称来标识(标号)
一个汇编程序就是有多个段来组成的,分别用来存放数据和代码。一个源程序将计算机所要处理的信息按类别划分待不同的段中。
end指令指示整个程序的结束。编译器如果碰到了伪指令end,就会结束对源程序的编译。
assume假设某一段寄存器与程序中的某一个段相关联。在需要时编译程序可以将段寄存器和某一个具体的段相关联。
汇编源程序中的标号代表了一个地址,比如codesg作为一个段的名称。在他最终被编译以后,连接程序将其处理为一个段的段地址。
UTOOLS1560169840527.png
好像可以这样认为,一个汇编程序就是有程序段和数据段组成。

程序的返回

以DOS(单任务操作系统)为基础讨论。
程序P1将可执行文件P2装入内存,并将cpu控制权交给P2。P2开始运行,P1暂停。
P2运行结束,将cpu控制权交还给使他运行的程序P1,之后P1继续运行。
其中,这个交还cpu控制权的过程,称为程序返回。
其中,

mov ax,4c00H
int 21H

实现程序返回的功能。
UTOOLS1560169885399.png

语法错误和逻辑错误

语法错误就是一般可以在编译期间发现的错误
而逻辑错误通常要在程序运行中才能够发现。
其中,逻辑错误要比语法错误能以解决。

谁将可执行文件中的程序装在如内存并使他运行

对于DOS环境,也就是是command.exe(系统shell)。
任何通用操作系统都会提供一个shell(壳)程序,这是用户和系统进行交互的接口(方式之一)。

debug为什么能实现程序执行的跟踪

这是因为和shell执行可执行文件不同,debug并不会完全放弃对cpu的控制。
UTOOLS1560169960996.png
debug将可执行文件装入内存以后,cx中存放程序的长度(汇编指令的长度)
UTOOLS1560169982794.png
PSP占256个字节,观察图4.19可以发现ds和cs相差10H。这也可以从侧面证明这一点。
PSP是DOS用来和程序进行通信的,之后才存放的是真正的程序。





posted @ 2019-06-10 20:27 秦晓 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、问题描述 课题1:排序。要求从键盘上输入若干个人名,当输入完毕后,能显示正确的顺序。 课题2:编一个类似于TT的英文打字测试程序。要求输入的字符能在屏幕上显示并报告所用时间。 二、设计思想 课题1:排序。程序分3个部分 (1) 等待用户输入数个人名,即输入字符串。本程序设定输入人名数为5到15个,运用了2个函数(input1,input2)实现。 定义 data1 db 21,0,22 dup('$') ;用于存放第一个字符串 data2 db 21,0,22 dup('$') ;用于存放第二个字符串 data3 db 21,0,22 dup('$') ;用于存放第三个字符串 data4 db 21,0,22 dup('$') ;用于存放第四个字符串 data5 db 21,0,22 dup('$') ;用于存放第五个字符串 data6 db 21,0,22 dup('$') ;用于存放第六个字符串 data7 db 21,0,22 dup('$') ;用于存放第七个字符串 data8 db 21,0,22 dup('$') ;用于存放第八个字符串 data9 db 21,0,22 dup('$') ;用于存放第九个字符串 dataa db 21,0,22 dup('$') ;用于存放第十个字符串 datab db 21,0,22 dup('$') ;用于存放第十一个字符串 datac db 21,0,22 dup('$') ;用于存放第十二个字符串 datad db 21,0,22 dup('$') ;用于存放第十三个字符串 datae db 21,0,22 dup('$') ;用于存放第十四个字符串 dataf db 21,0,22 dup('$') ;用于存放第十五个字符串 input1实现前五个字符串的输入,调用0A号功能实现输入,当用户没有输入字符而直接回车时,程序会判断为输入错误,直到输入字符为止,此时按下回车,会转到下个字符串的输入。 input2实现后10个字符串的输入,调用0a号功能实现输入,当用户没有输入字符而直接回车时,程序会判断用户选择结束输入,跳转出input2函数。实现了用户连续按两下回车(注意:第一个回车为前一个字符串的结束回车,此后再按一次回车就表示退出),直接退出输入的功能。 (2)人名排序,即字符串排序。 采用冒泡排序的方法,进行双重循环,内循环实现字符串的比较交换,若前一 个字符串大则跳转去交换,小或者相等则跳转去比较下两个字符串。 外循环是在内部循环结束后继续从第一个字符串开始跳转到内部循环,保证顺序排好。 另外字符串本身的比较也是一重循环,以字符串结尾符号'$'控制比较次数。 交换部分则是两个存储单元的完全交换(从第一个字符到最后一个字符)。 (3)输出排序好的人名 最后将排序好的字符串依次输出在屏幕上。 三、课程设计体会 在此次课程设计中,我与吕鑫等人一组,我们综合利用了80X86汇编语言程序设计这门课中所学的所有知识,实践操作了多种指令的功能,丰富了用汇编语言编程的经验。也从中体会到了用汇编编程的难处。 在以小组为单位的课程设计制作过程中,我与其他组员相互讨论、配合,最后共同完成了2个课题要求的程序编,极大提升了我团队共同合作的编程经验,受益匪浅。也提高了我分析问题、解决问题的能力。 课题2:TT英文打字测试程序要求程序有3功能 (1)在屏幕上输出一条字符串; 在程序中定义几段字符串 STR1 DB 'ABCD EFGH IJKL MNOP QRST UVWX YZ.' STR2 DB 'THERE ARE SOME NEWSPAPERS ON THE TABLE.' STR3 DB 'THERE ARE SOME CLOUDS IN THE SKY.' STR4 DB 'SHE ALWAYS EATS HER LUNCH AT NOON.' STR5 DB 'I DO NOT LIKE AUTUMN AND WINTER.' 运行时,在屏幕上依次输出这几段字符串,每输出一段字符串,便开始等待用户从键盘输入字符。 (2)从键盘上读入字符,并显示在屏幕上,以回车键结束输入; 首先用 INT 21H 从键盘读入一个字符,将读入的字符放入AL中,判断该字符是否是回车,若不是回车则马上用INT 10H 在当前光标位置上显示AL中的字符,若是回车则结束从键盘上读入字符。 (3)对从键盘上读入字符的过程计时,并在输入结束后,将输入用时显示在屏幕上。 定义 SEC DW 0 ;sec表示秒钟 MIN DW 0 ;min表示分钟 HOURS DW 0 ;hours表示小时 将它们初始化为0。 输入字符结束后,依次将hours、min、mours赋值给ax,并输出在屏幕上,以分号隔开。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值