【学习笔记】汇编初步2---未完成,有错误还没修正

来源:互联网 发布:剑三五毒成女捏脸数据 编辑:程序博客网 时间:2024/05/17 21:50
控制指令:

Loop

loop隐含的的执行条件是CX,CX=0的时候就是loop结束的时间,loop命令隐含CX递减指令。loop以标号linex:为起点,以loop linex结束循环。linex只是在ASM中的一个标记,在编译后他其实被编译器替换为一个偏移地址,也就是变成了loop xxxxH这种形式。

assume cs:codecode segment;code for 2^12;plan A,answer in axmov ax,2add ax,ax;2^2add ax,ax;2^3add ax,ax;2^4add ax,ax;2^5add ax,ax;2^6add ax,ax;2^7add ax,ax;2^8add ax,ax;2^9add ax,ax;2^10add ax,ax;2^11add ax,ax;2^12;plan B,answer in axmov ax,2mov cx,11to:add ax,ax;2^12loop tomov ax,4c00hint 21hcode endsendend start

特殊寻址方法:

  1. [idata]
    基址+立即数。学名:直接寻址。在MASM里需要显式的给出DS,写成DS:[idata]。
    mov AX,DS:[1000H]
  2. [BX],[SI],[DI],[BP]
    基址+变址。学名:寄存器间接寻址。这三个寄存器在作为地址时会隐式引用DS作为基址,当然你也可以闲的蛋疼单独为他们指定一个基址,例如SS:[BX]。
    mov AX,[BX]mov AX,[SI]mov AX,[DI]mov AX,[BP]
  3. [BX+idata],[SI+idata],[DI+idata],[BP+idata]
    基址+变址+立即数。学名:寄存器相对寻址。这种寻址方法遵循的规则和【2】是一模一样的。注意!BP隐式引用的基地址寄存器为SS而不是DS
    mov AX,[BX+1000H]mov AX,[SI+1000H]mov AX,[DI+1000H]mov AX,[BP+1000H]
  4. [BX+SI],[BX+DI],[BP+SI],[BP+DI]
    基址+变址+相对变址(这个名字是我胡扯的)。学名:基址变址寻址。他遵循【3】的规则。当出现BP时隐式引用SS为基地址寄存器
    mov AX,[BX+SI]mov AX,[BX+DI]mov AX,[BP+SI]mov AX,[BP+DI]
  5. [BX+SI+idata],[BX+DI+idata]
    基址+变址+相对变址+立即数。学名:相对基址寻址。不废话,规则同【4】。
    mov AX,[BX+SI+idata]mov AX,[BX+DI+idata]mov AX,[BP+SI+idata]mov AX,[BP+DI+idata]

PS:在MASM中不能直接使用立即数作为地址,mov AL,[0]会被翻译为mov AL,0正确的方法是使用mov AL DS:[0],也就是说立即数必须指定寻址的段地址
         idata代表立即数,也就是个数字,他储存在CPU内的指令缓冲器........

如何指明指令中的数据长度:

  1. 通过寄存器名称指明数据长度。
    ;DS:[0]=0A,DS:[1]=0Bmov AX,0101Hmov AX,DS:[0];AX=0B0AHmov AL,01Hmov AL,DS:[0];AX=0AH
  2. 使用操作符指明数据长度。
    mov word ptr DS:[0],1;DS:[0]=01H,DS:[1]=00Hmov byte ptr DS:[0],1;DS:[0]=01H,DS:[1]=undefined
  3. 指令默认操作特定数据长度。
    push[1234H]push[12H];ERRORpopAXpopAL;ERROR


保护模式、实模式和虚拟8086模式:


汇编指令及伪指令:

汇编指令dwdefine word 的缩写,作用是定义字型数据(0000H),定义时可以用逗号分隔定义多个,他们将会被直接分配到定义时的代码段内存位置。

dw 0123H,4567H,89ABH
dbdefine byte 的缩写,作用是定义字节型数据(00H),也可以用来储存一个ASCII字符,定义时可以用逗号分隔定义多个,他们将会被直接分配到定义时的代码段内存位置。
db "masm"db 6DH,61H,73H,6DH
and按位与运算,他的作用强大到难以想象,最简单的比较到复杂的位检查他都可以实现。
运算过程是均为1置1,其他情况均置0
mov AL,01100011Band AL,00101001B;   AL=00100001B
or按位或运算,与and命令的作用一样强大。
运算过程是对应位均为0置0,任意操作数中该位为1置1
mov AL,01100011Bor  AL,00101001B;   AL=01101011B
div除法指令(division),很有自己特点的指令,他其实是用乘法运算器模拟的。
;假设DS:[0]=11Hmov AX,0100Hdiv byte ptr DS:[0]; AL=0FH,AH=01Hmov DX,
            

伪指令assume这个东西的学名叫“段寻址伪指令”,也就是用来定义各个段的名称,在MASM编译后会直接转换为对应的基地址存入段地址寄存器。例如下面代码定义了CS,DS,SS的段名,在程序中即可直接使用段名作为各个段的基址。

assume CS:code,DS:data,SS:stackcode segmentmov AX,stackmov SS,AXmov AX,datamov DS,datacodexxxxxcode endsdata segmentdw 0000H,00AAH,9000Hdata endsstack segmentdw 0,0,0stack endsend
            

附表:ASCII码表

关于ASCII码的使用技巧:

  1. 对数字执行and 数字,00001111B可以转换为二进制数字。
  2. 大写字母的码+36=小写字母。
  3. 大写字母第6位变成1就是小写字母,小写字母第6位变成0就是大写字母。简单来说就是or 大写字母,00100000B变成小写字母,and 小写字母,11011111B变成大写字母。这个特性还可以用来判断该ASCII码的大小写。
