Assembly 我们为什么这么做,推cs pop es?
我说的是16位8086(Nasm)。我能理解完整的代码,但我不明白为什么我们要这么做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
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。