Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 我们为什么这么做,推cs pop es?_Assembly_Nasm_X86 16 - Fatal编程技术网

Assembly 我们为什么这么做,推cs pop es?

Assembly 我们为什么这么做,推cs pop es?,assembly,nasm,x86-16,Assembly,Nasm,X86 16,我说的是16位8086(Nasm)。我能理解完整的代码,但我不明白为什么我们要这么做 push cs pop es 在下面的代码中 ; print string using bios service [org 0x0100] jmp start message: db 'Hello World' start: mov ah, 0x13 ; service 13 - print string mov al, 1 ; subservice 01 – update cursor mov bh, 0

我说的是16位8086(Nasm)。我能理解完整的代码,但我不明白为什么我们要这么做

push cs 
pop es
在下面的代码中

; print string using bios service
[org 0x0100]
jmp start
message: db 'Hello World'
start: mov ah, 0x13 ; service 13 - print string
mov al, 1 ; subservice 01 – update cursor
mov bh, 0 ; output on page 0
mov bl, 7 ; normal attrib
mov dx, 0x0A03 ; row 10 column 3
mov cx, 11 ; length of string

;******************
push cs
pop es ; segment of string
;******************

mov bp, message ; offset of string
int 0x10 ; call BIOS video service
mov ax, 0x4c00 ; terminate program
int 0x21

cs是一个段寄存器,它指向运行的代码所在的段


由于字符串位于代码段中,因此需要将该段传递给调用的int 0x10。

cs是段寄存器,它指向运行的代码所在的段

由于字符串位于代码段中,因此需要将该段传递给调用的int 0x10。

因为

mov ES,CS
不是有效的指令,代码要求ES=CS。

因为

mov ES,CS

不是有效的指令,代码要求ES=CS。

您不需要对.com文件执行此操作-DOS加载一个.com文件,其中segregs设置为我们的唯一段。没有它会发生什么?@FrankKotler:true-在这个特殊情况下CS=ES=DS,因为它是一个
.com
文件。但是,一般来说,由于段寄存器之间没有直接移动指令,因此这是一种实现方法。此外,它还起到了“安全咒语”的作用——在这种情况下没有必要,但如果您使用了
ES
寄存器,这会将其还原为
.com
的假定值,即使是.com文件代码也可以寻址位于不同段中的视频RAM。您不需要对.com文件执行此操作-DOS加载一个.com文件,其中segregs设置为我们的唯一段。没有它会发生什么?@FrankKotler:true-在这个特殊情况下CS=ES=DS,因为它是一个
.com
文件。但是,一般来说,由于段寄存器之间没有直接移动指令,因此这是一种实现方法。此外,它还起到了“安全咒语”的作用——在这种情况下没有必要,但如果您使用了
ES
寄存器,这会将它恢复为
.com
的假定值,即使是.com文件代码也可以寻址位于不同段中的视频RAM。