第一步:下载 DOSbox 0.74,然后点击安装
第二步:

第二步:下载 masm
第三步:输入 mount c: d:\masm(下载的文件放在 d:\masm)

第四步:进入文件,输入 c:

第五步:编译 add.asm


第六步:链接 link add.obj

看到 add.exe 说明编译完成

不能使用 debug 命令的解决办法:
下载 32 位 debug.exe 程序,复制到 masm 目录下。

0
Posted in 汇编语言

这是我学习汇编语言循环与分支结构的过程中总结的一些代码。

其中有参考我们老师的课件和清华大学出版社的《IBM—PC 汇编语言程序设计》。

仅供学习参考!禁止转载!

【例1】编程将内存数据段字节单元INDAT存放的一个数n(假设0≤ n ≤9 ),以十进制形式在屏幕上显示出来。

例如,若INSTR单元存放的是数8,则在屏幕上显示:8D。

思路:首先需要数据段里定义一个DB类型的10进制数,然后初始化寄存器,取操作数,将他转化为ASCII码,再利用2号DOS功能,显示字符‘D’。

代码:

DATA  SEGMENT           ;数据段定义
    INDAT  DB 8
DATA  ENDS
CODE  SEGMENT       ;代码段定义
   ASSUME CS:CODE,DS:DATA
START:  MOV  AX,DATA
        MOV  DS,AX  ;初始化DS
    MOV  DL,INDAT   
        OR  DL,30H
        MOV  AH,2
        INT  21H
        MOV  DL,'D'
        MOV  AH,2
        INT  21H
    MOV  AH,4CH   ;返回DOS窗口
        INT  21H                              
CODE  ENDS
      END  START

【例2】编写程序段,求AX中存放的带符号数的绝对值,结果存RES单元。
代码:

data segment
 res dw ?
data ends
code segment
 assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
    mov ax,9a00H
    cmp ax,0
    jge isp
    neg ax
isp:    mov res,ax

    mov ah,4ch
    int 21h
code ends
  end start

【例3】编程判断DAT单元存放的带符号数的正负。
如该数为负数,则显示“DAT is a negative number!”;否则显示“DAT is a nonnegative number!”。
代码:

DATA  SEGMENT               ;数据段定义
  N  DB  'DAT is a negative number!','$'
  NN  DB 'DAT is a nonnegative number! $'
DATA  ENDS
CODE  SEGMENT               ;代码段定义
   ASSUME CS:CODE,DS:DATA
START: 
        MOV  AX,DATA
        MOV  DS,AX          ;设置DS
        MOV  AX,-3
        CMP  AX,0
        JGE  ISNN
        LEA  DX,N
        MOV  AH,9
        INT  21H
        JMP  FINISH
ISNN:       LEA  DX,NN
        MOV  AH,9
        INT  21H
FINISH:
        MOV  AH,4CH
        INT  21H
CODE   ENDS
        END  START

【例4】  编程求分段函数Y的值。已知变量X为16位带符号数,分段函数的值要求保存到字单元Y中。
函数定义如下:当x=0时,Y=0,当x大于0时,Y=1,当x小于0的时候,Y=-1。
代码:

DATA  SEGMENT   ;数据段定义
   X  DW  -128
   Y  DW  ?
DATA  ENDS
CODE  SEGMENT  ;代码段定义
   ASSUME CS:CODE,DS:DATA
START:  MOV  AX,DATA
        MOV  DS,AX 
    MOV  AX,X
        CMP  AX,0
        JG  ISPN
    JZ  ISZN
        MOV  Y,-1
        JMP  FINISH
ISPN:   MOV  Y,1
        JMP  FINISH
ISZN:   MOV  Y,0    
FINISH: MOV  AH,4CH
    INT  21H
CODE    ENDS
        END  START

【例5】  编程显示以“!”结尾的字符串。
如:“Welcome to MASM!”。
代码:

DATA  SEGMENT            
   MYSTR  DB  'Welcome to MASM!'
DATA  ENDS
CODE  SEGMENT                 
   ASSUME CS:CODE,DS:DATA
START: 
    MOV  AX,DATA        
    MOV  DS,AX
        LEA  SI,MYSTR
next:
    mov dl,[si]
    cmp dl,'!'
    jz finish
    mov ah,2
    int 21h
    inc si
    jmp next
finish:
    mov dl,'!'
    mov ah,2
    int 21h
    mov ah,4ch
    int 21h
code ends
     end start

【例6】  将内存数据段INSTR地址开始存放的一个由字母组成的字符串中的小写字母全部转换成大写字母(其余字符不变)后存至内存数据段OUTSTR地址处。
如原字符串是“welcome to MASM!”,那么转换完后应该是“WELCOME TO ASM!”。
代码:

DATA   SEGMENT               
    INSTR    DB  'welcome to MASM!'
    STRLEN   EQU  $-INSTR      
    OUTSTR   DB   STRLEN DUP(?),13,10,’$’
DATA    ENDS
CODE    SEGMENT                 
        ASSUME CS:CODE,DS:DATA
START: 
    MOV  AX,DATA
    MOV  DS,AX
    LEA  SI,INSTR
    LEA  DI,OUTSTR
    MOV  CX,STRLEN
