Chapter V: 程序设计

躺雷记录:

关于汇编中大小写的问题:

  • 各条指令不区分大小写
  • 但是用户定义的各个变量, 标号等, 将区分大小写

关于汇编中的中括号:

对于MOV:

num  dword 2
mov     eax,2
mov     ebx,num
mov     ecx,[num]
;执行完ebx==ecx==2
;证明了对于变量, 加不加[]得到的都是符号地址中储存的值
;想要获得符号地址的地址, 需要用LEA, 或者是offset前缀
mov  ebx,eax
;ebx==2
;将eax中的值传递给ebx中
mov     ecx,[eax]
;报错,因为这里翻译成汇编是mov ecx,DS:[eax]
;证明了对于寄存器, 不加[]取的是寄存器中的储存的值
;而加[]是将其中的值解释为地址
;(BX)=1F23H
;(1F23H)=3
;(BL)=23
MOV     [BX], BL
;执行后(1F23H)=BL=23
;即将BX中的值解释为地址 并将BL的值传递给该地址

对于LEA:

mov eax,2
lea ebx,[eax]
;执行后ebx=2
mov ebx,eax
;等同于上句
lea ebx,eax
;编译器报错: error A2070: invalid instruction operands
;证明了lea指令对于寄存器, 加[]取得是寄存器中的值
num dword 2
lea ebx,num
lea eax,[num]
; eax为num的地址,而ebx==eax
;证明了lea指令对于符号地址, 加不加[]效果相同

关于汇编中的立即数:

  • 汇编中默认的立即数为10进制, 使用16进制需要特别声明
  • 而针对16进制, 当首位为字母时, 需要在前头补0

如:

MOV  AL, 0ABCDH  ;必须加0, 否则报错

关于串处理指令:

由于串处理指令中使用的默认寄存器是:
SRC string: DS:SI
DST string: ES:DI
注意此处的DST使用的是ES前缀, 所以必须要设置ES
即将DST定义的segment name存到ES中

DATA     SEGMENTS1       DB      'personal computer'S2         DB      'personal computer'MESS1  DB      'match.$'MESS2    DB      'no match.$'
DATA    ENDS
...MOV      AX, DATAMOV     DS, AXMOV   ES, AX      ;需要单独操作

关于Debug的应用:

Debug 是实模式(i7 8086K 8086模式)程序的调试工具。
使用它,可以查看 CPU 各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。
Debug 的常用功能:
R 命令:查看、改变 CPU 寄存器的内容;
D 命令:显示寄存器中的内容;
E 命令:改写内存中的内容;
U 命令:将内存中的机器指令翻译成汇编指令;
T 命令:执行一条机器指令;
(只会用这个)
A 命令:以汇编指令的格式在内存中写入一条机器指令


汇编程序基础模板:

;******************
DATAS SEGMENT
;数据段, 用于变量的定义
DATAS ENDS
;******************
STACKS SEGMENT
;堆栈段, 当前程序暂时没有用到
STACKS ENDS
;******************
CODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS ;assume只起声明的作用, 并不真正操作
START:MOV AX,DATAS  ;将DATAS送ds寄存器, 才有用MOV DS,AX
;******************;主程序编写部分;******************MOV AX, 4C00H ;相当于main函数最后的returnINT 21H          ;只有在程序需要结束时才使用, 平时使用int 21时并不需要
CODES ENDSEND START     ;标准格式

循环结构:

循环程序由三部分组成:

  • 设置循环的初始条件
  • 循环体
  • 循环控制部分:
    计数控制、特征值控制、地址边界控制

单循环:

循环输出BX内储存的值:

     MOV CH, 4       ;循环控制
rotate: MOV CL, 4       ;每次移位次数为4ROL    BX, CL      ;移位指令MOV    AL, BL      ;将移位后BX的第8位赋给ALAND AL, 0FH      ;将AH置零, 由于计算机最低只能进行字节操作, 这里需要4bit操作, 所以这么整ADD AL, 30H       ;转换为ASCII码CMP AL, 3AH       ;将小写a~f转化为大写A~FJL   printit     ;跳转指令ADD AL, 7      ;如果为a~f, 则转化为大写
printit:MOV DL, AL      ;显示输出的入口参数MOV AH, 02H       ;显示输出的功能号INT    21H         ;CPU中断DEC CH            ;循环控制JNZ    rotate      ;跳回程序, 完成循环

