汇编语言简介

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hello, World! (cont.)



每次打印字符串都需要自己写显存,过 于繁琐 像C runtime 提供puts(), 我们能否实现 一个函数 void puts(int posx, int posy, const char*)
函数调用

在程序运行中,CPU需要知道指令执行的 位置

参数传递

使用stack进行参数传递

ref:USTC_1.ppt
Hello, World! (cont.)

Reverse using stack and call
END of this Section

我们完成了一个简单的汇编HelloWorld 请大家自行阅读王爽《汇编语言》
吐血推荐!
函数调用就是改变指令执行位置,实现 跳转

函数调用 (cont.)

如何跳转?

我们有jmp
;puts(x, y, str) ;action1 jmp puts puts: ;;action

可以使用寄存器传递我们的参数
函数调用 (cont.)
data segment msg db „Hello, World‟,0 data ends code segment start: mov ax,data mov ds,ax mov ax,160 mov si,0 ;ax-pos, ds:si-str puts: mov di,ax mov ax,0B800h mov es,ax L1: mov byte ptr bl,ds:[si] cmp bl,0 je L2 mov byte ptr es:[di],bl inc si add di,2 jmp L1 L2: jmp bef

改变ds值

mov ax,0b800h mov ds,ax
IBM PC VGA

Video Mode
The most used VGA video mode for a text UI is text mode, or mode 0. This is the most commonly used, as it allows direct memory access to a linear address containing each character and it's associated attributes. Text mode 0 provides a text interface 80 characters wide and 25 characters lines per screen.
IBM PC VGA (cont.)

Video Memory
In text mode 0, the linear text buffer is located in physical at 0xB8000. Reading and writing to and from this address will provide direct manipulation of on screen text. To access a particular character on the screen from X and Y coordinates is simple using the following formula: position = (y_position * characters_per_line) + x_position; Each character takes up two bytes of space in memory. The first byte is split into two segments, the forecolour, and the backcolour. The second byte is an 8-bit ASCII value of the character to print.
mov bl, 0 cmp al, bl jne L1 ;;;;;
L1: ;;;;;
;;斜体部分不执行
Hello, World! (cont.)

循环

如何使用条件分支实现循环??? 看看编译器是怎么翻译的。。。 loop

Hello, World! (cont.)

assume cs:code,ds:data data segment msg “Hello, World!”, 0 data ends code segment start:
C语言的几种条件、分支 if(exp) action; action; action;
while(exp)
for (exp1; exp2; exp3)
Hello, World! (cont.)


cmp 指令 比较两个操作数的值=>flags mov al, „H‟ 条件跳转

根据cmp比较结果进行跳转

函数调用 (cont.)

call


当call指令发生时,cpu保存当前执行指令位 置,跳转到指定地点 call func相当于 push cs:ip jmp func
函数调用 (cont.)

ret

用于函数返回。CPU从stack取出cs:ip完成 返回
改进Hello, World
函数调用 (cont.)

Base = segreg*16
内存访问(cont.)

Segment Registers

DS、ES我们可以用来访存 CS、SS分别用作代码段、堆栈段
内存访问(cont.)

使用DS访问内存

ds:[add]

Ds*16+add

Mov ax,ds:[10] ds=B800h
将位于B800h*16+10=0xB800A处16bit数据读入 ax

16 bit
Main Register

可分为两个8bit Reg X86中

8bit =1 byte(字节) 2 bytes = 1 word(字) 4 bytes = 1 dword(双字)
寄存器 Register (cont.)


寄存器赋值操作 mov ax,1 mov bx,ax 算术操作 add ax,bx sub ax,bx
ALU
CU

对寄存器操作 内存访问 算术、逻辑运算 条件控制
寄存器 Register

CPU内 可存放数据
Intel 8086 Register
Intel 8086 Register (cont.)
寄存器 Register (cont.)

我们先关注Main Reg(通用寄存器)
Debug.exe (cont.)

使用a输入指令并执行
内存访问

8086 地址线 20bit

可编址范围 0-0xFFFFF

寄存器16bit 如何使用16bit寄存器表示20bit地址?
内存访问(cቤተ መጻሕፍቲ ባይዱnt.)

分段

段寄存器

使用一个寄存器存储基地址,一个寄存器存 储偏移地址 8086约定的段寄存器表示的基地址
bef:
jmp puts
mov ax,4c00h int 21h code ends end start
;exit 0
函数调用 (cont.)

stack X86体系使用stack提供对函数调用支持 ss:sp 将内存用作stack,用来保存参数、 函数地址等信息 ref:USTC_1.ppt push pop
汇编语言简介
董千里 Email:Olin.Dung@gmail.com
软件与微电子学院科协C\C++小组
讲课之前
History


机器语言 机器指令集合 一系列0、1二进制组合,转换为高低 电平,驱动计算机电子器件进行运算 有什么优点、有什么缺点?

难于记忆、编写、查错
为什么学习汇编?

je (jmp equal) ja (jmp above) jna (jmp not above) …
mov bl, 0 cmp al, bl jne L1 ;;;;; L1: ;;;;;
Hello, World! (cont.)

无条件跳转 jmp
mov al, „H‟ jmp L1
IBM PC VGA (cont.)

Colours
现在我们往屏幕打印文字!
Hello, World!
assume cs:code,ds:data data segment data ends 程序总体思路 将文字ASCII写入0xB8000h区域 使用哪些寄存器,如何访存?
;data goes here

Hello, World! (cont.)

改进版本

将字符串复制
char msg[] = “Hello, World”; int i = 0; while (msg[i]) //汇编语言如何实现循环? { //mov msg[i] to video buffer } i++;
Hello, World! (cont.)
Typical use

操作系统

FFMpeg中内联汇编使用MMX指令
bootloader、driver

逆向工程 游戏、多媒体

使用Intel MMX、SSE series指令集、AMD 3DNOW

将机器码映射为助记符

将机器码映射为助记符
Assembler
计算机体系结构
RAM
Register
„H‟
B800:0
0
B800:1
B800:2 B800:3 B800:4 B800:5
Reversed version
13DF:0 Hello…
„e‟ 0 „l‟ 0
;code goes here ;exit 0
B800:0
mov ax,4c00h int 21h code ends end start
mov $1, %ax mov ax,1
movw %ax, %ds:8(%bx,%si,1) mov word ptr ds:[bx+si+8],ax
Some books

见本页批注
号外:AT&T汇编

AT&T汇编语言和Intel汇编语言



AT&T汇编语言中指令的操作数顺序与Intel相反 AT&T opcode[b+w+l] src, dest 寄存器:%reg 立即数 $num 访存大小:[b+w+l] - 8, 16, 32 bits 引用内存地址:section:immed(base, index, scale) 实际偏移:[base + index*scale + immed]
ax = 1 bx = ax ax += bx ax -= bx
现在我们可以写一些简单的计算程序
Debug.exe

在“开始->运行”中启动debug
Debug.exe (cont.)

一些debug命令



A 以汇编形式将机器指令写入内存 T 单步执行 U 反汇编内存 D 查看内存内容 R 查改寄存器 E 改写内存
code segment start:
;code goes here ;exit 0
mov ax,4c00h int 21h
code ends end start
Hello, World! (cont.)

MASM (Microsoft Assembler)
C:\>masm hello.asm; C:\>link hello.obj; C:\>hello.exe 分号(;)使用默认名称
相关文档
最新文档