▶ 书中第十一章的程序,主要讲了 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的更多相关文章

  1. 《汇编语言 基于x86处理器》第九章字符串与数组部分的代码

    ▶ 书中第九章的程序,主要讲了字符串相关的输入.输出,以及冒泡排序.二分搜索 ● 代码,Irvine32 中的字符串库函数代码范例 INCLUDE Irvine32.inc .data str1 BY ...

  2. 《汇编语言 基于x86处理器》第十章结构和宏部分的代码

    ▶ 书中第十章的程序,主要讲了结构与宏的使用 ● 代码,使用结构,对比是否对齐的性能差距 INCLUDE Irvine32.inc INCLUDE macros.inc structN STRUCT ...

  3. 《汇编语言 基于x86处理器》第十三章高级语言接口部分的代码 part 2

    ▶ 书中第十三章的程序,主要讲了汇编语言和 C/++ 相互调用的方法 ● 代码,汇编中调用 C++ 函数 ; subr.asm INCLUDE Irvine32.inc askForInteger P ...

  4. 《汇编语言 基于x86处理器》前五章的小程序

    ▶ 书中前五章的几个小程序,基本的运算操作,使用了作者的库 Irvine32 和 Irvine64(一开始以为作者网站过期了,各网站上找到的文件大小都不一样,最后发现是要搭梯子 Orz,顺利下载).注 ...

  5. 《汇编语言 基于x86处理器》第十二章浮点数部分的代码

    ▶ 书中第十二章的程序,主要讲了 FPU 的指令和浮点数计算的过程 ● 代码,简单的 32 为浮点数测试 INCLUDE Irvine32.inc INCLUDE macros.inc .data f ...

  6. 《汇编语言 基于x86处理器》第七章整数运算部分的代码

    ▶ 书中第七章的程序,使用各种位移运算,加深了对内存.寄存器中整数类型变量存储的认识 ● 代码,双字数组右移 4 位 INCLUDE Irvine32.inc COUNT = ; 右移位数 .data ...

  7. 《汇编语言 基于x86处理器》第六章条件处理部分的代码

    ▶ 书中第六章的程序,使用了条件判断和跳转来实现一些功能 ● 代码,查找数组首个非零值 INCLUDE Irvine32.inc .data intArray SWORD , , , , , , , ...

  8. 《汇编语言 基于x86处理器》第十章 - 运行一个 16位实地址汇编程序

    ▶ 书上第 10 章,主要讲了宏,引用了一个 16 位实地址的程序,从代码开始到运行 ● 代码 ; main.asm INCLUDE Macros.inc IF IsDefined( RealMode ...

  9. 《汇编语言 基于x86处理器》第八章高级过程部分的代码 - 两种规范计算数组元素的和

    ▶ 输入 Count 个 32 位有符号整数,计算他们的和 ● 代码,使用堆栈传参 ;// Sum_main.asm,主过程 INCLUDE Irvine32.inc EXTERN PromptFor ...

随机推荐

  1. 1.linux6 x86-64 RPM包安装mysql5.7.20

    注意版本和此次更新时间 2017-12-03  版本:mysql-5.7.20-1.el6.x86_64  环境:linux6.x ​官方下载地址: wget https://dev.mysql.co ...

  2. <亲测>CentOS7 安装mysql8.0(YUM方式)

    CentOS7 安装mysql(YUM方式)   1.下载mysql源安装包 shell> wget http://dev.mysql.com/get/mysql80-community-rel ...

  3. Maven 专题

    目录: Maven的安装 Eclipse安装Maven插件 Nexus私服搭建 Maven+Nexus配置 发布自己的构件(至Nexus) 创建maven多模块工程group 整理中[...] 先放一 ...

  4. RPM安装MYSQL5.7

    RPM安装MYSQL5.7 1:YUM安装依赖库 yum install perl libaio numactl 2:下载安装需要的RPM包 https://dev.mysql.com/get/Dow ...

  5. centos6.9安装oracle11g

    感谢强哥的文档 源文档链接 https://www.qstack.com.cn/archives/68.html #------------------------------------------ ...

  6. Scrapy实战篇(八)之Scrapy对接selenium爬取京东商城商品数据

    本篇目标:我们以爬取京东商城商品数据为例,展示Scrapy框架对接selenium爬取京东商城商品数据. 背景: 京东商城页面为js动态加载页面,直接使用request请求,无法得到我们想要的商品数据 ...

  7. [UE4]Visiblity、Render Opacity

    Visiblity 1.Visible 默认是visible,可见,并且可响应事件(如点击事件) 2.Collapsed 不可见.不响应事件.不占用容器空间 3.Hidden 不可见,不响应事件,但占 ...

  8. 【架构师之路】集群/分布式环境下5种session处理策略

    [架构师之路]集群/分布式环境下5种session处理策略   转自:http://www.cnblogs.com/jhli/p/6557929.html 在搭建完集群环境后,不得不考虑的一个问题就是 ...

  9. F5负载均衡原理(转载)

    https://blog.csdn.net/panxueji/article/details/42647193 一. 负载均衡技术 负载均衡技术在现有网络结构之上提供了一种廉价.有效.透明的方法,来扩 ...

  10. MySQL 8.0的关系数据库新特性详解

    前言 MySQL 8.0 当前的最新版本是 8.0.4 rc,估计正式版本出来也快了.本文介绍几个 8.0 在关系数据库方面的主要新特性. 你可能已经知道 MySQL 从版本 5.7 开始提供了 No ...