把Y中1的个数存入COUNT单元中

;***************
DATAS   SEGMENTnumber       dw  78a4h   ;这玩意就是Yaddress  dw  numbercount         dw  ?
DATAS   ENDS
;***************
CODES   SEGMENTASSUME   CS:CODES, DS:DATAS
START:MOV   AX, DATASMOV    DS, AX
;***************MOV     CX, 0           ;重置CX,用于后头的计数MOV    BX, address     ;将address中的值传给BXMOV     BX, [BX]        ;将BX中的值指向的内存空间中的值传递给BX;执行后(BX)=78a4H
REPEAT1:    TEST    BX, 0FFFFH      ;AND一下, 主要是刷新FLAGS, 用于后头的判定JZ       EXIT1           ;检测BX中的1是否全都移出了, 满足则代表循环结束JNS   SHIFT           ;通过符号位判定最高位是否为1INC  CX              ;如果为1, 则CX++
SHIFT:  SHL     BX, 1           ;逻辑左移1位JMP  REPEAT1         ;建立循环
EXIT1:  MOV     CX, count       ;最后将CX中的结果装入count中
;***************MOV     AX, 4C00HINT    21H
CODES   ENDSEND START

插入排序:

;***************
DATAS   SEGMENTX            DW  ?           ;-1ARRAY_HEAD   DW  3,5,15,23,37,49,52,65,78,99ARRAY_END    DW  105N            DW  32
DATAS   ENDS
;***************
CODES   SEGMENTASSUME   CS:CODES, DS:DATAS
START:MOV   AX, DATASMOV    DS, AX              ;基本操作
;***************MOV     AX,N                MOV     X,-1                ;执行后(X)=0FFFFHMOV  SI,0                ;初始化下标
COMPARE:CMP     ARRAY_END[SI],AX    ;将array中的数从后往前与N比较JLE   INSERT              ;如果array[si]<N, 则插入NMOV  BX,ARRAY_END[SI]    ;否则将array[si]后移动一位MOV   ARRAY_END[SI+2],BX SUB     SI,2                ;改变下标, array是DW,所以SI-=2JMP     COMPARE             ;跳转达成循环
INSERT:MOV  ARRAY_END[SI+2],AX ;在已经空出的位置插入N
;****************MOV        AX, 4C00HINT    21H
CODES   ENDSEND START

多重循环:

冒泡排序:

//CPP实现for (i=0; i<n-1; ++i)  //比较n-1轮{for (j=0; j<n-1-i; ++j)  //每轮比较n-1-i次,{if (a[j] < a[j+1]){buf = a[j];a[j] = a[j+1];a[j+1] = buf;}}}
;***************
DATAS   SEGMENTA    DW      5, 8, 16, 32, 84N   DW      5
DATAS   ENDS
;***************
CODES   SEGMENTASSUME   CS:CODES, DS:DATAS
;***************
START:MOV   AX, DATASMOV    DS, AX              ;基本操作
;***************MOV     CX,N        ;将数组元素个数存放到CXDEC    CX          ;CX--
LOOPOUT:                ;外层循环MOV    DI,CX       ;在DI中暂存外层循环数MOV     BX,0        ;BX作为数组下标, 初始为0
LOOPIN:                 ;内层循环   MOV     AX,A[BX]    ;将数组的A[I]装入AXCMP        AX,A[BX+2] ;A[I]与A[I+1]比较JGE  CONTINUE    ;如果A[I]>=A[I+1]则跳过交换的步骤XCHG    AX,A[BX+2] ;交换数组两个元素的值MOV  A[BX],AX    ;交换数组两个元素的值
CONTINUE:ADD    BX,2        ;循环控制: 下标++LOOP   LOOPIN      ;每次LOOP都使CX--MOV    CX,DI       ;重置CX, 即外层循环数LOOP   LOOPOUT     ;每次LOOP都使CX--
;***************MOV     AX, 4C00HINT    21H
CODES   ENDSEND START

汇编附加段:

附加段用于数据的定义
但是实际上在8086中, 数据定义在附加段和数据段的作用是相同的, 只需要在使用时整对段地址就好, 即

;将对应的段地址存到段地址寄存器
MOV AX, DATA
MOV DS, AX
MOV AX, EXTRA
MOV ES, AX