NEXTCHAR:
    MOV  AL,[SI]
    CMP  AL,'a' 
    JB  UNCHG   ;不是小写字母,则不转换
    CMP  AL,'z'
    JA  UNCHG   ;不是小写字母,则不转换
    SUB  AL,20H ;将小写字母转换为大写字母
UNCHG:  
    MOV [DI],AL
    INC  SI
    INC  DI
LOOP  NEXTCHAR
    MOV  AH,4CH
    INT  21H
CODE    ENDS
    END     START
1+
Posted in 汇编语言

本例分两步实现。
(1)转换并保存结果
这一步将二进制数转换为十进制值,即求出十进制值各位上的数字。由于16位二进制数最大能表示的数是65535,所以,转换后,最多是一个万位的十进制数。转换的步骤就是:把要转换的数依次除以10000,1000,100和10,分别可以得到万位数字、千位数字、百位数字和十位数字。除以10得到的余数就是个位数字。程序中,将得到的这些数字先存入内存指定单元,供显示模块使用。
(2)显示
本例程序把转换和显示分成两个模块来实现,使得程序的结构清晰。

代码:

DATA   SEGMENT               
    DECNUM   DB   5 DUP(?)  
DATA    ENDS
CODE    SEGMENT                 
   ASSUME CS:CODE,DS:DATA
START: 
    MOV  AX,DATA
    MOV  DS,AX 
    MOV  BX,65530 ;要转换的值
    LEA  SI,DECNUM
        MOV  DX,0  
        MOV  AX,BX
    MOV  CX,10000
    DIV  CX
    MOV  [SI],AL;求得万位的值,存入指定单元
        INC  SI
    MOV  AX,DX ;上次计算的余数存在DX中
    MOV  DX,0
    MOV  CX,1000                
    DIV  CX
    MOV  [SI],AL;求得千位的值,存入指定单元
        INC  SI
    MOV  AX,DX
    MOV  DX,0
    MOV  CX,100
    DIV  CX
    MOV  [SI],AL;求得百位的值,存入指定单元
        INC  SI
    MOV  AX,DX
    MOV  CL,10
    DIV  CL
    MOV  [SI],AL;求得十位的值,存入指定单元
        INC  SI
    MOV  [SI],AH ;此时,余数就是个位的值,
    LEA  SI,DECNUM
   ;以下代码开始显示存储在存储单元中的十进制数
    MOV  CX,5
DISP:   
    MOV DL,[SI] ;依次取出十进制数各位的值
    OR  DL,30H  ;将取出的值转换为ASCII值
    MOV  AH,2
    INT  21H        ;利用DOS功能调用,显示
    INC  SI
    LOOP  DISP
        MOV  DL,'D'
    MOV  AH,2
    INT  21H
    MOV  AH,4CH
    INT  21H
CODE    ENDS
    END     START
0
Posted in 汇编语言

因为masm.exe和link.exe文件只有win32位下才能直接运行。在64位系统下就会报错:系统不兼容

但是,我们不能因为这个就放弃学汇编程序

首先,我们需要准备dos—box软件,直接搜dos-box。安装运行。

然后在电脑磁盘上建立一个文件夹,例如:在E盘上建立一个文件huibain,这个文件夹里有一个文件夹masm5.0,文件里有masm.exe,link.exe,debug.exe等文件

然后打开dos-box:注意两个窗口都不关闭。

在其中一个窗口上显示有:Z:>

我们在后面输入:mount e e:huibian 回车

然后在z:>后面输入e:       表示跳转到磁盘e

然后就会z:>变成E:>

接下来,在E:>后面输入cd masm5.0

然后就可以按照win32环境下的步骤运行汇编程序

首先:masm 文件——link 文件——debug 文件.exe

哦了!

0
Posted in 汇编语言

请用冒泡排序法编程将内存ARRAY单元开始存储的一组8位带符号数据按从大到小排列 :

冒泡法:N个数要进行N-1趟。第一趟从第一个开始一次对相邻两个数进行比较,若数的大小次序错误,则交换,否则不作任何操作。进行N-1次比较结束时,最小数排在最后。然后,进行第二趟,只需要进行N-2次比较,就可排好次小数。第三趟,进行N-3次比较,………依次类推。

代码:

DATA   SEGMENT               
    NUM     DB  5,9,8,7,3,15
    LEN     EQU $-NUM
DATA    ENDS
CODE    SEGMENT                 
    ASSUME  CS:CODE,DS:DATA
START:
    MOV  AX,DATA
    MOV  DS,AX 
    MOV  CX,LEN 
    DEC  CX     ;CX←比较趟数,即外循环次数
LOP1:   MOV  DX,CX  ; 保存外循环次数在DX,内循环比较次数在CX中。
    MOV  SI,0        
LOP2:
        MOV  AL,NUM[SI]
    CMP  AL,ANUM[SI+1]  ;相邻两数据比较
    JAE  CONT
    XCHG AL,NUM[SI+1]
        MOV  NUM[SI],AL
CONT :
    INC SI         ;修改数据地址指针
    LOOP  LOP2     ; 内循环结束   
    MOV CX,DX      ;恢复外循环计数值
    LOOP LOP1      ;外循环是否结束
    MOV  AH,4CH
    INT  21H
CODE    ENDS
    END     START
0
Posted in 汇编语言