Pwn

汇编语言笔记(三)

Posted on 2020-01-02,4 min read

汇编语言源程序
汇编语言源程序中,包含两种指令,汇编指令和伪指令,汇编指令有对应的机器码的指令,可以被编译成机器指令,比如mov ax,123H

伪指令指的是没有对应的机器指令,不被CPU执行,由编译器来执行

assume cs:codesg        #伪指令含义为”假设“,通过它来将段寄存器和莫一个具体的段联系
codesg segmeng          #定义了一个段,名称位codesg,表示段开始
    mov ax,0123H
    mov bx,0456H
    add ax,bx
    add ax,ax
    mov ax,4c00H
    int 2H
codesg ends             #表示codesg段到此结束,ends和segmeng是成对出现的,表示段,而end表示汇编程序的结束
end                     #汇编程序的结束标记

程序返回

mov ax,4c00H
int 21H
这两条指令就能使程序返回(原理未知,学的还太浅了)

编辑源程序
edit--->保存为c:\1.asm----->masm(c:\1.asm)---->link(1)
DOS执行1.exe时,是正在运行的command,将1.exe载入内存,程序结束后,返回到command
debug 1.exe

CX是程序长度,15个字节
程序加载后,ds放的是内存段地址,偏移地址为0
内存区前256个字节中存放的PSP,DOS用来和程序进行通信,从256字节向后的空间存放的是程序
从DS中可以得到PSP的段地址
程序的物理地址是SA*16+0+256=(SA+16)*16+0
init 21要用p来执行,不能用T
[BX]和LOOP指令
[BX]
mov ax,2000H
mov ds,ax
mov bx,0000H
mov ax,[0]
简单来说。BX就是偏移地址,在汇编源程序中,不能使用[0]这种来表示偏移,会被解释为0

描述性的符号()
(ax) ax中的内容
(20000H) 内存20000H单元的内容
((ds)16+(bx)) 表示段地址16+偏移地址bx
(ax)=0010H mov ax,0010H
(21000H)=0010H mov 2000:1000 0010

mov bx,1
#bx=1
inc bx
#将bx中的内容+1 bx=2
mov ax,2000H
#ax=2000H
mov ds,ax
#ds=段地址=2000
mov bx,1000H
#dx=偏移地址=1000H
mov ax,[bx]
#[bx]表示ds:dx=2000:1000地址的数据

LOOP指令
表示循环
2*2

assume cs:code
code segment
    mov ax,2
    add ax,ax
    mov ax,4c00H
    int 21h
code ends
end

2*12

assume cs:code
code segment
    mov ax,2
    mov cx,11
  s:add ax,ax
    mov ax,4c00H
    int 21h
code ends
end

ex中存放着循环次数,不为0则转到s所标识的地址
首先判断cx=cx-1
如果为零则执行下一条指令
计算123*236

assume cs:code
code segment
    mov ax,2
    mov cx,236
  s:add ax,123
    mov ax,4c00H
    int 21h
code ends
end

Debug跟踪loop指令
ffff:0006单元中的数乘以3,结果存储在dx中
(1)运算后的结果是否会超出dx所存储的范围
ffff:0006中是一个字节型数据,内存单元,最大为ff,256,乘3,不会大于65535,可以在最大为ffff,65535的寄存器dx中放下
(2)循环累加,放哪个寄存器进行累加
ffff:06赋值给AX,用dx累加
dx=0
(dx)=(dx)+(ax)
(3)ffff:6是一个字节单元,ff,ax是一个16位寄存器,ffff,长度不一样怎么赋值
8位数据01H和16位数据0001H数据长度不一样。但是值相同
假设ffff:0006单元数据为AAH,ax中的值要和ffff:0006单元相同,就将ah设为0,al设为ffff6H

下一篇: SSRF打内网Redis→