但通常在附加段中保存大数据, 如串和数组

汇编的标号&标识符:

  1. 标号:
    为指令的符号地址
    长度限制31个字符

  2. 标识符:
    为变量, 常量等的符号地址
    长度通常也是31个字符




后头将Ch.6




Chapter VI: 子程序

躺雷记录:

过程定义伪操作PROC:

用于定义子程序(就是函数)

标准格式:

label PROC [attributes] [USES reglist], parameter_list...
label ENDP
  • label: 作为符号地址保存子程序的段地址
    与其他标识符的定义有相同的要求
  • PROC: 伪操作标志
  • ENDP伪操作结束标志
  • attributes: 子程序属性, 具体可以是以下任意内容
[distance] [langtype] [visibility] [prologuearg]

但是通常使用的只有distance:

  1. NEAR:
    提供段内调用
    当子程序与调用点定义在同一个段中时使用
  2. FAR:
    提供段间调用
    当子程序与调用点定义在不同的段中时使用
    但是当定义在同一个段中时也可以使用
    所以这是一个通用的选择

注意这两个控制的都是RET指令的返回方式

关于汇编中的start:

start为程序的入口, 程序加载到内存之后CS:IP会指向这个标号, 从START指向的指令开始运行

同时, start只是一个标号, 并没有强制的语法特定, 使用其他也可以…
如改成FUCK也是可以运行的…

子程序的定义位置:

由于上头的start程序入口的问题, 所以子程序不能定义在start & END start中

可以定义的位置有两个:

  1. 与start & END start定义在同一代码段中, 但是需要定义在其之前或其之后
    (类似于main与其他函数的关系)
  2. 可以定义在其他代码段中

子程序的传参&返回值:

  1. 寄存器传参:
    类似于形参传递.寄存器法

    寄存器法就是将入口参数和出口参数存放在约定的寄存器中。

    • 优点:数据传递书读快、编程较方便、节省内存单元。

    • 缺点:当传递参数过多时候,由于寄存器个数有限,及寄存器的频繁使用,将导致寄存器不足。

    • 适用:参数较少的子程序

  2. 储存单元传参:
    类似于函数使用全局变量

    把入口参数和出口参数都放在既定的储存单元中

    • 优点:不占用寄存器、参数个数任意、每个子程序要处理的数据和送出的结构都有独立的存储单元

    • 缺点:但用一定数量的存储单元,增加编程中对变量定义的难度

  3. 堆栈传参:
    类似于传递变量指针

    堆栈法是利用堆栈来传递参数
    通常将变量的地址保存到堆栈中

    • 优点:参数不占用寄存器,和存储单元。参数存放在公共堆栈区,处理完后客恢复。参数个数一般不限

    • 缺点:由于参数和子程序混杂在一起,存取参数时候必须小心计算它在堆栈中的位置。要注意断点的保存和恢复

  4. 地址表传参:
    类似于传递变量指针

    这种方法是把参数组成的一张参数表放在某个存储区中,然后只要主程序和子程序约定好这个存储区的首地址和存放的内容,在主程序中将参数传递给地址表,在子程序中根据地址表给定的参数就可以完成操作。

伪操作equ:

EQU 伪指令把一个符号名称与一个整数表达式或一个任意文本连接起来
可以理解为define宏定义, 功能与其相似

格式:

name EQU expression
name EQU symbol
name EQU <text>
  • 第一种, expression 必须是一个有效整数表达式
  • 第二种, symbol 是一个已存在的符号名称,已经用 = 或 EQU 定义过了
  • 第三种, 任何文本都可以岀现在<…>内。当汇编器在程序后面遇到 name 时,它就用整数值或文本来代替符号。

例如:

//将几个DOS标志号和助记符相绑定
display     equ 2h
key_in      equ 1h
doscall     equ 21h

10进制到16进制的转换程序:

