学习笔记:汇编语言01

笔者是初学者,对汇编语言掌握不是很深,代码写的不够好,希望读者多多体谅,有哪里是错误的或是可以改进的地方,欢迎大家在评论区评论!

64位系统的电脑需要用到dosbox模拟器进行16位操作,以下代码均在DOSbox0.74上运行

DOXbox0.74基本操作:

  1. 1.打开dosbox或者打开dos命令行
  2. 2.挂载电脑硬盘到dosbox    挂载命令 mount d d:\XXXX(在电脑的D盘建立文件夹)
  3. 3.基本dos命令:在D盘根目录下建立自己的工作文件夹(与上一个步骤的文件夹名字相同),并把masn.exe  link.exe 和Debug.exe放到自己的文件夹。
  • 在记事本上写最初的汇编程序,并另存为格式:所有文档的ASM文件,存在上面的文件夹里
  • 打开DOSbox把编写的汇编程序用masm进行编译生成obj目标文件
  • 把目标文件用link进行链接生成Exe可执行文件
  • 调试文件: debug +文件名.exe
  • (删除文件del 文件名.文件格式)

4.常见的调试命令

  • -A 汇编
  • -G 连续运行
  • -T 单步运行
  • -C 比较命令
  • -D 查询
  • -E 写入
  • -F 写入字符串
  • -q 跳出当前调试
  1. 01  一个字符段的搬运程序:要求把原地址3000段开始后的8个数据移动到4000段开始的地址保存。
  • 调试步骤1.查询3000H开始的8个数值 (-d)
  • 2.更改数据 把数据改为00 01 02 03 04 05 06 07(-e)
  • 3.运行程序进行搬运(-g)
  • 4.查询4000H段内的数据(-d)
  • 代码如下:
  • CODE SEGMENT
        ASSUME CS:CODE
    
    START:MOV SI,4000H
        MOV AX,[SI]
        MOV BX,[SI+1]
        MOV CX,[SI+2]
        ADD BX,AX
        ADD CX,BX
    MOV [SI+3],CX
    
    INT 03H
    CODE ENDS 
    END START
  • 总结:在做的时候发现在DOXbox上无法使用存储器直接寻址(一直无法运行出正确的结果),所以后面都用寄存器间接寻址代替。

  1. 02 分别在内存地址4000H、4001H、4002H输入三个个位数,把这三个数相加后的结果写入4003H地址内

  2. CODE SEGMENT
        ASSUME CS:CODE
    
    START:MOV SI,4000H
        MOV AX,[SI]
        MOV BX,[SI+1]
        MOV CX,[SI+2]
        ADD BX,AX
        ADD CX,BX
    MOV [SI+3],CX
    
    INT 03H
    CODE ENDS 
    END START

    03 把4000H、4001H的低位分别送入4002H高低四位(一般本程序用于把显示缓冲区的数据取出拼装成一个字节)

  • CODE SEGMENT
       ASSUME  CS:CODE
    
    START:MOV SI,3000H
          MOV DI,3004H
          MOV CX,000AH
        A:MOV  AX,[SI+9]
          MOV [DI+9],AX
          DEC SI
          DEC DI
          DEC CX
          JNZ A
    
        B:INT 03H
    
    CODE ENDS
    END START
  1. 04 分别在内存地址 3000H 后输入 10 个数据,把这10个数移动到 3004H后的 10 个地址内。(当原地址段和目标地址如果出现重复的时候,数据的该如何移动)——倒着存数据

  • CODE SEGMENT
       ASSUME  CS:CODE
    
    START:MOV SI,3000H
          MOV DI,3004H
          MOV CX,000AH
        A:MOV  AX,[SI+9]
          MOV [DI+9],AX
          DEC SI
          DEC DI
          DEC CX
          JNZ A
    
        B:INT 03H
    
    CODE ENDS
    END START
  1. 05 从键盘输入一位数字,判断其奇偶性,若为奇数,在屏幕上输出字符串“It is odd!”

否则输出“It is even!”

DATA SEGMENT 
   STRING1 DB 'IT IS ODD!$'
   STRING2 DB 'IT IS EVEN!$'
DATA ENDS
CODE SEGMENT
 ASSUME CS:CODE,DS:DATA 
;01 用div做商后判断余数来区别奇偶
START:  
        MOV AX,DATA
        MOV DS,AX

        MOV AH,01H  
        INT 21H
        MOV BL,2
        DIV BL
        CMP AH,0
        JE EVN
        JNE ODD
ODD:MOV DX,OFFSET STRING1 
     MOV AH,09H
     INT 21H 
     MOV AH,4CH           
     INT 21H
EVN: MOV DX,OFFSET STRING2
     MOV AH,09H
     INT 21H 
     MOV AH,4CH           
     INT 21H

CODE ENDS
     END START

;02 用RCR右循环判断是否进位判断奇偶性
START:  
        MOV AX,DATA
        MOV DS,AX

        MOV AH,01H 
        INT 21H
        CLC
        RCR AL,1
        JNC EVN
        MOV DX,OFFSET STRING1
        CALL DISPMESS
EVN: MOV DX,OFFSET STRING2
     CALL DISPMESS
DISPMESS PROC
     MOV AH,9 
     INT 21H 
     MOV AH,4CH 
     INT 21H
DISPMESS ENDP

总结:在调试程序时要先连续执行后,再输入一个奇数/偶数,否则会一直无法正常运行

06 有三个单字节无符号数存放在BUFFER开始的缓冲区中,将这三个数按从大到小排序。

DATA SEGMENT
	MSG1 DB 'Enter the first value(0-9):$'
    MSG2 DB 0DH,0AH,'Enter the second value(0-9):$'
    MSG3 DB 0DH,0AH,'Enter the third value(0-9):$'
	MSG4 DB 0DH,0AH,'After sorting...$'
	NUM1 DB 0DH,0AH,'Num1=$'
	NUM2 DB 0DH,0AH,'Num1=$'
	NUM3 DB 0DH,0AH,'Num1=$'
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
START:	MOV AX,DATA
		MOV DS,AX

	MOV DX,OFFSET MSG1
	MOV AH,09H
	INT 21H	
	MOV AH,01H
	INT 21H
	MOV BL,AL
	
	MOV DX,OFFSET MSG2 
	MOV AH,09H
	INT 21H
	MOV AH,01H
	INT 21H
	MOV CL,AL                      

	MOV DX,OFFSET MSG3
	MOV AH,09H
	INT 21H
	MOV AH,01H
	INT 21H
	MOV BH,AL

    CMP BL,CL
	JAE NEXT1
	XCHG BL,CL

NEXT1:	CMP BL,BH
	JAE NEXT2
	XCHG BL,BH

NEXT2:	CMP CL,BH
	JAE DISPLAY
	XCHG CL,BH

DISPLAY:MOV DX,OFFSET MSG4
	MOV AH,09H
	INT 21H
	
    MOV DX,OFFSET NUM1
	MOV AH,09H
	INT 21H
	
	MOV DL,BL
	MOV AH,02H
	INT 21H

	MOV DX,OFFSET NUM2
	MOV AH,09H
	INT 21H
	
    MOV DL,CL
	MOV AH,02H
	INT 21H
	
	MOV DX,OFFSET NUM3
	MOV AH,09H
	INT 21H

	MOV DL,BH
	MOV AH,02H
	INT 21H	

	MOV AH,4CH
	INT 21H
CODE ENDS
END START

先写到这,谢谢观看!欢迎大家指正! 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值