汇编学习--第三天

4.1 一个源程序从写出到执行的过程

汇编语言源程序包含两种指令:

  • 1.汇编指令
  • 2.伪指令

汇编指令会被编译为机器指令,被CPU执行

伪指令不会,会被编译器执行

assume cs:codesg
codesg segment
        mov ax,0123h
        mov bx,0456h
        add ax,bx
        add ax,ax

        mov ax,4c00h
        int 21h

codesg ends
end

segment和ends的作用是定义一个段

codesg segment ;定义一个名叫codesg段的开始

codesg ends ;“codesg”段结束

end伪指令标记整个程序的结束

assume将有特定用途的段和相关的段寄存器关联起来

程序最先以汇编指令的形式存在源程序中,经编译,连接后转变为机器码,储存在可执行文件中。

“codesg”为标号,最终将被编译,连接为一个段的地址

mov ax,4100h
int 21h

所实现的功能就是程序返回

问题4.1

DOS中直接直接执行test.exe,是正在运行的command,将test.exe中的程序加载进内存

command设置CPU的CS:IP指向程序的第一条指令,从而使程序运行

程序运行结束之后,返回到command,CPU继续执行command

command程序在DOS中称为命令解释器

debug中调试程序时,cx中存储的是程序长度

PSP是程序段前缀

ds的地址即PSP的地址,DS=129E,则PSP=129E:0,所以程序的地址为129E+10:0=12AE:0=CS:IP

实验3 编程,编译连接,跟踪

(1)(2)

(3)

第五章 [BX]和loop指令

完整描述一个内存单元:1.内存单元的地址 2.内存单元的长度

用“()”表示一个寄存器或者一个内存单元中的内容

“()”可以有:1.寄存器名  2.段寄存器名 3.内存单元的物理地址

idata表示常量

mov ax,[idata] =  mov ax,[1]     mov ax,[4]...    ;合法
mov ax,idata = mov ax,1    mov ax,2...        ;合法
mov ds,idata = mov ds,1...        ;非法

问题 5.1

21000H BE
21001H 00
21002H BE
21003H 00
21004H BE
21005H BE
21006H BE
21007H  

inc 表示寄存器中的内容加1


5.2 Loop指令

计算2^2

assume cs:code
code segment
        mov ax,2
        add ax,ax

        mov ax,4c00h
        int 21h
code ends
end

计算2^10=0400h=1024

assume cs:code
code segment
        mov ax,2
        mov cx,9
s:        add ax,ax
        loop s

        mov ax,4c00h
        int 21h
code ends
end

s为标号,标号代表一个地址

执行loop s进行:

  • 1.(cx) = (cx) - 1;
  • 2.判断cx中值是否为0,不为0跳转标号处执行,为0接着执行下一句指令

问题 5.2

assume cs:code
code segment
        mov ax,0
        mov cx,236
s:        add ax,123
        loop s

        mov ax,4c00h
        int 21h
code ends
end

问题 5.3

assume cs:code
code segment
        mov ax,0
        mov cx,123
s:        add ax,236
        loop s

        mov ax,4c00h
        int 21h
code ends
end

原文地址:https://www.cnblogs.com/Mayfly-nymph/p/11055443.html

时间: 2024-09-29 02:57:00

汇编学习--第三天的相关文章

汇编学习第三章

在第三章的学习中,我们开始更深入地学习寄存器. (一)字在内存中的存储与内存单元地址   在第二章中,我们了解到,在CPU中,用16位寄存器来存储一个字,但是由于内存单元是字节单元(即在一个单元内只能存放一个字节),所以一个字要用两个内存单元来存放.举个例子,我们用0.1两个单元来存放数据4E20H,0号单元为低地址单元,1号为高地址单元单元,分别存放它的低位.高位数据.由此,我们提出字单元的概念:由两个地址连续的内存单元组成,用来存放一个16位数据的内存单元.,一般我们将起始地址为N的字单元简

AT&T汇编学习笔记