DECIHEX  SEGMENTASSUME   CS: DECIHEX
;******************
DECIBIN     PROC    NEAR    ;负责从键盘读取10进制数值MOV   BX, 00H
NEWCHAR:MOV     AH, 01H     ;DOS调用,键盘输入值INT     21HSUB  AL, 30H     ;将读取的ASCII转化为数值JL       EXIT        ;如果小于30H,则代表不是0~9,直接退出CMP   AL, 09H     ;与09H比较JG       EXIT        ;如果大于09H,则代表输入的不是0~9,直接退出CBW                    ;将AL拓展到AXXCHG   AX, BX      ;将AX中新输入的数与BX中原有的结果交换MOV    CX, 10      ;将乘数存入CX预备MUL   CX          ;将AX中原有的数*10XCHG    AX, BX      ;将*10后的结果与BX交换,ADD  BX, AX      ;将新输入的值加到原有的值上JMP   NEWCHAR     ;输入新字符, 达成循环
EXIT:RET
DECIBIN     ENDP
;******************
BINIHEX     PROC    NEAR    ;负责将10进制转化为16进制并输出MOV   CH, 4
ROTATE: MOV     CL, 4       ;设定ROL的移位次数为4ROL    BX, CL      ;将BX中的数循环左移4位, MSB的4位出现在LSB的4位中MOV  AL, BL      ;将BL转移到AL中用于后头计算AND     AL, 0FH     ;掩码覆盖MSB4位ADD   AL, 30H     ;将数值转化为相应的ASCII码CMP     AL, 3AH     ;检测是否大于9JL      PRINTIT     ;如果大于9,则为A~FADD     AL, 7       ;转化为A~F
PRINTIT:MOV     DL, AL      ;将AL输出MOV   AH, 02HINT  21HDEC  CH          ;循环控制JNZ    ROTATE      ;跳回达成循环, 如果CH==0,则退出循环RET
BINIHEX     ENDP
;******************
CRLF        PROC    NEAR    ;格式控制,输出回车与换行</br>MOV     DL, 0DH     MOV     AH, 02HINT      21HMOV  DL, 0AHMOV  AH, 02HINT      21HRET
CRLF        ENDP
;******************
MAIN    PROC    FAR     ;MAIN主程序PUSH    DS          ;由于是DOS调用Main,所以需要保存寄存器SUB  AX, AXPUSH  AXCALL  DECIBIN     ;执行几个子程序CALL    CRLFCALL    BINIHEXCALL     CRLFRET
MAIN    ENDP
;******************
DECIHEX     ENDSEND     MAIN        ;程序结尾必有的东西

输入16进制输出10进制:

程序框架:

本程序在main中调用各个子程序, 而main与几个子程序定义在同一个代码段中, 所以其他子程序为near

DISPLAY  EQU 2H
KEY_IN      EQU 1H
DOSCALL     EQU 21H
;******************
HEXIDEC     SEGMENT
;******************
MAIN    PROC    FAR     ;MAIN主程序ASSUME  CS: HEXIDEC
START:PUSH  DS          ;由于是DOS调用Main,所以需要保存寄存器SUB  AX, AXPUSH  AXCALL  HEXIBIN     ;执行几个子程序CALL    CRLFCALL    BINIDECCALL     CRLFJMP     MAIN        ;跳回MAIN达成死循环RET
MAIN    ENDP
;*******************
HEXIBIN     PROC    NEAR;输入16进制ASCII字符并转化为16进制数值储存MOV   BX, 0       ;初始化BX
NEWCHAR:MOV     AH, KEY_IN  ;键盘输入INT    DOSCALL
;0~9 ?  SUB     AL, 30H     ;判定输入的值是否在数字之前JL        EXIT        ;ASCII在数字之前, 直接结束循环CMP  AL, 10D     ;判定输入的值是否在数字之后JL        ADD_TO      ;如果小于10,则是0~9
;a~f ?SUB   AL, 27H     ;如果输入大于9,则跳转到字符a开始CMP   AL, 0AH     ;边界值aJL     EXIT        ;ASCII在a~f之前, 直接结束循环CMP     AL, 10H     ;边界值fJGE    EXIT        ;ASCII在a~f之后, 直接结束循环;(BX)<-(BX)*16+(AX)
ADD_TO: MOV     CL, 4       ;设置SHL移位次数SHL   BX, CL      ;逻辑左移MOV    AH, 0       ;AX高位置零ADD  BX, AX      ;将BX左移后空出的4位填入新输入的数值
;完成循环JMP    NEWCHAR     ;输入新字符,直到最后一个不满足条件才跳出
EXIT:RET
HEXIBIN     ENDP
;*********************
;将BX中的数转换为10进制并输出
;按位取并转化为ACSII输出
BINIDEC     PROC    NEARMOV     CX, 10000D  CALL    DEC_DIV     MOV     CX, 1000D   CALL    DEC_DIV     MOV     CX, 100D    CALL    DEC_DIV     MOV     CX, 10D     CALL    DEC_DIV     MOV     CX, 1D      CALL    DEC_DIV     RET
BINIDEC     ENDP
;****************;****************
;被除数        BX
;除数     CX
;商          AX
;余数     DX
DEC_DIV     PROC    NEARMOV     AX, BX          ;将被除数拷贝到AX中执行运算MOV  DX, 0           ;DX初始化DIV   CX              ;除以CX,按位取出BX中的10进制数MOV  BX, DX          ;将余数丢到BX中重新作为除数MOV  DL, AL          ;将商丢到DL中ADD     DL, 30H         ;转化为ASCII数字MOV  AH, DISPLAY     ;召唤DOS显示INT     DOSCALLRET
DEC_DIV     ENDP
;*****************
CRLF        PROC    NEAR    ;格式控制,输出回车与换行</br>MOV     DL, 0DH     MOV     AH, 02HINT      21HMOV  DL, 0AHMOV  AH, 02HINT      21HRET
CRLF        ENDP
;******************
HEXIDEC     ENDS
;******************END  START

