汇编语言代码书写格式指南

在这里插入图片描述

在程序的段中存放数据

  • 在程序的段中【数据段、代码段、栈段】存放数据,运行时由操作系统分配空间。如果在程序中直接书写数据,是会有危险的
  • 将内存 ffff:0 ~ ffff:b 中的数据拷贝到 20:0~20:b单元中
    ; 使用附加段寄存器
    assume cs:code
    code segment
    	mov ax,0ffffh   ;累加器
    	mov ds,ax		;数据段寄存器
    	mov ax,0020h    ;累加器
    	mov es,ax       ;附加数据段寄存器
    
    	mov bx,0		;基址寄存器
    	mov cx,12       ;计数寄存器
     s: mov dl,[bx]		;dx数据寄存器
     	mov es:[bx],dl
     	inc bx
     	loop s
    
    	mov ax,4c00h
    	int 21h
    code ends
    end
    

程序的一般框架

在这里插入图片描述

  • dw: define word 定义字型数据
    dw 定义一个字
    db 定义一个字节
    dd 定义一个双字
  • start 定义一个标号,指示代码开始的位置
    end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方
    程序加载后,CS:IP指向要执行的第一条指令在start处
    如果不指定start和end,直接在代码段中定义数据,CS:IP会指向数据段寄存器的开始
    assume cs:code
    code segment
    		dw 0123H,0456H,0789H,0abcH,0defH
    start mov bx,0
    	  mov ax,0
    	  mov cx,8
       s: add ax,cs:[bx]
       	  add bx,2
       	  loop s
    
    	  mov ax,4c00h
    	  int 21h
    code ends
    end start	  
    

在代码段中使用栈

  • 利用栈,将程序中定义的数据逆序存放
assume cs:codesg    ;cs是段地址
codesg segment
	dw 0123H,0456H,0789H,0abcH,0defH,0cbaH,0987H
	dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0
start: mov ax,cs    
	   mov ss,ax    ;定义了栈的段地址
	   mov sp,30h   ;定义了栈的偏移地址
	   mov bx,0     
	   mov cx,8
	s: push cs:[bx]
	   add bx,2
	   loop s

	   mov bx,0      
	   mov cx,8
   s0: pop cs:[bx]    ;出栈到原来的位置,以达到逆序的目的
   	   add bx,2
   	   loop s0

	   mov ax,4c00h
	   int 21h
codesg ends
end start

将数据、代码、栈放入不同段

assume cs:code,ds:data,ss:stack
data segment
	dw 0123H,0456H,0789H,0abcH,0defH,0cbaH,0987H
data ends
stack segment
	dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
	  ; 初始化段寄存器的值
start:mov ax,stack     ; 初始化栈寄存器
	  mov ss,ax
	  mov sp,20h
	  mov ax,data      ; 初始化数据寄存器
	  mov ds,ax
	
	  ; 初始化通用寄存器的值
	  mov bx,0         ; 基址寄存器
	  mov cx,8		   ; 计数寄存器
   s: push [bx]
   	  add bx, 2
   	  loop s
	
	  mov bx,0
	  mov cx,8
  s0: pop [bx]
  	  add bx,2
  	  loop s0

	  mov ax,4c00h
	  int 21h
code ends
end start

处理字符问题

  • 编译器会将字符转化成响应的ASCII码
    data segment
    	db 'unIX'
    data ends
    

在这里插入图片描述

  • 小写字母的ASCII码值比大写字母的ASCII码值大20H
  • 第一个字符串将小写字母转化成大写字母
    第二个字符串将大写字母转化成小写字母
    assume cs:codesg,ds:datasg
    datasg segment
    	db 'BaSiC'
    	db 'iNfOrMaTiOn'
    datasg ends
    
    codesg segment
    start:
    	mov ax,datasg
    	mov ds,ax
    
    	mov bx,0
    	mov cx,5
     s: mov al, [bx]
     	and al,11011111b
     	mov [bx],al
     	inc bx
     	loop s
    
    	mov bx,5
    	mov cx,11
    s0: mov al,[bx]
    	or al,00100000b
    	mov [bx],al
    	inc bx
    	loop s0
    
    	mov ax,4c00h
    	int 21h
    codesg ends
    end start 
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值