AT&T汇编和intel汇编的区别 (1)在Intel格式中大多使用大写字母,而在AT&T格式中都是用小写字母. (2)在AT&T格式中,寄存器名要加上"%"作为前缀,而在intel格式中则不带前缀. (3)在AT&T的386汇编语言中,指令的源操作数与目标操作数的顺序与在intel的386汇编语言中正好相反.在intel格式中是目标在前,源在后:而在AT&T格式中则是源在前,目标在后.例如,将寄存器eax的内容送入ebx,在intel格式中为&

加壳学习笔记(三)-简单的脱壳思路&调试思路

首先一些windows的常用API: GetWindowTextA:以ASCII的形式的输入框 GetWindowTextW:以Unicaode宽字符的输入框 GetDlgItemTextA:以ASCII的形式的输入框 GetDlgItemTextW:以Unicaode宽字符的输入框 这些函数在使用的时候会有些参数提前入栈,如这函数要求的参数是字符串数目.还有大小写啦之类的东西,这些东西是要在调用该函数之前入栈,也就是依次push,就是说一般前面几个push接着一个call,那前面的push可能

AT&T汇编学习笔记(一)

file命令使用介绍 file最常用的场景就是用来查看可执行文件的运行环境,是arm呢,还是x86呢,还是mips呢?一看便知 $ file a.out a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xa240b1958136fc294a6ee5833de2a0fc8c9e

汇编学习环境搭建

一 系统环境 win10 pro x86 masm 5.0 下载地址:http://download.pchome.net/development/linetools/detail-9028.html 二 编译环境搭建 1 将masm 5.0 下载下来,这个是免安装版的, 解压缩, 将MASM.EXE所在的目录添加到环境变量path里面. 2 使用方法 <1> 在cmd窗口(注意这个cmd跟下面的command不是一个东西)输入"masm 汇编源码文件;", 回车, 如果编

我的汇编学习之路(2):主要术语和概念

对于不折不扣的汇编新手来说,第一部分中出现的很多概念可能不是很明白,于是我决定写更多有价值的文章.所以,让我们开始<我的汇编学习之路>的第二部分的学习. 术语和概念 当我写了第一篇之后,我从不同的读者那获得很多反馈,第一篇中有些部分不明白,这就是本文以及接下来几篇从一些术语的描述开始的原因. 寄存器(Register):寄存器是处理器内小容量的存储结构,处理器的主要功能是数据处理,处理器可以从内存中获得数据,但这是一种低速的操作,这就是为什么处理器为什么要有自己数据存储结构,称为"寄

Arm汇编学习总结

 Arm汇编学习总结: 1. LDR/STR架构 1).ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理. 2).ldr(load register)指令将内存内容加载入通用寄存器. 3).str(store register)指令将寄存器内容存入内存空间中. 4).ldr/str组合用来实现 ARM CPU和内存数据交换. 3级流水线如图所示(PC为程序计数器),流水线使用3个阶段,因此指令分3个阶段执行. ⑴ 取指从存储器装载

linux学习第三周总结

linux学习第三周总结 学习linux的第三周,也是惊喜最多的一周,让我看到学linux并不是很枯燥,相反非常有趣,可玩性很多,但越深入越觉得可学习的地方有很多,也有非常多的不足,所以革命尚未成功,同志更需努力 同样来简单终结一下本周的重点,内容比较多,说要简单提一下,不做详解 一.shell脚本编程基础 内容:1. 编程基础 2. 脚本基本格式3. 变量4.运算5.条件测试6.条件判断if 7.条件判断case 8.配置用户环境 shell脚本:包含一些命令或声明,并符合一定格式的文本文件

基于8086CPU微处理器的汇编学习之MOV指令

汇编指令:MOV的作用是往某个寄存器中存入数值. 格式:mov  寄存器名,数值                数值-->寄存器 mov  寄存器A,存器寄B          B-->A PS:必须前后位数匹配,如: mov   ah,bx     ;error   ah is 8 bit,bx is 16 bit mov   ah, bh    ;right    ah and bh all is 8  bit mov   cx,dx     ;right     cx and dx al