最基本的8086汇编语言程序

来源:互联网 发布:斐波那契数列java递归 编辑:程序博客网 时间:2024/06/09 19:14

实验名称:汇编语言程序设计

实验日期:2017-05-13

实验环境:DOSBox 0.74

实验环境的安装:

1、为什么64位系统无法运行debug.exe

win10win8win7 64位系统均不支持16位。

2、为什么上述64位系统不支持16位,而32位的win7可以

64windows没有ntvdmntvdm.exe描述(以下摘自百度百科):

比如,在32位系统环境下,你运行DOS程序(.com)或其他16位程序后,就会出现这个进程,不是病毒,但32位控制台程序(比如cmd.exe),它运行时并不会出现。64位操作系统则不包括此程序。

ntvdm.exeWindows 16位虚拟机的一部分。该进程用于使16位的进程能够运行在32位的系统环境下。这个程序对你系统的正常运行是非常重要的。

众所皆知,微软新的桌面操作系统是向下兼容为旧系统开发的应用程序的(比如你可以在xp下玩仙剑奇侠传98柔情版),其中包括运行于DOS内核操作系统以及16windowsPE格式可执行文件,以及为DOS开发的只包含16位指令、运行于处理器实模式的可执行程序/命令(排除那些试图直接操作硬件的,因为这逾越了NT内核操作系统给应用程序的权限,或者说它们试图运行于处理器的0环,与操作系统内核运行于同一级别,为了内核的安全性,这显然是不能被允许的)。

微软采用了WOWWindows On Windows)技术使得在xpNT内核操作系统上可以运行那些为旧版操作系统开发的应用程序,这样我们便可以正常的运行 Windows 98 的甚至是Windows 3.2的计算器程序等。让我们在Windows XP下打开Windows 3.2的应用程序,如记事本,你就会发现 NTVDM 这个程序幽灵般的出现了,还带上了一个子进程 WOWEXEC.exe,这就是 WOW 的一个体现了。

而针对那些为 DOS也就是 CPU运行于实模式的情况下开发的16位程序,微软则使用了DOS虚拟机(VM)的方法。NTVDM虚拟了一台运行DOS的计算机,使得16位程序能够在其中正常运行。

3、解决办法,安装DOSBox模拟器

官网下载:www.dosbox.com

安装方法网上一搜一大把。。。

配置时的一点小技巧:运行安装目录下的DOSBox 0.74 Options.bat可以打开配置文件,我对配置文件做出了如下更改

       [sdl]

       windowresolution=1024x768

       output=opengl

       [autoexec]

       #Lines in this section will be run at startup.

       #You can put your MOUNT lines here.

       mountc: c

       setPATH=%PATH%;C:\vim\vim73;C:\MASM

       C:

sdl段的两行是用于放大屏幕的,dos原始分辨率太下,大屏幕上看不舒服。alt+enter可以全屏

autoexec是模拟器打开之后自动执行的指令

我在这里挂载了安装目录下一个名为"c"的文件夹

并设置了环境变量,我采用的是vim编辑器,masm下放的是debug.exe,link.exe, masm.exe

 

实验任务:

编写下列程序并调试通过。

1. 通过键盘输入一个小写字母,找出对应的前导字母和后续字母,再按顺序显示这三个字母。

CODESEGMENTASSUMECS:CODEBEGIN:MOVAH,07HINT21HMOVDL,ALMOVAH,02HSUBDL,01HINT 21HADDDL,01HINT21HADDDL,01HINT21HMOVAH, 4CHINT21HCODEENDSENDBEGIN


2. 从键盘输入10个字符,然后以与键入相反的顺序将10个字符输出到显示屏幕上。(定义数据段保存录入字符)

DATASEGMENTARRAYDB 10 DUP(?), 0DH, 0AH, '$'DATAENDSCODE SEGMENTASSUMECS:CODE, DS:DATABEGIN:MOVAX, DATAMOVDS, AXMOVAH, 07HMOVCX, 0AHOPR:INT21HMOVBX,CX;SUBBX,01HMOV[BX],ALLOOPOPRMOVAH, 09HLEADX, ARRAYINT21HMOVAH, 4CHINT21HCODEENDSENDBEGIN

3. 编写一个程序,要求比较数组ARRAY中的三个16位补码,并根据比较结果在终端上显示如下信息:

   1如果三个数都不相等,显示0

   2如果三个输油两个相等,显示1

   3如果三个数都相当,显示2

DATASEGMENTARRAYDW 1224H, 1214H, 1234HDATAENDSCODESEGMENTASSUMECS:CODE, DS:DATABEGIN:MOVAX, DATAMOVDS, AXLEABX, ARRAYMOVAX, [BX]MOVDX, 0002H[BX]CMPAX, DXMOVDX, 0004H[BX]JNESTEP1CMPAX, DXJNETAG1MOVDL, '2'MOVAH, 02HINT21HJMPOVERSTEP1:MOVAX, 0002H[BX]CMPAX, DXJETAG1MOV DL, '0'MOVAH,02HINT21HJMPOVERTAG1:MOVDL, '1'MOVAH, 02HINT21H OVER:MOVAH, 4CHINT21HCODEENDSEND BEGIN

4. 编写一个程序,要求通过键盘接收一个个位数N,然后显示N个字母‘$’

CODESEGMENTASSUMECS:CODEBEGIN:MOVAH, 07HINT21HMOVCL, ALSUBCL, 30HMOVCH, 00HOUT1:MOVDL, '$'MOVAH, 02HINT21HLOOPOUT1MOVAH, 4CHINT21HCODEENDSENDBEGIN

5. BX寄存器中的数用16位二进制数形式显示出来。

CODE    SEGMENTASSUME    CS:CODEBEGIN:    MOV        AH, 01H        INT        21H        MOV        BH, AL        INT        21H        MOV        BL, AL        MOV        AH, 02H        MOV        DL, 0DH        INT        21H        MOV        DL, 0AH        INT        21H        MOV        CX, 16        MOV        DH, 80HLOOP16:            TEST    BH, DH        JZ        ZERO        MOV        DL, '1'        INT        21H        SHL        BX,1        LOOP    LOOP16        JMP        OVERZERO:    MOV        DL, '0'        INT        21H        SHL        BX,1        LOOP    LOOP16OVER:        MOV        AH,4CH        INT        21HCODE    ENDS        END        BEGIN

6. 15*16列的表格形式显示ASCII码为10H-FFH的所有字符。

CODESEGMENTASSUMECS:CODEBEGIN: MOVAH,02HMOVCX,16MOVDL,10HMOVBH,15LOOP1:INT21HMOVBL,DLMOVDL,20HINT21HADDBL,1MOVDL,BLLOOPLOOP1MOVCX,16MOVDL,0DHINT21HMOVDL,0AHINT21HMOVDL,BLDECBHJNZLOOP1MOVAL,0MOVAH,4CHINT21HCODEENDSENDBEGIN

0 0
原创粉丝点击