【发布时间】:2019-05-23 20:57:32
【问题描述】:
在 stackoverflow 上找到此代码,我了解它的工作原理并尝试实现它。它在 INT 1AH 指令处崩溃,我不知道为什么。 当我在 ollydbg 中运行它时,它停在同一行。
我还尝试了随机数生成器函数 rand(void),但每当我重新运行代码时,它总是给我相同的数字。 (如果我连续调用 3 次不同的 3 个数字,但每次重播仍然是相同的)
.386
.model flat, stdcall
includelib msvcrt.lib
extern exit: proc
extern printf: proc
extern rand: proc
public start
.data
decimal_format DB "%d",0ah
.code
start:
mov ah, 00h
int 1ah
mov ax,dx
mov dx,0
mov cx,10
div cx
mov ah,2h
int 21h
push edx
push offset decimal_format
call printf
add esp,8
push 0
call exit
end start
【问题讨论】:
-
当您尝试
rand时,您是否首先使用srand为生成器播种?你是在 DOS 模拟器中运行的吗? -
旧的 BIOS 中断(如 int 1Ah)只能在 16 位实模式代码中工作。它没有 .flat 内存模型。因此,您肯定将其构建为 32 位程序,当您使用 int 时,这会立即死亡。
-
您调用播种机
srand一次,然后连续调用rand以生成随机数。查看rand的文档。 -
我同意 Hans 和 Lurker 的观点,尽管我对标签感到困惑。显然,您正在混合 32 位 Windows 代码和 DOS 代码,这将失败。但是,您使用了
[x86-16]标记,这表明您正在尝试创建 16 位程序。所以我会问这个。您是在尝试开发可以在 MSDOS 上运行的 16 位 DOS 应用程序,还是在尝试创建 32 位 Win32 应用程序?您提到建议 Windows 应用程序的 Ollydbg。[x86-16]标签有误吗? -
介绍性 CS 课程真的不应该教如何编写汇编语言 MS-DOS 程序。它没有帮助学生为任何实际使用的汇编做好准备(比如矢量化关键循环或编写设备驱动程序),它看起来不像现代程序中的
asm过程或以任何方式让学生准备写一个,它对任何实际目的都没有用,它甚至不比现代 ISA 简单。
标签: winapi assembly x86 masm msvcrt