安全攻防首页投稿(暂停使用,暂停投稿)

学习汇编--写一个完整的汇编(一)

2017-07-19  本文已影响16人  cochn

汇编指令

伪指令

中断

由软件或者硬件发出信号,使CPU暂停当前的任务,转而去执行另一个段子程序

中断的分类

DOS系统功能调用

这是一段完整的汇编代码
将数据存放在ds中,并将ds中的数据以字节的形式倒叙存入栈中

assume cs:code
code segment

mov ax,2000h
mov ds,ax
mov [0],1122h
mov [2],3344h
mov [4],5566h
mov [6],7788h
mov [8],99aah

mov ax,3000h
mov ss,ax
mov sp,ah
push [8]
push [6]
push [4]
push [2]
push [0]

mov ah,4ch
int 21h

code ends
end

loop指令

    mov cx,循环次数
标号:
    循环执行的程序代码
    loop 标号

示例1可以改写为

    assume cs:code
    code segment

    mov ax,2000h
    mov ds,ax
    mov bx,1122h
    mov cx,5;循环次数
    mov si,0h;si:源变址寄存器可用来存放相对于DS段之源变址指针
s:  mov [si],bx;因为[]中不能存放数据寄存器、段寄存器和控制寄存器
    add bx,2222h
    add si,2
    loop s;每次执行先让cx-1,然后判断cx是否为0
    
    mov ax,3000h
    mov ss,ax
    mov sp,0ah;这里需要sp指向10处,不能直接写ah
    mov si,8h
p:    push [si]
    sub si,2
    loop p
    
    mov ah,4ch
    int 21h

    code ends
    end

代码分段

assume cs:code,ds:data,ss:stack

data segment
    db 20 dup(0)
data ends

stack segment
    db 20 dup(0)
    age dw 20h;age标号 编译器会将其转成地址值
stack ends

code segment
    
    ;配置ds,ss如果不配置,data,stack里面也没数据的话三个段地址随机并相同
    ;data,stack里面有数据的话会随机分配地址,三个段地址不相同
    ;如果配置
    
    mov ax,2000h
    mov ds,ax
    
    mov ax,3000h
    mov ss,ax
 ;   mov sp,14h;不用指定sp,因为上面stack已经指定栈段和大小了
   
    mov [0],1122h
    mov age,1122h;age物理内存地址

    push 1122h
    
    mov ah,4ch
    int 21h
    
code ends

end

练习

  ;0x00010h 11h
  ;0x00011h 22h
  ;0x00012h 33h
  ;求三个字节的和
    
 ;   mov ax,0001h
 ;   mov ds,ax
    
 ;   mov [0],11h
 ;   mov [1],22h 
 ;   mov [2],33h
     
 ;   mov al,[0]
 ;   add al,[1]
 ;   add al,[2]

如果上面代码中数据段保存的值是0xff,0xff,0xff,使用上面的计算方法,会造成溢出

assume cs:code
code segment 
start: 
  ;0x00010h ffh
  ;0x00011h ffh
  ;0x00012h ffh
  ;求三个字节的和
  ;这种情况下在使用代码1的方式,在相加的过程中,al溢出
    mov ax,0001h
    mov ds,ax
   
    mov [0],0xff;写ffh会报错,无法识别这个十六进制 
    mov [1],0xff
    mov [2],0xff
    
    mov bx,0h
    
    mov al,[0]
    mov ah,0h
    add bx,ax
    
    mov al,[1]
    mov ah,0h
    add bx,ax
    
    mov al,[2]
    mov ah,0h
    add bx,ax
    
    mov ah,4ch
    int 21h
    
code ends
end  start
使用loop指令
assume cs:code
code segment 
start: 
  ;0x00010h ffh
  ;0x00011h ffh
  ;0x00012h ffh
  ;求三个字节的和
  ;这种情况下在使用代码1的方式,在相加的过程中,al溢出
    mov ax,0001h
    mov ds,ax
   
    mov [0],0xff;写ffh会报错,无法识别这个十六进制 
    mov [1],0xff
    mov [2],0xff
    
    mov bx,0h
    mov dx,0h
    mov cx,3h 
s:  mov al,[bx];如果这里换成dx报语法错误
    mov ah,0h
    add dx,ax
    add bx,1
    loop s

    mov ah,4ch
    int 21h
    
code ends
end  start
上一篇 下一篇

猜你喜欢

热点阅读