PS:二进制中的第几位是从右向左的

控制字符(ASCII control characters)二进制十进制十六进制控制字符转义字符说明000 0000000NUL Null character(空字符)000 0001101SOH Start of Header(标题开始)000 0010202STX Start of Text(正文开始)000 0011303ETX End of Text(正文结束)000 0100404EOT End of Transmission(传输结束)000 0101505ENQ Enquiry(请求)000 0110606ACK Acknowledgment(收到通知)000 0111707BELaBell(响铃)000 1000808BSbBackspace(退格)000 1001909HTtHorizontal Tab(水平制表符)000 1010100ALFnLine feed(换行键)000 1011110BVTvVertical Tab(垂直制表符)000 1100120CFFfForm feed(换页键)000 1101130DCRrCarriage return(回车键)000 1110140ESO Shift Out(不用切换)000 1111150FSI Shift In(启用切换)001 00001610DLE Data Link Escape(数据链路转义)001 00011711DC1 Device Control 1(设备控制1)001 00101812DC2 Device Control 2(设备控制2)001 00111913DC3 Device Control 3(设备控制3)001 01002014DC4 Device Control 4(设备控制4)001 01012115NAK Negative Acknowledgement(拒绝接收)001 01102216SYN Synchronous Idle(同步空闲)001 01112317ETB End of Trans the Block(传输块结束)001 10002418CAN Cancel(取消)001 10012519EM End of Medium(介质中断)001 1010261ASUB Substitute(替补)001 1011271BESCeEscape(溢出)001 1100281CFS File Separator(文件分割符)001 1101291DGS Group Separator(分组符)001 1110301ERS Record Separator(记录分离符)001 1111311FUS Unit Separator(单元分隔符)可打印字符(ASCII printable characters)二进制十进制十六进制字符010 00003220Space(空格)010 00013321!010 00103422"010 00113523#010 01003624$010 01013725%010 01103826&010 01113927'010 10004028(010 10014129)010 1010422A*010 1011432B+010 1100442C,010 1101452D-010 1110462E.010 1111472F/011 000048300011 000149311011 001050322011 001151333011 010052344011 010153355011 011054366011 011155377011 100056388011 100157399011 1010583A:011 1011593B;011 1100603C<011 1101613D=011 1110623E>011 1111633F?100 00006440@100 00016541A100 00106642B100 00116743C100 01006844D100 01016945E100 01107046F100 01117147G100 10007248H100 10017349I100 1010744AJ100 1011754BK100 1100764CL100 1101774DM100 1110784EN100 1111794FO101 00008050P101 00018151Q101 00108252R101 00118353S101 01008454T101 01018555U101 01108656V101 01118757W101 10008858X101 10018959Y101 1010905AZ101 1011915B[101 1100925C 101 1101935D]101 1110945E^101 1111955F_110 00009660`110 00019761a110 00109862b110 00119963c110 010010064d110 010110165e110 011010266f110 011110367g110 100010468h110 100110569i110 10101066Aj110 10111076Bk110 11001086Cl110 11011096Dm110 11101106En110 11111116Fo111 000011270p111 000111371q111 001011472r111 001111573s111 010011674t111 010111775u111 011011876v111 011111977w111 100012078x111 100112179y111 10101227Az111 10111237B{111 11001247C|111 11011257D}111 11101267E~扩展字符二进制十进制十六进制0111 11111277f1000 0000128801000 0001129811000 0010130821000 0011131831000 0100132841000 0101133851000 0110134861000 0111135871000 1000136881000 1001137891000 10101388a1000 10111398b1000 11001408c1000 11011418d1000 11101428e1000 11111438f1001 0000144901001 0001145911001 0010146921001 0011147931001 0100148941001 0101149951001 0110150961001 0111151971001 1000152981001 1001153991001 10101549a1001 10111559b1001 11001569c1001 11011579d1001 11101589e1001 11111599f1010 0000160a01010 0001161a11010 0010162a21010 0011163a31010 0100164a41010 0101165a51010 0110166a61010 0111167a71010 1000168a81010 1001169a91010 1010170aa1010 1011171ab1010 1100172ac1010 1101173ad1010 1110174ae1010 1111175af1011 0000176b01011 0001177b11011 0010178b21011 0011179b31011 0100180b41011 0101181b51011 0110182b61011 0111183b71011 1000184b81011 1001185b91011 1010186ba1011 1011187bb1011 1100188bc1011 1101189bd1011 1110190be1011 1111191bf1100 0000192c01100 0001193c11100 0010194c21100 0011195c31100 0100196c41100 0101197c51100 0110198c61100 0111199c71100 1000200c81100 1001201c91100 1010202ca1100 1011203cb1100 1100204cc1100 1101205cd1100 1110206ce1100 1111207cf1101 0000208d01101 0001209d11101 0010210d21101 0011211d31101 0100212d41101 0101213d51101 0110214d61101 0111215d71101 1000216d81101 1001217d91101 1010218da1101 1011219db1101 1100220dc1101 1101221dd1101 1110222de1101 1111223df1110 0000224e01110 0001225e11110 0010226e21110 0011227e31110 0100228e41110 0101229e51110 0110230e61110 0111231e71110 1000232e81110 1001233e91110 1010234ea1110 1011235eb1110 1100236ec1110 1101237ed1110 1110238ee1110 1111239ef1111 0000240f01111 0001241f11111 0010242f21111 0011243f31111 0100244f41111 0101245f51111 0110246f61111 0111247f71111 1000248f81111 1001249f91111 1010250fa1111 1011251fb1111 1100252fc1111 1101253fd1111 1110254fe1111 1111255ff

原创粉丝点击