很简单的问题吧!第一次提问,希望大家能够帮助我。

ProgrameMan 2006-11-29 10:29:31
下面的程序在DOS下使用NASM编译器编译;

MAIN:
MOV DL, [DATA] ; 问题1
JMP PRINT
RET

PRINT:
MOV AH, 09H ; Function Num
MOV AL, DL ; Char
MOV BH, 0H ; Page Num
MOV BL, 0CH ; Color
MOV CX, 3 ; Print Count
INT 10H ; Call Bios INT
RET

DATA db 0x41,0x42,0x43 ; 'A' ,'B','C'

问题1: DL中为什么不是 0x41 而是DATA的地址呢,我想得到DATA中的数据要怎样做呢?
问题2: 声明一个10个大小的字符数组如何做呢?
问题3: 为什么将 DATA 的声明移到文件的头部就异常退出呢?

...全文
552 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProgrameMan 2006-12-04
  • 打赏
  • 举报
回复
zoologist(王朝) ( )

呵呵 开玩笑吧

chen01234()

呵呵 你的代码片断是摘自一本书吧 呵呵

谁呢解释清楚呢,拜托各位大虾
zoologist 2006-12-04
  • 打赏
  • 举报
回复
to ProgrameMan(我要学汇编)

怎么生成exe我还没有搞清楚呢。哈哈~

to chen01234

我主要是针对nasm的资料缺陷说的,nasm资料太少了。好像

国内还没有正式出版的nasm教材吧?并且,nasm有些细节和masm

不兼容,这样给资料参考上带来很大困扰~
chen01234 2006-12-04
  • 打赏
  • 举报
回复
ProgrameMan(我要学汇编)

我也是这么想的..呵呵 我Q109719715

ProgrameMan 2006-12-04
  • 打赏
  • 举报
回复
那位老大建个群,喜欢的人一起上去聊聊,或者一起做一个小的开源的操作系统也行啊(只为学习可不是为了和其他操作系统比,这样在实际中学习才够快)
zoologist 2006-12-04
  • 打赏
  • 举报
回复
哦,那本书我看过。很不错,不过那本书涉及的知识足够再写一本

<自己动手写操作系统 导读>了。

ps:我已经找到了用bochs调试保护模式程序(exe文件)的方法了。

具体资料正在整理中......
ProgrameMan 2006-12-04
  • 打赏
  • 举报
回复
chen01234()

哈哈,有意思,偶也是啊,一块学吧
chen01234 2006-12-04
  • 打赏
  • 举报
回复
ProgrameMan(我要学汇编)
是吖..是<自己动手写操作系统>,现在还在继续...
不然我还不晓得有NASM的..呵呵!
学习中...流鼻血了//
chen01234 2006-12-03
  • 打赏
  • 举报
回复
;%define _DEBUG_ ;这个是方便在DOS调试生成 .com文件,先去掉那个冒号.命令是:nasm 文件名.asm -o 文件 名.com
%ifdef _DEBUG_
org 0100h
%else
org 07c00h ;这个是你的程序加载到07c00,并开始执行
%endif
我也直接学NASM,又不拿汇编太复杂的工作,学的太深了对自己是困饶????
ProgrameMan 2006-12-03
  • 打赏
  • 举报
回复
打错了,是

可是如果去掉 ORG 0x100 并且生成 .exe 结果就又不对了
ProgrameMan 2006-12-03
  • 打赏
  • 举报
回复
可是如果不去掉 ORG 0x100 并且生成 .exe 结果就又不对了
大熊猫侯佩 2006-12-03
  • 打赏
  • 举报
回复
为什么非得是 com 不能是 exe 呢

看你代码的实际定义布局,比如定义了oRG100
ProgrameMan 2006-12-03
  • 打赏
  • 举报
回复
首先谢谢楼上各位


zoologist(王朝)

为什么非得是 com 不能是 exe 呢
zoologist 2006-12-03
  • 打赏
  • 举报
回复
编译方法: nasm -f bin -o 1.com 1.asm

[org 0x100] ; was 0 in genuine code
[bits 16]
jmp start16
data:
var db 0x41 ; 'a'

start16:
code:
mov ax, cs
mov ds, ax

mov dl, [var]
call print
mov ax,4c00h
int 21h
ret

print:
mov ah, 09h ; function num
mov al, dl ; char
mov bh, 0h ; page num
mov bl, 0ch ; color
mov cx, 3 ; print count
int 10h ; call bios int
ret
codeend

ps:nasm和masm很多地方是相反的,如果你没有特别学要

最好不要学习nasm,或者等到masm学会了再用nasm.

nasm中文资料特别少。
chen01234 2006-12-03
  • 打赏
  • 举报
回复
建议你去看下http://post.baidu.com/f?kz=19442204 NASM手则

问题1: DL中为什么不是 0x41 而是DATA的地址呢,我想得到DATA中的数据要怎样做呢?
mov ax, data
mov bp, ax
;;;;;;;;;;;;;;;;;;;;;;;;

问题2: 声明一个10个大小的字符数组如何做呢?
times:重复指令或数据.....
data: times 10 db 0
如果是把DATA放进数据区是这样的.
section是用来定义段的...
我也刚学了.我恨编程.因为我都不知道该怎么去爱她了..


chen01234 2006-12-03
  • 打赏
  • 举报
回复
顶一下.我也想晓得答案..THINKING..
ProgrameMan 2006-12-01
  • 打赏
  • 举报
回复
顶一下,各位老大帮忙啊
epoll 2006-12-01
  • 打赏
  • 举报
回复
呵呵 还没解决啊
ProgrameMan 2006-11-30
  • 打赏
  • 举报
回复
我使用的是 NASM 不是 MASM
ProgrameMan 2006-11-30
  • 打赏
  • 举报
回复
nasm 不支持 ASSUME 的吧

nasm 支持

DATA SEGMENT
A1 DB ‘ABC’
A2 DB 10 DUP(?);定义了一个10个大小的DB类型的数组
DATA ENDS
symxaz 2006-11-30
  • 打赏
  • 举报
回复
DATA SEGMENT
A1 DB ‘ABC’
A2 DB 10 DUP(?);定义了一个10个大小的DB类型的数组
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET A1
MOV AH,09H
INT 21H
其他的就按你自己写的PRINT中的差不多了
加载更多回复(11)

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