ASCII码表:

上机程序分析:

都是之前的程序拼起来的

实验4:

DATA SEGMENTCRLF_STR DB  13,10,'$'X            DW  -1ARRAY_HEAD    DW  5H,10H,18H,22H,2AH,3CH,45H,58HARRAY_END DW  6FHN            DW  ?COUNT      DW  10
DATA    ENDS
;*******************
CODE    SEGMENT
;*******************
MAIN        PROC    FARASSUME   CS:CODE,DS:DATAPUSH     DSSUB   AX, AXPUSH  AXMOV       AX,DATAMOV      DS,AX
;*******************CALL    HEXIBINCALL CRLFCALL    INSERT_ARRCALL  PRINT_ARRMOV        AX,4C00HINT     21H
MAIN    ENDP
;*******************
HEXIBIN PROC    NEAR    ;输入16进制数值并转化为ASCII码MOV      BX,0
NEWCHAR:    MOV     AH,1HINT        21HSUB      AL,30HJL        EXITCMP     AL,10DJL        ADD_TOSUB       AL,27HCMP       AL,0AHJL        EXITCMP     AL,10HJGE       EXIT
ADD_TO:     MOV     CL,4SHL     BX,CLMOV        AH,0ADD     BX,AXJMP        NEWCHAR
EXIT:   RET
HEXIBIN ENDP;*******************
INSERT_ARR  PROC    NEAR    MOV     AX,BX               ;MOV    X,-1                ;执行后(X)=0FFFFHMOV  SI,0                ;初始化下标
COMPARE:CMP     ARRAY_END[SI],AX    ;将array中的数从后往前与N比较JLE   INSERT              ;如果array[si]<N, 则插入NMOV  BX,ARRAY_END[SI]    ;否则将array[si]后移动一位MOV   ARRAY_END[SI+2],BX SUB     SI,2                ;改变下标, array是DW,所以SI-=2JMP     COMPARE             ;跳转达成循环
INSERT:MOV  ARRAY_END[SI+2],AX ;在已经空出的位置插入NRET
INSERT_ARR  ENDP
;*******************
PRINT_ARR   PROC    NEARMOV     CX,COUNTMOV     SI,0
OUTPUT: MOV     BX,ARRAY_HEAD[SI]ADD        SI,2PUSH    CXCALL  BINIHEXMOV      DL,32MOV        AH,2INT     21HPOP      CXDEC       CXJNZ       OUTPUTRET
PRINT_ARR   ENDP
;*******************
BINIHEX     PROC    NEARMOV     CH,4
ROTATE:     MOV     CL,4ROL     BX,CLMOV        AL,BLAND        AL,0FHADD       AL,30HCMP       AL,3AHJL        PRINTITADD      AL,7
PRINTIT:MOV     DL,ALMOV        AH,2INT     21HDEC      CHJNZ       ROTATERET
BINIHEX ENDP
;*******************
CRLF    PROC    NEARMOV     DL, 0DH     MOV     AH, 02HINT      21HMOV  DL, 0AHMOV  AH, 02HINT      21HRETRET
CRLF    ENDP
;*******************
CODE    ENDS
;*******************END MAIN

