标签:显示 height x86汇编 情况 汇编 观察 命令 因此 内容
使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。源代码如下:
1 ;ex1.asm 2 assume cs:code 3 code segment 4 mov ax, 0b810h 5 mov ds, ax 6 mov byte ptr ds:[0], 1 7 mov byte ptr ds:[1], 1 8 mov byte ptr ds:[2], 2 9 mov byte ptr ds:[3], 2 10 mov byte ptr ds:[4], 3 11 mov byte ptr ds:[5], 3 12 mov byte ptr ds:[6], 4 13 mov byte ptr ds:[7], 4 14 mov ah, 4ch 15 int 21h 16 code ends 17 end
要求:
使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果。
使用任意一款文本编辑器,编写8086汇编源程序ex2.asm。源代码如下:
1 ; ex2.asm 2 assume cs:code 3 code segment 4 mov ax, 0b810h 5 mov ds, ax 6 mov bx, 0 7 mov ax, 101H 8 mov cx, 4 9 s: mov [bx], ax 10 add bx, 2 11 add ax, 101H 12 loop s 13 mov ah, 4ch 14 int 21h 15 code ends 16 end
要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex2.asm进行汇编、链接、运行,使用debug工具调试可执行文件。
注意:单步调试时,对于循环指令loop, 中断指令int,使用t命令和p命令单步调试的区别。
综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H。
要求:
如程序编写正确,预期结果如图所示。(运行前先使用 命令清屏,更便于观察运行结果)
把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
Tips:
这道练习,本质上就是把一组连续的字节数据(常数),送到指定的连续的字节单元。如果利用栈实现,借助push和loop实现连续入栈操作。需要注意:
教材实验4(3)(P121)
Tips: 这道练习,本质仍然是复制,只不过复制的是自身代码。填空的关键是,如何确定复制多少字节。
在linux环境下,编写、汇编、运行、调试一个32位的Intel风格的x86汇编程序。
第1步,使用vim或其它任意文本编辑器,编写一个32位的Intel风格的x86汇编源程序example.asm。
1 ; example.asm 2 glogal _start 3 section .data 4 msg db "a simple test", 0xa len equ $ - msg 5 section .text _start: 6 mov eax, 4 7 mov ebx, 1 8 mov ecx, msg 9 mov edx, len 10 int 0x80 ; 调用linux下的int 0x80中断的4号子功能,输出字符串 11 mov eax, 1 12 mov ebx, 0 13 int 0x80 ; 调用linux下的int 0x80中断的1号子功能,退出
第2步,使用nasm,对example.asm进行汇编。
nasm -f elf32 example.asm
如汇编成功,会生成目标文件example.o。执行nasm命令后,可以使用 ls 命令查看。
如果希望将来使用gdb工具对可执行文件进行调试,则使用nasm汇编时还需要增加一个选项 -g ,目的 是向目标文件中增加符号和调试的相关信息。即:
nasm -f elf32 example.asm -g
第3步,使用ld,对example.o进行链接。
ld -m elf_i386 example.o -o example
如链接成功,会生成可执行文件example。
第4步,执行可执行文件example。
./example
执行后,可以在shell命令终端查看返回值:
echo $?
显示返回值0,对应源码文件中line18寄存器ebx的值。
把example.asm中line18行中寄存器ebx的值改成别的数值,比如7。重新汇编、链接、运行。再次使用 echo $? 查看返回值,观察这次返回值是什么。
注*:
1. 汇编指令与硬件相关,因此,指令集有x86的汇编指令集,也有MIPS汇编指令集;书写风格既有intel 风格,也有AT&T风格。linux下默认是AT&T风格的。此外,可用的工具也种类繁多。这里仅列出一个简单示例,请根据个人情况自行探索实践。
2. 使用gdb调试时,也需要掌握类似于debug下很多命令,比如list(查看代码)、b(break, 设置断点)、 r(run, 运行)、查看寄存器(info registers),等等。这里没有进一步提供使用gdb调试的方法和步骤。请自行检索相关工具文档,辅助尝试。
ex1.asm源代码:
使用masm、link工具汇编、链接的命令行及运行结果
使用debug调试,查看PSP的命令
可执行文件加载后寄存器CX的值为0031H,使用u命令精确反汇编
使用g命令执行到line16退出执行之前
ex2.asm源代码:
使用masm、link工具汇编、链接的命令行及运行结果
使用debug调试,可执行文件加载后寄存器CX的值为001CH,使用u命令精确反汇编
灵活使用t命令/p命令、g命令,对ex2.exe进行调试
使用g指令跳过循环
继续单步执行
使用p指令结束程序
结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?
标签:显示 height x86汇编 情况 汇编 观察 命令 因此 内容
原文地址:https://www.cnblogs.com/huakuidehuakui/p/13899665.html