as和AT&T格式只是在操作数顺序、表示上略有不同。其指令基本一致。
int 0x13:参考INT 13H
ah为功能号,当ah=0x02时:从驱动器读取扇区。此时有
输入参数表:
寄存器名称 | 表示的参数 |
---|---|
AH | 0x02 |
AL | 读取多少个扇区 |
CH | 磁道号 |
CL | 扇区号 |
DH | 磁头号 |
DL | 驱动号 |
ES:BX | 读入缓冲区位置 |
返回参数表:
寄存器名称 | 参数 |
---|---|
CF | 进位标志,如果发生错误,就置位;没有错误就清0 |
AH | 返回代码 |
AL | 实际读取的扇区数 |
DL的确定方法:
现在的硬盘会兼容这种寻址方式,并且现在对于INT13 已经进行了扩展。
int 0x10:参考int 0x10
ah=0x03时,读取光标位置
ah=0x13时,显示字符串
ah=0x0f时,读取显示卡当前显示模式。
int 0x15:参考How to get memory size?以及INT 15h, AH=88h - Get Extended Memory Size
jnc: 如果CF=0,则跳转。
rep movw :从DS:SI中移动CX个字(word)到ES:DI。
jmpi 段内偏移,段号:表示段间跳转。
db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1
dw定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2
dd定义双字类型变量,一个双字数据占4个字节单元,读完一个,偏移量加4
参考db,dw,dd在汇编语言中使用的区别
lss:可以参考head. S analysis – linux-0.11 analysis notes (V)
以intel汇编的指令格式使用lss应该是:
lss r32,m16:32
表示将一个长指针载入到ss:r32中。其中ss中为段选择符,r32(一个通用寄存器)中为段中偏移地址。m16:32 表示一个内存操作数,这个操作数是一个长指针,由 2 部分组成:16位段选择器和32位偏移量。
out:I/O操作指令,功能为把AL/AX的数据送到IO地址,IO地址如果大于FFH,则地址需要放入DX,要输出字节,默认使用AL寄存器,要输出字,默认使用AX寄存器。 即I/O端口放在dx寄存器中;要输出的数据放在al或ax中。
lea:Load effective address,取有效地址,也就是取偏移地址。lea指令用于把源操作数的地址偏移量传送目的操作数。
AT&T汇编的寻址方式可以参考AT&T汇编的寻址方式
pushfl:参考Flag Instructions。Pushes the eflags register onto the top of the stack。将eflag寄存器压入栈顶。
shl:参见shl 和 shr指令(逻辑移位指令),逻辑左移指令。注意,参考博客中为Intel,不是AT&T。
jb:参见13-ZF标志位,JB和JNB跳转指令。jump when below,注意,参考博客中为Intel,不是AT&T。
loop:参见汇编loop指令及用法解释。每执行一次,cx寄存器减1,直到为0。
jmpi: 段间跳转指令,参考,jmp是段内跳转。
je:参考jmp指令,如果ZF标志等于0,则跳转。
add:可以参考8086 Integer Arithmetic Instructions – Assembly Language Programming,add指令影响AF, CF, OF, PF, SF, ZF 标志。
lds 参考:lds,
stosb:参考stosbSTOSB将AL中的值复制到ES:DI指向的位置。然后DI递增(如果清除了方向标志)或递减(如果设置了方向标志),为在下一个位置存储AL做准备。
jz:参考JZ,与JE相同
movs:参考movs。该指令将DS:SI指向的字节或字复制到ES:DI指向的位置。移动之后,SI和DI将递增(如果方向标志被清除)或递减(如果方向标志被设置),指向字符串的下一个元素。
testb:参考testb,如果结果是0,则ZF置位;如果结果非0,则ZF复位。置位时,JE可跳转,复位时,JNE可跳转。
shld:参考汇编语言SHLD(双精度左移)和SHRD(双精度右移)指令