《汇编语言 基于x86处理器》第十一章 MS-DOS 编程部分的代码 part 2
▶ 书中第十一章的程序,主要讲了 Windows 接口,在小黑框中进行程序交互
● 在屏幕指定位置输出带自定义属性的文字
INCLUDE Irvine32.inc .data
outHandle HANDLE ?
cellsWritten DWORD ? ; 输出计数(输出参数)
xyPos COORD <,> ; 输出坐标
buffer BYTE 41h,42h,43h,44h,45h,46h,47h,48h,49h,4Ah,4Bh,4Ch,4Dh,4Eh,4Fh,50h,51h,52h,53h,54h
BufSize DWORD ($ - buffer)
attributes WORD 1h,2h,3h,4h,5h,6h,7h,8h,9h,0Ah,0Bh,0Ch,0Dh,0Eh,0Fh,10h,,12h,13h,14h .code
main PROC
INVOKE GetStdHandle, STD_OUTPUT_HANDLE
mov outHandle, eax
INVOKE WriteConsoleOutputAttribute, outHandle, ADDR attributes, BufSize, xyPos, ADDR cellsWritten ; 设置输出属性
INVOKE WriteConsoleOutputCharacter, outHandle, ADDR buffer, BufSize, xyPos, ADDR cellsWritten ; 输出 call ReadChar
;call WaitMsg ; 与 ReadChar 等效
exit
main ENDP
END main
● 动态内存分配 1
INCLUDE Irvine32.inc .data
ARRAY_SIZE = ; 要申请的数组尺寸
FILL_VAL EQU 0FFh ; 数组填充的值 hHeap DWORD ?
pArray DWORD ? ; 堆内存指针
str1 BYTE "Heap size is: ", .code
main PROC
INVOKE GetProcessHeap ; 获取堆内存的指针
.IF eax == NULL
call WriteWindowsMsg
jmp quit
.ELSE
mov hHeap, eax
.ENDIF call allocate_array
jnc arrayOk ; 申请成功 CF = 0,失败 CF = 1
call WriteWindowsMsg
call Crlf
jmp quit arrayOk: ; 填充和输出数组
call fill_array
call display_array
call Crlf INVOKE HeapFree, hHeap, , pArray ; 释放申请的内存 quit:
call WaitMsg
exit
main ENDP allocate_array PROC USES eax ; 申请堆内存
INVOKE HeapAlloc, hHeap, HEAP_ZERO_MEMORY, ARRAY_SIZE .IF eax == NULL
stc ; 申请失败,置 CF = 1
.ELSE
mov pArray,eax ; 申请成功,保存内存指针,置 CF = 0
clc
.ENDIF ret
allocate_array ENDP fill_array PROC USES ecx edx esi
mov ecx, ARRAY_SIZE
mov esi, pArray L1:
mov BYTE PTR [esi], FILL_VAL
inc esi
loop L1 ret
fill_array ENDP display_array PROC USES eax ebx ecx esi
mov ecx, ARRAY_SIZE
mov esi, pArray L1:
mov al, [esi]
mov ebx, TYPE BYTE
call WriteHexB
inc esi
loop L1 ret
display_array ENDP END main
● 动态内存分配 2,申请多个内存堆,直到溢出
INCLUDE Irvine32.inc .data
HEAP_START = ; 2 MB
HEAP_MAX = ; 400 MB
BLOCK_SIZE = ; .5 MB hHeap DWORD ?
pData DWORD ? str1 BYTE 0dh,0ah,"Memory allocation failed",0dh,0ah, .code
main PROC
INVOKE HeapCreate, ,HEAP_START, HEAP_MAX .IF eax == NULL ; 申请失败
call WriteWindowsMsg
call Crlf
jmp quit
.ELSE ; 申请成功
mov hHeap, eax
.ENDIF mov ecx, L1:
call allocate_block ; 申请内存堆
.IF Carry? ; 失败
mov edx,OFFSET str1
call WriteString
jmp quit
.ELSE ; 成功,
mov al,'.' ; 输出一个点
call WriteChar ; 显示进度
.ENDIF ;call free_block ; 是否把刚申请的堆释放掉
loop L1 quit:
INVOKE HeapDestroy, hHeap ; 释放掉所有的堆
.IF eax == NULL ; 失败则显示信息
call WriteWindowsMsg
call Crlf
.ENDIF exit
main ENDP allocate_block PROC USES ecx
INVOKE HeapAlloc, hHeap, HEAP_ZERO_MEMORY, BLOCK_SIZE .IF eax == NULL
stc ; 失败,置 CF = 1
.ELSE
mov pData,eax ; 成功,指针保存到 eax
clc ; 置 CF = 0
.ENDIF ret
allocate_block ENDP free_block PROC USES ecx
INVOKE HeapFree, hHeap, , pData
ret
free_block ENDP END main
● 文件读写(有点问题,尚未完成)
INCLUDE Irvine32.inc
INCLUDE macros.inc BUFFER_SIZE = .data
buffer BYTE "abcdef",
filename BYTE "output.txt",
fileHandle HANDLE ?
stringLength DWORD ?
bytesWritten DWORD ? .code
main PROC mov edx, OFFSET filename
call CreateOutputFile
mov fileHandle, eax
cmp eax, INVALID_HANDLE_VALUE ; 错误检查
jne file_ok1
mWrite <"Failed to create output file",0dh,0ah>
jmp quit file_ok1:
mov eax, fileHandle ; 写入文件
mov edx, OFFSET buffer
mov ecx, SIZEOF buffer
call WriteToFile
mov bytesWritten, eax ; 返回写入字符串长度
call CloseFile mWrite <"Bytes written to file [output.txt]: "> ; 显示写入字符串长度
mov eax, bytesWritten
call WriteDec
call Crlf
call WaitMsg mov eax, SIZEOF filename ; 打开文件
mov edx, OFFSET filename
call OpenInputFile
mov fileHandle, eax cmp eax, INVALID_HANDLE_VALUE ; 错误检查
jne file_ok2
mWrite <"Failed to open the file",0dh,0ah>
jmp quit file_ok2:
mov edx, OFFSET buffer ; 读取文件
mov ecx, BUFFER_SIZE
call ReadFromFile
jnc check_buffer_size
mWrite <"Failed to read the file.", 0dh, 0ah>
call WriteWindowsMsg
jmp close_file check_buffer_size: ; 检查是否超出缓冲区大小
cmp eax, BUFFER_SIZE
jb buf_size_ok
mWrite <"Failed to read the file into buffer", 0dh, 0ah>
jmp quit buf_size_ok:
mov buffer[eax], ; insert null terminator
mWrite "File size: "
call WriteDec ; display file size
call Crlf mWrite <"Buffer:",0dh,0ah,0dh,0ah>
mov edx,OFFSET buffer ; display the buffer
call WriteString
call Crlf close_file:
mov eax, fileHandle
call CloseFile quit:
call WaitMsg
exit
main ENDP
END main
《汇编语言 基于x86处理器》第十一章 MS-DOS 编程部分的代码 part 2的更多相关文章
- 《汇编语言 基于x86处理器》第九章字符串与数组部分的代码
▶ 书中第九章的程序,主要讲了字符串相关的输入.输出,以及冒泡排序.二分搜索 ● 代码,Irvine32 中的字符串库函数代码范例 INCLUDE Irvine32.inc .data str1 BY ...
- 《汇编语言 基于x86处理器》第十章结构和宏部分的代码
▶ 书中第十章的程序,主要讲了结构与宏的使用 ● 代码,使用结构,对比是否对齐的性能差距 INCLUDE Irvine32.inc INCLUDE macros.inc structN STRUCT ...
- 《汇编语言 基于x86处理器》第十三章高级语言接口部分的代码 part 2
▶ 书中第十三章的程序,主要讲了汇编语言和 C/++ 相互调用的方法 ● 代码,汇编中调用 C++ 函数 ; subr.asm INCLUDE Irvine32.inc askForInteger P ...
- 《汇编语言 基于x86处理器》前五章的小程序
▶ 书中前五章的几个小程序,基本的运算操作,使用了作者的库 Irvine32 和 Irvine64(一开始以为作者网站过期了,各网站上找到的文件大小都不一样,最后发现是要搭梯子 Orz,顺利下载).注 ...
- 《汇编语言 基于x86处理器》第十二章浮点数部分的代码
▶ 书中第十二章的程序,主要讲了 FPU 的指令和浮点数计算的过程 ● 代码,简单的 32 为浮点数测试 INCLUDE Irvine32.inc INCLUDE macros.inc .data f ...
- 《汇编语言 基于x86处理器》第七章整数运算部分的代码
▶ 书中第七章的程序,使用各种位移运算,加深了对内存.寄存器中整数类型变量存储的认识 ● 代码,双字数组右移 4 位 INCLUDE Irvine32.inc COUNT = ; 右移位数 .data ...
- 《汇编语言 基于x86处理器》第六章条件处理部分的代码
▶ 书中第六章的程序,使用了条件判断和跳转来实现一些功能 ● 代码,查找数组首个非零值 INCLUDE Irvine32.inc .data intArray SWORD , , , , , , , ...
- 《汇编语言 基于x86处理器》第十章 - 运行一个 16位实地址汇编程序
▶ 书上第 10 章,主要讲了宏,引用了一个 16 位实地址的程序,从代码开始到运行 ● 代码 ; main.asm INCLUDE Macros.inc IF IsDefined( RealMode ...
- 《汇编语言 基于x86处理器》第八章高级过程部分的代码 - 两种规范计算数组元素的和
▶ 输入 Count 个 32 位有符号整数,计算他们的和 ● 代码,使用堆栈传参 ;// Sum_main.asm,主过程 INCLUDE Irvine32.inc EXTERN PromptFor ...
随机推荐
- WEKA结果解读
红括号里面,左边是bad的数目,右边是good数目. TP Rate FP Rate Precision Recall F-Measure ROC Area Class 0.536 ...
- 并查集(Union-Find)
常见问题: 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共 ...
- 火狐对SVG的兼容性
使用d3在SVG中画流程图,需要获取流程图的宽,高,来给流程图居中布局.在Chrome中 正常显示,可是在火狐中svg流程图在容器内偏移,查看很不方便.在网上百度了,找不到火狐对d3的兼容性,所以就自 ...
- uoj#272. 【清华集训2016】石家庄的工人阶级队伍比较坚强
http://uoj.ac/problem/272 这题的式子形式是异或卷积的三进制推广,因此可以设计一个类似fwt的变换,这里需要一个三次单位根$w$,满足$w^3\%p==1$且$(1+w+w^2 ...
- C++中的指针与引用的区别与联系
引用与指针实质上都是间接地指代另一个变量,引用相当于该变量的外号或者小名,而指针实质上是指向该变量的地址进而操作该变量 区别1:指针的地址与该变量不同,但引用的地址与该变量相同相同 #include& ...
- Hive格式各种格式下不同压缩算法的比较
原始Text格式的hive分区大小为119.2G. 压缩算法 Text格式 Parquet格式 ORC RCFile 不压缩 119.2G 54.1G 20.0G 98G Snappy压缩 30.2 ...
- 继续循环continue
继续循环continue continue的作用是仅仅跳过本次循环,而整个循环体继续执行. 语句结构: for(初始条件;判断条件;循环后条件值更新) { if(特殊情况) { continue; } ...
- 运用PowerDesigner的反向工程,可以导入SQL脚本,从而生成物理模型
运用PowerDesigner的反向工程,可以导入SQL脚本,从而生成物理模型.方法/步骤 首先打开PowerDesigner,点击左上角“File”—>"Reverse Engine ...
- PHP中的static的理解
静态方法 (1)静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性: (2)从当前类(不是子类)中访问静态方法或属性,可以使用 self 关键字,self 指向当前类,就 ...
- centos7 搭建DHCP服务器
一.DHCP简单讲解 DHCP就是动态主机配置协议(Dynamic Host Configuration Protocol)是一种基于UDP协议且仅限用于局域网的网络协议,它的目的就是为了减轻TCP/ ...