用汇编如何象c语言那样分配内存?

发布于 2022-07-27 20:43:26 字数 26 浏览 18 评论 3

比如要设计链表,需要动态分配内存,在汇编下如何实现?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

衣神在巴黎 2022-07-28 03:35:03

汇编里边还是用栈方便, 省去调系统调用的麻烦

夜深人未静 2022-07-27 22:42:52

懂了,是通过系统调用。在Linux下,用brk():
brk:brk() 是一个非常简单的系统调用。还记得系统中断点吗?该位置是进程映射的内存边界。brk() 只是简单地将这个位置向前或者向后移动,就可以向进程添加内存或者从进程取走内存。

小帐篷 2022-07-27 22:08:01

原帖由 TAW 于 2006-10-28 20:53 发表
比如要设计链表,需要动态分配内存,在汇编下如何实现?

>>
>>
>>刚看来的,不知道是否有帮助:
>>
>>
.386

_TEXT segment 'CODE'

assume ds:_TEXT

org 100h

start:
mov bx, offset l_end ; 程序的最后
add bx, 0fh ; 向上取整到节
shr bx, 4 ; bytes -> para.s
mov ah, 4ah ; 调整内存分配
int 21h ; es 指向了 psp 不需设置了
push ds
mov ax, 40h
mov ds, ax ; ds 指向 0040 bios 数据区
mov ax, ds:[4eh] ; 当前显示页的起始偏址
mov vidBuf, ax
mov ax, ds:[4ah] ; 当前屏幕的列数
xor bx, bx
mov bl, ds:[84h] ; 屏幕行数减 1
inc bl
mul bx
mov cs:iLength, ax ; 屏幕上的总的字符数
shl ax, 1 ; 每个字符占两个字节
add ax, 0fh ; 向上取整到节
shr ax, 4 ; 字节 -> 节
mov bx, ax
mov ah, 48h ; 为屏幕保存分配内存
int 21h
pop ds
jc l_errAllocMem ; 失败, 转走
mov cx, iLength ; 待保存的字符数
mov savSeg, ax ; 保存该段址
mov es, ax ; 保存的屏幕的内存的段址
mov ax, 0b800h ; 指向视频缓冲区, 段址
mov si, vidBuf ; 视频缓冲区偏址
mov ds, ax
xor di, di ; 保存的屏幕的内容的偏址, 由 0 始
cld
rep movsw ; 保存屏幕上的原来的内容
mov ax, ds
mov es, ax ; es 指向 B800 视频缓冲区, 段址
mov ax, cs
mov ds, ax ; ds 重新指向自己
l_fillscr:
mov cx, iLength
xor di, di
mov al, char2Fill ; 用来填充屏幕的字符
mov ah, attr2Fill ; 相应的字符的属性
rep stosw ; 填充屏幕
l_waitkey:
mov ah, 0
int 16h ; 等待键盘输入
cmp al, 1bh ; <Esc> ?
je l_restscr ; yes, 转去恢复屏幕
cmp ah, 49h ; <PgUp> ?
je l_upchar ; yes, 转去上升字符
cmp ah, 51h ; <PgDn> ?
je l_dnchar ; yes, 转去递减字符
cmp ah, 48h ; <Up> ?
je l_upColor ; yes, 转去上升字符颜色
cmp ah, 50h ; <Down> ?
je l_dnColor ; yes, 转去递减字符颜色
cmp ah, 4bh ; <Left> ?
je l_dnBkcolor ; yes, 转去递减字符背景色
cmp ah, 4dh ; <Right> ?
jne l_waitkey ; no, 转去继续等待按键
l_upBkcolor:
mov al, attr2Fill
shr al, 4
inc al
and al, 0fh
and attr2Fill, 0fh
shl al, 4
or attr2fill, al
jmp l_fillscr

l_dnBkcolor:
mov al, attr2Fill
shr al, 4
dec al
and al, 0fh
and attr2Fill, 0fh
shl al, 4
or attr2fill, al
jmp l_fillscr

l_upColor:
mov al, attr2Fill
inc al
and al, 0fh
and attr2Fill, 0f0h
or attr2fill, al
jmp l_fillscr

l_dnColor:
mov al, attr2Fill
dec al
and al, 0fh
and attr2Fill, 0f0h
or attr2fill, al
jmp l_fillscr

l_upchar:
mov al, char2Fill
inc char2Fill
cmp al, 'Z'
jne l_fillscr
mov char2Fill, 'A'
jmp l_fillscr

l_dnchar:
mov al, char2Fill
dec char2Fill
cmp al, 'A'
jne l_fillscr
mov char2Fill, 'Z'
jmp l_fillscr

l_restscr:
mov cx, iLength
mov di, vidBuf
mov ax, savSeg
mov ds, ax
xor si, si
rep movsw
l_freemem:
mov ax, ds
mov es, ax
mov ah, 49h
int 21h ; 释放刚申请的用于保存屏幕的内存块
xor al, al

l_exit:
mov ah, 4ch
int 21h ; 程序结束, 返回到 DOS

l_errAllocMem:
push ax
mov ah, 9
mov dx, offset errAllocMem
int 21h ; 显示分配内存失败信息
pop ax ; 分配出错的错误代码在 AL 中
jmp l_exit

iLength dw 0
savSeg dw 0
char2Fill db 'A'
attr2Fill db 017h
vidBuf dw 0
errAllocMem db 'Error occurred while allocating memory for screen saving!', '$'

l_end = $

_TEXT ends

end start

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文