ASM16-21 --函数(补充)和中断指令
ASM16函数123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103MyStack segment stack db 256 dup(?)MyStack endsMyData segmentMY_MSG1 db "Hello World1!",0dh,0ah,'$'MY_MSG2 db "Hello World2!",0dh,0ah,'$'MyData endsMyCode2 segment call far ptr MY_SUBMY_SUB: push bp mov bp,sp ;保存栈底 mov ax,[bp+6] ...
ASM16-20 --花指令
ASM16花指令1234567891011121314151617181920212223242526MyStack segment stack db 256 dup(?)MyStack endsMyData segmentMY_MSG db "Hello World!",0dh,0ah,'$'MyData endsMyCode segmentMAIN: mov ax,MyData mov ds,ax mov es,ax jmp LABEL1 db 0b8h ;花指令LABEL1: mov dx,offset MY_MSG mov ah,09h int 21h mov ax,4c00h int 21hMyCode endsend MAIN
从B8开始下面全部的代码都会出错 但是运行的结果是不变的 只不过反汇编代码分析时会被干扰(实现代码加密)
找到花指令 写入一条机器码 从正确的地方开始分析 即可获得正确的代码
子程序重复利用代码段
12345678910111213141 ...
ASM16-19 --通讯录
ASM16通讯录处理菜单选项1234567891011cmp al,'1'jz ADD1cmp al,'2'jz DELETE1cmp al,'3'jz MODIFY1cmp al,'4'jz QUERY1cmp al,'5'jz EXIT1jmp DEFAULT1
根据用户输入的选项跳转到对应的处理代码段。如果输入无效,跳转到DEFAULT1处理。
添加联系人123mov dx, offset NEXT_LINE mov ah, 09h int 21h
然后换行
1234ADD1: ;增加联系人 mov dx,offset INPUT_NAME mov ah,09h int 21h
提示输入联系人姓名。
09h - 显示字符串
功能描述:显示从DX寄存器指向的内存地址开始的字符串,直到遇到字符串结束符号$为止。
输入:
DX:指向要显示的字符串的地址
AH:09h
输出:将字符串显示在屏幕上
123mov dx,offset NAME_BUFmo ...
ASM16-16~18 --BCD码调整指令和控制类转移指令
ASM16BCD码加、减调整指令BCD调整指令主要有四种(乘法和除法的不做要求):DAA压缩型BCD数加法调整指令AAA非圧缩型BCD数加法调整指令
DAS压缩型BCD数减法调整指令AAS非圧缩型BCD数减法调整指令
123456789101112131415161718192021(ADD AL,i8/r8/m8)(ADC AL,i8/r8/m8)AAA; AL<-将AL的加和调整为非压缩码BCD码; AH<-AH+调整的进位(SUB AL,i8/r8/m8)(SBB AL,i8/r8/m8)AAS; AL<-将AL的减差调整为非压缩BCD码;AH<-AH - 调整的借位(ADD AL,i8/r8/m8)(ADC AL,i8/r8/m8)DAA; AL<-将AL的加和调整为压缩BCD码 (SUB AL,i8/r8/m8) (SBB AL,i8/r8/m8) DAS ; AL<-将AL的减差调整为压缩BCD码
使用AAA或AAS指令前,应先执行以AL为目的操作数的加法或减法指令
AAA和AAS指令在调整中产生了进位或错位,则AH要加上进位或 ...
ASM16-14 --算术运算类指令
ASM16算术运算类指令
四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算
请注意算术运算类指令对标志的影响
掌握:ADD/ADC/INC、SUB/SBB/DEC/NEG/CMP
熟悉:MUL/IMUL、DIV/IDIV
理解:CBW/CWD、DAA/DAS、AAA/AAS/AAM/AAD
加法指令ADD
ADD指令将源与目的操作数相加,结果送到目的操作数
ADD指令按状态标志的定义相应设置
12345678ADD reg,imm/reg/mem ; reg<-reg+imm/reg/memADD mem,imm/reg ; mem<-mem+imm/reg mov ax,1mov bx,2add ax,bx
带进位加法指令ADC
ADC指令将源与目的操作数相加,再加上进位CF标志结果送到目的操作数
ADC指令按状态标志的定义相应设置
ADC指令主要与ADD配合,实现多精度加 ...
ASM16-13 --数据传送类指令
ASM16数据传送类指令
数据传送是计算机中最基本、最重要的一种操作
传送指令也是最常使用的一类指令
传送指令把数据从一个位置传送到另一个位置
除标志寄存器传送指令外,均不影响标志位
重点掌握 MOV XCHG XLAT PUSH POP LEA
通用数据传送指令
提供方便灵活的通用传送操作
有3条指令 MOV XCHG XLAT
传送指令MOV
把一个字节或字的操作数从源地址传送至目的地址
1234MOV reg/mem,imm ;立即数送寄存器或主存MOV reg/mem/seg,reg ;寄存器送(段)寄存器或主存MOV reg/seg,mem ;主存送(段)寄存器MOV reg/mem,seg ;段寄存器送寄存器或主存
非法传送
两个操作数的类型不一致
例如源操作数是字节,而目的操作数是字;或相反
两个操作数不能都是存储器
传送指令很灵活,但主存之间的直接传送却不允许
段寄存器的操作有一些限制
段寄存器属专用寄存器,对他们的操作能力有限
两个操作数的类型要一致
绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须一致,否则为非法指令
1MOV ...
ASM16-12 --键盘输入并回显
ASM16键盘输入并回显把01传给AH,则可以实现键盘输入并回显,如果输入成功则AL为输入的字符
12345678910111213141516171819202122232425262728MyStack segment stack ;stack表明是堆栈段,则之后系统给地址会从大到小,而且系统会自动把该段的基址送入ss寄存器 db 256 dup(?)MyStack endsMyData segment ;数据段 db 03,04,05,06 string db "Hello World$"MyData endsMyCode segment ;代码段start: ;告诉编译器代码从此处开始 mov ax,MyData ;获取段基址 mov ds,ax ;将段基址送入寄存器 mov es,ax ;键盘输入并回显 mov ah,01 int 21h mov dx,o ...
ASM16-11 --hello world(asm)
ASM16创建一个hello world的程序
123456789101112131415161718192021222324MyStack segment stack ;stack表明是堆栈段,则之后系统给地址会从大到小,而且系统会自动把该段的基址送入ss寄存器 db 256 dup(?)MyStack endsMyData segment ;数据段 db 03,04,05,06 string db "Hello World!$"MyData endsMyCode segment ;代码段start: ;告诉编译器代码从此处开始 mov ax,MyData ;获取段基址 mov ds,ax ;将段基址送入寄存器 mov es,ax mov dx,offset string ;==>mov dx,word ptr[0]==>mov dx,0 ;获取hello world ...
ASM16-8~10 --寻址方式
ASM16x86指令编码(硬编码)的结构
opcode最少1个字节,最多3个字节。
opcode是指令中最重要的组成部分。
前缀指令只能影响自己,而opcode、ModR/M、SIB决定了整条指令的长度。
有没有ModR/M是由opcode决定的,有没有SIB是由ModR/M决定的。
指令长度:
变长指令 复杂指令集 (intel amd):仅仅通过opcode是没有办法确定长度的。
定长指令 精简指令集 (arm):它的长度永远没有变化,只要opcode的长度确定了,那么它的长度就确定了。
精简指令集:
这种 CPU 的设计中,微指令集较为精简,每个指令的运行时间都很短,完成的动作也很单纯,指令的执行效能较佳; 但是若要做复杂的事情,就要由多个指令来完成。
复杂指令集:
与精简指令集不同的,CISC复杂指令集在微指令集的每个小指令可以执行一些较低阶的硬件操作,指令数目多而且复杂, 每条指令的长度并不相同。因为指令执行较为复杂所以每条指令花费的时间较长, 但每条个别指令可以处理的工作较为丰富。
比较:
CPU架构
特性 ...
ASM16-7 --存储器组织与段寄存器
ASM16存储器组织与段寄存器
寄存器是微处理器内部暂存数据的存储单元,以名称表示
存储器则是微处理器外部存放程序及其数据的空间
程序及其数据可以长久存放在外存,在程序需要时才进入主存
主存需要利用地址区别
数据信息的表达单位
计算机中信息的单位
二进制位Bit:存储一位二进制数:0或1
字节Byte:8个二进制位,D7~D0
字Word:16位,2个字节,D15~D0
双字DWord:32位,4个字节,D31~D0
最低有效位LSB:数据的最低位,D0位
最高有效位MSB:数据的最高位,对应字节、字、双字分别指D7、D15、D31位
存储单位及其存储内容
每个存储单元都有一个编号,被称为存储器地址
每个存储单位存放一个字节的内容
多字节数据存放方式
多字节数据在存储器中占连续的多个存储单元:
存放时,低字节存入低地址,高字节存入高地址;
表达时,用它的低地址表示多字节数据占据的地址空间。
80x86处理器采用“低对低、高对高”的存储形式,被称为“小端方式Little Endian”
相对应还存在“大端方式Big Endian”
数据的地址对齐
...