试卷组成:

填空 & 选择
每个2分, 总共50

程序填空
15空, 30分

编程题
2题10分
都是上课讲过的程序

刷题坑点整合:

80X86的数据储存方式:

80X86的CPU绝大多数是用小端模式进行存储
而ARM绝大多数都是大端存储

小端模式:

将数据的高位放在低字节, 低位放在高字节
取数据时, 向低字节方向进行解析

大端模式:
和小端模式相反

将数据的高位放在高字节, 低位放在低字节
去数据时, 向高字节方向进行解析

所以有如下代码:|

DATA SEGMENTTABLE   DW   10H,20H,30H,40H,50H,60H,70H,80HENTRY      DW   5
DATA    ENDS
;*******************
CODE    SEGMENTASSUME   CS: CODE, DS: DATA
START:MOV   AX, DATAMOV     DS, AX
;*******************MOV     BX, OFFSET  TABLEMOV    CX, 10
RE:MOV      AX, [BX]ADD     BX, 1LOOP   RE
;*******************MOV     AX, 4C00HINT    21H
CODE    ENDS
;*******************END START

每次MOV AX, [BX]后, AX的值为:

0010, 2000, 0020, 3000, 0030, 4000 …

MOV补充:

MOV     [BX],10H     ;MOV实际上不支持这种操作, 但是在编译器中是可以通过的;必须在前头说明地址的数据类型:
MOV     WORD PTR[BX], 1001H ;正确
;因为立即数无类型, 所以需要显式说明

实际上相当于DST为储存器寻址方式, SRC为立即数寻址方式

关于算数指令:

不可以使用立即数的指令:

  • 除法: DIV & IDIV
  • 乘法: MUL & IMUL

而加法和减法都可以使用立即数

关于数值回送操作符:

总之, 滚回去再看, 以为不考, 都忘了

SEG补充:

MOV BX , SEG oper1

其oper1只能是variable或label, 不能是其他的任何东西, 即使使用的是variable或label的地址也不行

如:

MOV  AX, OFFSET ARR
MOV     BX, SEG [AX]    ;还是报错

关于寻址方式:

你以为不会考吗?
滚回去看!

关于双精度数的比较:

首先, 汇编中所有的数都默认当做是有符号数, 即使有无符号完全依靠程序员的解释

所以, 对于有符号双精度数的比较

  • 高位使用有符号的比较法
    LESS & GREATER 系列JMP
  • 低位使用无符号的比较法
    BELOW & ABOVE 系列的JMP

如:

 CMP     DX, BXJL        LABLE1  ;符号位在高字节JG      LABLE2CMP   AX, CXJB        LABLE1  ;低字节相当于无符号位JAE  LABLE2

关于8086寻址:

注意, 之前给出的EA公式不是白给的!

EA(effective address) = 基址 + (变址 * 比例因子) + 位移量

8086几个地址要点:

  1. 最后得到的EA一定要是TMD20位, 否则就TM各种报错!

  2. 段地址一定要使用段寄存器段寄存器, 否则报错
    (包含隐藏的默认使用段寄存器的情况)
    如:

    MOV  1234H:2H, 2 ;报错;而这种方法就OK:
    MOV     AX, 1234H
    MOV     DS, AX
    MOV     DS:2H, 2
    
  3. 除了段寄存器中的段地址, 后头所有的都TM属于偏移地址
    而偏移地址都TM需要一个中括号[]

    而能够出现在中括号之中的, 只有那4个寄存器, 和立即数
    BX, BP, SI, DI, 立即数

    其他任何东西要是出现, 狗腿给你打断

  4. 各种隐含段寄存器的情况:
    主要用作计算物理地址的题

    • 访问指令时:
      默认的段寄存器为CS

    • 访问堆栈时:
      默认的段寄存器为SS

      注意, 当偏移地址中有BP时, 也视作访问堆栈, 其默认寄存器也是SS

    • 访问数据时:
      默认的段寄存器为DS

    • 访问目的串时:
      默认的段寄存器为ES

