导读
通过一种常用的、结构简洁的微处理器的汇编语言来进行学习,达到学习汇编的两个最根本的目的:充分获得底层编程的体验,深刻理解机器运行程序的机理。
01 学习环境安装
1.虚拟机安装dos系统
virtualbox+dos.iso
一个缺点是,有的软件不一定全,比如masm.exe没有这个命令。
需要打包一个 iso文件,挂载,把这个软件copy进去。
苹果打iso命令hdiutil makehybrid -o masm.iso ./mas
2.直接使用dosbox
缺什么就挂载到对应的磁盘下就行
书上的源码是可以通过这里下载:
http://www.tup.tsinghua.edu.cn/booksCenter/book_07970801.html#
还有一个汇编语言的论坛:
http://www.asmedu.net/bbs/forum.jsp
02 一个简单的程序
assume cs:code,ds:data,ss:stack
data segment
db 'hello world'
db 16 dup(0)
data ends
stack segment
db 32 dup(0)
stack ends
code segment
start: mov ax, data
mov ds, ax
call strlen ; 字符串长度,执行完 bx 是 0BH,也就是11
call strtoupper ; 字符串转成成大写 放到 db
call strrev ; 字符串翻转
mov ax,4c00h
int 21h
strlen: mov bx, 0
s: mov al, ds:[bx]
cmp al, 0
jne next
ret
next: inc bx
loop s
strtoupper: mov cx, bx
mov si, 0
s1: mov dl, byte ptr [si]
cmp dl, 65 ; 如果大于等于 65 ,65是大写字母A,也就是不是字母不处理。
ja next1
ss1: mov byte ptr [16+si], dl
inc si
loop s1
ret
next1: and dl,11011111b
jmp ss1
strrev: mov ax, stack
ss, ax
mov es,ax
mov cx, bx
mov di, bx
bx, 1
sp, bx
mov si, 0
mov bx, data
mov ds, bx
mov bx, 16
s2: mov al, ds:[bx+si]
ah, 0
mov es:[di], al
ax
inc si
dec di
loop s2
ret
code ends
end start
其中 伪指令(assume、end 、segment 跟 ends是成对出现的伪指令)、汇编指令、标号(code、data、s1)
debug 常用的指令的放到下面列表:
参考链接:
https://thestarman.pcministry.com/asm/debug/debug.htm
https://blog.csdn.net/weixin_43809545/article/details/103640185
03 通用的寄存器
8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW
04 指令分类
05 程序是如何执行的
物理地址=段地址x16+偏移地址
参考书本page25
程序的可用段地址和偏移地址表示为:SA+10H:0 (page 92)
参考书本page92
06 数据寻址与访问
8086CPU可以处理两种尺寸数据,byte(字节)和word(字)。
在没有寄存器参与的内存单元访问指令中,用word ptr或byte ptr显性指明所要访问的内存单元长度是很有必要的。
扫描下方二维码添加「好未来技术」微信官方账号
进入好未来技术官方交流群与作者实时互动~
(若扫码无效,可通过微信号TAL-111111直接添加)
- 也许你还想看 -