《汇编语言 基于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 ...
随机推荐
- sublime text2+Ctags+Cscope替代Source Insight
说明:以Windows系统下查看C++代码为例.因为Source Insight(以下简称SI)是收费软件,且界面丑陋,所以考虑其替代方案,发现Sublime Text3(以下简称ST3) + Cta ...
- web前端性能调优(一)
最近2个月一直在做手机端和电视端开发,开发的过程遇到过各种坑.弄到快元旦了,终于把上线了.2个月干下来满满的的辛苦,没有那么忙了自己准备把前端的性能调优总结以下,以方便以后自己再次使用到的时候得于得心 ...
- 让WebBrowser在非兼容模式下运行
32 bit: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_ ...
- x230安装黑苹果
https://forum.51nb.com/forum.php?mod=viewthread&tid=1802786&extra=page%3D1&page=1 下载 主要就 ...
- Osip2和eXosip协议栈的简析
Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高. eXosip是Osip2的一个扩展协议集,它部分封装 ...
- jquery tr:even,tr:eq(),tr:nth-child()区别
jquery里面是不是搞不清楚,tr的选择器? $("tr:even"),$("tr:eq(2)"),$("tr:eq(3)"),$(&qu ...
- Oracle 故障整理
#created at 18-10-28 by nod #提示磁盘空间已满 不能登录数据库 18-10-28 [oracle@oracle ~]$ sqlplus / as sysdba SQL*Pl ...
- qsort实现结构体数组排序
要注意强制转换 #include <stdio.h> #include <stdlib.h> typedef struct{ int num; char name[20]; f ...
- cnn进行端到端的验证码识别改进
keras_cnn.py 训练及建模 #!/usr/bin/env python # coding=utf- """ 利用keras cnn进行端到端的验证码识别, 简单 ...
- VRRP、Track与NQA联动配置举例(Master监视上行链路)
原文 http://www.h3c.com/cn/d_201708/1018729_30005_0.htm#_Toc488338729 1. 组网需求 Host A需要访问Internet上的Host ...