4ch 和 4c00h 的区别?

代码修行者 2012-03-17 10:38:37
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
d segment
db 0,0,0,0,0,0,0,0
d ends
code segment
start: mov ax,a
mov ds,ax ;定义A段地址
mov ax,d
mov es,ax ;定义c段地址
mov bx,0 ;BX=0
mov cx,8 ;循环8次
s:mov al,ds:[bx]
mov es:[bx],al
inc bx
loop s ;依次将A段数据移入C段
mov ax,b
mov ds,ax ;定义B段地址
mov ax,d
mov es,ax ;定义C段地址
mov bx,0 ;BX=0
mov cx,8 ;循环8次
s0:mov al,ds:[bx]
add es:[bx],al
inc bx
loop s0 ;依次将B段数据加入C段
mov ax,4c00h 如果将其改为 4ch 用 msam(编译器)能生成exe文件 但是不能执行
int 21h
code ends


可是其他的程序 用4ch能执行,请问这是怎么回事啊?
...全文
1424 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshiaqwu 2012-04-26
  • 打赏
  • 举报
回复
大哥,子程序号使用ah来传递的。所以用4c00h,00是给了al。
zhao0829wang 2012-03-30
  • 打赏
  • 举报
回复
功能调用的出口参数在AH中,和AL没关系,所以AX=4C00H和AH=4CH一样..
zhao0829wang 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

是DOS的中断调用
通过给AH寄存器赋值4CH,然后调用INT 21H指令,计算机就会根据AH寄存器中的值执行相应的操作,其中4CH是返回DOS系统,还可给AH寄存器赋其他值。

调用DOS 4CH功能
格式:
MOV AH 4CH
INT 21H
终止当前程序运行,把控制权交给调用程序,即返回给DOS系统.

4CH和400CH都不是一个数,DOS没有这个功能调用把.
[/Quote]
这个弄错了. AH=4C,AL=00H和AX=4C00H 一样,都是将AH设置为4CH
zhao0829wang 2012-03-30
  • 打赏
  • 举报
回复
是DOS的中断调用
通过给AH寄存器赋值4CH,然后调用INT 21H指令,计算机就会根据AH寄存器中的值执行相应的操作,其中4CH是返回DOS系统,还可给AH寄存器赋其他值。

调用DOS 4CH功能
格式:
MOV AH 4CH
INT 21H
终止当前程序运行,把控制权交给调用程序,即返回给DOS系统.

4CH和400CH都不是一个数,DOS没有这个功能调用把.
bulijun1987 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用楼主 aszt123 的回复:
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
d segment
db 0,0,0,0,0,0,0,0
d ends
code segment
start: mov ……


你要保证int 21h 中的功……
[/Quote]
很深刻啊
yh_no_code 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 aszt123 的回复:]
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
d segment
db 0,0,0,0,0,0,0,0
d ends
code segment
start: mov ……
[/Quote]

你要保证int 21h 中的功能号要是4ch(也就是ah要为4ch),如果改为 mov ax,4ch 那么ah=0,al=4c
此时你调用的是int21h的0号功能,相当于调用int 20h功能中断,而不是4ch号功能。你可能会问此时0号功能也是终止程序,为什么会出错呢?那么你需要去看看有关程序段前缀PSP的资料。其实在早先也是20h号中断终止程序(com文件)。但是前提是CS中包含了PSP的段值。对于exe的文件来说代码段与PSP不是同一个段,所以在调用的时候出错。


很久没有上论坛了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
苹果皮 2012-03-20
  • 打赏
  • 举报
回复
mov ax,4c00H
ax->4c00H

mov ax,4cH
ax->004cH
苹果皮 2012-03-20
  • 打赏
  • 举报
回复
mov ax,4c00H
ax->4c00H

mov ax,4cH
ax->004cH
leetow2003 2012-03-19
  • 打赏
  • 举报
回复
mov ax,4ch
就变成了:mov ah,0
以及mov al,4ch
所以不是mov ah,4ch
就不能正常退出了
s11ss 2012-03-19
  • 打赏
  • 举报
回复
mov ax,4ch

这里的4ch实际上是004ch,即ah=0, al=4ch
而正确的赋值应当是ah=4ch, al=0;ah表示功能号,al在这里表示程序的返回值
代码修行者 2012-03-17
  • 打赏
  • 举报
回复
那个 mov ax,4ch
int 21h
打错了
代码修行者 2012-03-17
  • 打赏
  • 举报
回复
谢谢,改为ah是对的
可是
assume cs:code
a segment
dw 1,2,3
a ends
b segment
dw 0,0,0
b ends
code segment
start: mov ax,200h
mov ss,ax
mov sp,6
mov ax,a
mov ds,ax
mov bx,0
mov cx,3
s: push ds:[bx]
add bx,2
loop s
mov ax,4ch int 21h 为什么可以呢。
code ends
end start
masmaster 2012-03-17
  • 打赏
  • 举报
回复
mov ah,4ch
int 21h

21,458

社区成员

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

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