汇编Ch.5 Ch.6笔记相关推荐

  1. Character.isLetterOrDigit(ch)判断ch是否为字母或数字

    Character.isLetter(ch) 判断ch是否为字母 Character.isDigit(ch) 判断ch是否为数字 Character.isLetterOrDigit(ch) 判断ch是 ...

  2. 福禄克FLUKE DSX2-8000 CH/DSX2-5000 CH产品使用指南

    去年那个炎热的夏天,杨叔陪你一起度过,当你还未完全感受到夏天到来的气息时,杨叔已抢先一步,来到各位福粉的身边,杨叔答应再给你们一个充满着知识的夏天! 本期,我们将为你初步介绍铜缆认证测试仪DSX-50 ...

  3. 福禄克FLUKE DSX-602CH / DSX2-5000 CH  DSX2-8000 CH区别对比

    DSX-602CH / DSX2-5000 CH  DSX2-8000 CH区别对比  功能 DSX-602 Versiv DSX2-5000 Versiv DSX2-8000 说明 Essentia ...

  4. ++ch、ch++和ch+1的区别

    ch+1 //将ch转换成int(ASCII)然后和1相加后输出(隐式类型转换,因为1是int型) ++ch //输出下一个对应的字符(输入A,就输出B) ch++ //代表字符先输出,后加1 #in ...

  5. x86汇编_指令集大全_笔记_6

    汇编指令集太多,如果不用就会忘记,所以将intel处理器官方的指令集整理一下. ------------------------------------------ 一.数据传输指令 -------- ...

  6. win32汇编 屏幕截图保存BMP 学习笔记第三篇之odbg调试

    我们来回顾下raiky code 根据帖子里的讨论错误的疑点在于 1. 对每个像素所占字节的估算可能有误 wBitCount;位图中每个像素所占字节数 简单的赋值4 2. 涉及到后面的调色板的处理 我 ...

  7. 汇编复制字符串小程序笔记

    # 1.定义一个源变量储存被拷贝字符串,一个目标变量储存.其中定义目标变量时利用了DUP(0) { 伪指令DUP(0): 对于:C BYTE A DUP(B) A为数字 B为数据 C为定义的变量 其含 ...

  8. dx 汇编dec_汇编语言期末复习笔记(四)

    第二章 8086的指令系统(上) 写在前面:这一部分开始复习汇编语言程序的指令系统,主要是数据传送类指令和算术运算类指令.如有错误欢迎指正,感谢! 一.数据传送类指令 1.传送指令movmov reg ...

  9. CH 3 CH 2 CH 2 NH 3 Br(PABr )丙基溴化胺 4905-83-3

    丙胺氢溴酸盐名称 中文名 丙胺氢溴酸盐 英文名 propylamine hydrobromide 英文别名 propyl ammonium bromide Propylamine hydrobromi ...

最新文章

  1. 事件流--事件冒泡现象及阻止
  2. vs2013常用快捷键
  3. 开启LeetCode之路
  4. 2020-10-27(原码,反码,补码的产生)
  5. 【Python】Python中对目录路径的要求
  6. HTTP协议中你必须知道的三种数据格式
  7. Kubernetes NetworkPolicy 工作原理浅析
  8. linux ksh教程下载,学习Linux中ksh的用法
  9. idea git 整合使用
  10. HTML5div css入门案例,div+css教学教案(学习入门到精通~)详细讲解.doc
  11. Fragment+ViewPager+ButterKnife时控件会报空指针问题
  12. html标签--使用
  13. 读《我的成功为什么可以复制》——唐骏
  14. 南京邮电大学计算机科学楼,南京邮电大学bbs
  15. 时间序列数据挖掘综述
  16. Linux笔记(70)——文件描述符之ulimit命令
  17. 【转】外连接&全连接的区别
  18. Visual Studio 2017 正式版发布
  19. 2021-11-09 2.bea生命周期和回调及其它注解
  20. link rel=”canonical”标签的用法

热门文章

  1. xmind收费与免费的区别_十年了,我终于想明白免费跟付费的区别
  2. 500块搞定Windows下NAS和高清播放平台
  3. 区块链究竟是如何工作的?
  4. Android 图片添加白边
  5. 文件上传/JS/MIME/黑名单/白名单/htaccess/00截断详解篇[代码审计]
  6. 计算机用word做海报,用Word设计制作广告海报实验.doc
  7. tomcat启动项目时一直卡住无反应的解决方案
  8. Java语言制作动画
  9. java经纬度凸包graham_凸包算法(Graham扫描法)详解
  10. 如何使用思岚robostudio进行地图优化?